Redis 监听过期的 key 事件

Redis从2.8.0版本后,推出 Keyspace Notifications 特性。
Keyspace Notifications 此特性允许客户端可以以 订阅/发布(Sub/Pub)模式,接收那些对数据库中的键和值有影响的操作事件。

Redis 目前的订阅与发布功能采取的是发送即忘(fire and forget)策略, 如果程序需要可靠事件通知, 那么目前的键空间通知可能不适合:当订阅事件的客户端断线时, 它会丢失所有在断线期间分发给它的事件。并不能确保消息送达。

推荐:https://blog.csdn.net/zhu_tianwei/article/details/80169900

一、使用发布订阅测试

1)在 redis.conf 设置

notify-keyspace-events Ex

# x代表过期

2)重启 redis

/etc/init.d/redis restart

2)开启 redis-cli 等待过期key的通知

PSUBSCRIBE __keyevent@0__:expired         

# PSUBSCRIBE 命令订阅一个或多个符合给定模式的频道,0代表数据库0

3)在另一个 redis-cli 中设置一个10秒后过期的key

setex test 10 123

4)10秒过期后在 订阅中能看到对应的 key 信息

二、Php 代码测试实现

1)redis_setex.php

connect("127.0.0.1", 6379);

$redis->setex("test", 10, 123);

2)redis_listen.php

connect("127.0.0.1", 6379);

$redis->psubscribe(array('__keyevent@0__:expired'), 'keyCallback');

function keyCallback($redis, $pattern, $channel, $message) {
    echo "Pattern : $pattern\n";
    echo "Channel : $channel\n";
    echo "Message : $message\n";
}

3)启动 redis_listen.php 进行监听,然后 启动 redis_setex.php 设置 10 秒的key

php redis_listen.php

php redis_setex.php

// 输出:
// Pattern : __keyevent@0__:expired
// Channel : __keyevent@0__:expired
// Message : test

4)可以将 redis_listen 设置为 nohup 启动(Linux守护进程)

nohup php redis_listen.php &

# 后台守护进程执行,输出结果会输出在 nohup.out 文件上
ps                  # 通过ps命令可以查看到php的守护进程号

 

你可能感兴趣的:(Php,Redis)