Redis 键空间通知

因为开启键空间通知功能需要消耗一些 CPU , 所以在默认配置下, 该功能处于关闭状态。可以通过修改 redis.conf 文件, 或者直接使用 CONFIG SET 命令来开启或关闭键空间通知功能:当 notify-keyspace-events 选项的参数为空字符串时,功能关闭。另一方面,当参数不是空字符串时,功能开启。notify-keyspace-events 的参数可以是以下字符的任意组合, 它指定了服务器该发送哪些类型的通知:

具体配置,首先找到redis.conf配置文件,打开文件,查找notify-keyspace-events,将前面的#去掉即可。配置完成重启redis-server

notify-keyspace-events "Ex"

注意:这里配置的是notify-keyspace-events的Ex参数,即说明,当键过期的时候会触发通知,如果只需要哈希命令键触发通知则可以设置为notify-keyspace-events Eh。

命令行 开启一个终端,redis-cli 进入 redis 。开始订阅所有操作,等待接收消息。

127.0.0.1:6379> psubscribe __keyevent@0__:expired  
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "__keyevent@0__:expired"
3) (integer) 1

再开启一个终端,redis-cli 进入 redis,新增一个3秒过期的键

127.0.0.1:6379> SETEX username 3 test1
OK
127.0.0.1:6379> get username
"test1"
127.0.0.1:6379> TTL username
(integer) 2
127.0.0.1:6379> 

另外一边执行了阻塞订阅操作后的终端,过期后有如下信息输出:

127.0.0.1:6379> psubscribe __keyevent@0__:expired  
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "__keyevent@0__:expired"
3) (integer) 1
1) "pmessage"
2) "__keyevent@0__:expired"
3) "__keyevent@0__:expired"
4) "username"

php代码示例

<?php
declare(strict_types=1);

class RedisConn
{
    private Redis $redis;

    public function __construct(string $host = '127.0.0.1', int $port = 6379)
    {
        $this->redis = new Redis();
        $this->redis->connect($host, $port);
    }

    public function expire($key = null, int $time = 0)
    {
        return $this->redis->expire($key, $time);
    }

    public function psubscribe($callback, array $patterns = [])
    {
        $this->redis->psubscribe($patterns, $callback);
    }
    public function setOption()
    {
        $this->redis->setOption(\Redis::OPT_READ_TIMEOUT, -1);
    }
}

使用

$redis = new \RedisConn();
$redis->setOption();
$redis->psubscribe(function ($redis, $pattern, $channel, $msg){
    echo 'Pattern:' . $pattern .PHP_EOL;
    echo 'Channel:' . $channel .PHP_EOL;
    echo 'Message:' . $msg .PHP_EOL;
}, ['__keyevent@0__:expired']);

发布事件

127.0.0.1:6379> SETEX username 3 test1
OK
127.0.0.1:6379> SETEX username2 5 test2
OK
127.0.0.1:6379> SETEX username3 5 test3

运行psubscribe.php 观察订阅状态 php xxxx.php

Pattern:__keyevent@0__:expired
Channel:__keyevent@0__:expired
Message:username
Pattern:__keyevent@0__:expired
Channel:__keyevent@0__:expired
Message:username2
Pattern:__keyevent@0__:expired
Channel:__keyevent@0__:expired
Message:username3
posted @ 2024-06-27 09:38  朝阳1  阅读(321)  评论(0)    收藏  举报