开发让给redis集群加个key过期通知的配置;
特此了解这个配置;
redis事件通知(notify-keyspace-events Ex);
Keyspace通知使客户端可以通过订阅频道来接收那些以某种方式改动了Redis数据集的事件;
(触发某些事件后可以向指定的频道发送通知)该功能需 Redis版本大于2.8;
参数可以是以下字符的任意组合,它指定了服务器该发送哪些类型的通知:
//字符 发送的通知
K 键空间通知,所有通知以__keyspace@<db>__ 为前缀
E 键事件通知,所有通知以 __keyevent@<db>__ 为前缀 //key通知
g DEL 、 EXPIRE 、 RENAME 等类型无关的通用命令的通知
$ 字符串命令的通知
l 列表命令的通知
s 集合命令的通知
h 哈希命令的通知
z 有序集合命令的通知
x 过期事件,每当有过期键被删除时发送
e 驱逐事件,每当有键因为maxmemory政策而被删除时发送
A 参数 g$lshzxe 的别名
#redis.conf
notify-keyspace-events Ex
//查看及设置临时性的
config get notify-keyspace-events
config set notify-keyspace-events Ex
通过 redis-cli也可以实现 :
127.0.0.1:6379> PSUBSCRIBE __keyevent@0__:expired
订阅事件;
以下是通过php代码实现;
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Redis as Redis;
/**
* Class RedisExpireListen
* @package App\Console\Commands
* @author shidatuo
* @description redis过期事件监听
*/
class RedisExpireListen extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'redis:expire';
/**
* The console command description.
*
* @var string
*/
protected $description = 'redis过期事件监听';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
ini_set('default_socket_timeout', -1);
// 获取redis库
$cache_db = config('database.redis.default.database');
$pattern = '__keyevent@'.$cache_db.'__:expired';
// 订阅事件回调
Redis::subscribe([$pattern], function ($message,$channel)
{
dump($message);
dump($channel);
});
}
}
redis 添加个20秒的key
127.0.0.1:6379> SETEX name4 20 4
OK
127.0.0.1:6379>
控制台打印redis的key过期信息
D:\vbox\niapi>php artisan redis:expire
"name4"
"__keyevent@0__:expired"
小结 , 期间遇到的坑 :
1. Laravel8设置REDIS_PREFIX后订阅消息无效 ?
我设置了Laravel的REDIS_PREFIX=test_prefix_,
它在存储key的时候确实自动转化为了test_prefix_key的格式,
但我也因此不能在应用中使用redis的订阅功能。我将REDIS_PREFIX改为等于空,
则应用中的订阅也能正常工作
2. redis连接超时问题 ?
将redis配置项 read_write_timeout 设置成 -1
ini_set('default_socket_timeout', -1);
本文为史大坨原创文章,转载无需和我联系,但请注明来自史大坨博客https://www.shidatuos.cn