一.需求

在redis中,设置好key和生存时间之后,希望key过期被删除时能够及时的发送一个通知告诉我key,以便我做后续的一些操作.

二.环境

系统:windows10  php:7.1  redis:3.2

三.redis

键空间通知: redis官方文档 、redis中文文档

redis2.8.0版本之后推出了键空间通知,如何使用呢?当redis的key被删除时,redis会发送两种不同类型的事件,特定的事件会往特定的频道发送通知,我们只要订阅这个特定的频道等待通知即可.

两种事件通知:

PUBLISH __keyspace@0__:mykey del
PUBLISH __keyevent@0__:del mykey

keyspace为前缀的频道被称为键空间通知(key-space notification),订阅这个频道 __keyspace@0__:mykey,可以接收0号数据库中所有修改键 mykey 的事件,订阅者将接收到被执行的事件的名字,就是 del;

而以keyevent为前缀的频道则称为键事件通知(key-event notification),订阅这个频道 __keyevent@0__:del,则可以接收0号数据库中所有执行 del 命令的键,订阅者将接收到被执行事件的键的名字,就是 mykey

我需要获取key 的名字,所以需要订阅__keyevent@0__:频道.

四.实现步骤

(1) 打开redis配置文件redis.conf,找到notify-keyspace-events 将其设为Ex,E代表键事件通知,x代表过期事件,每当有过期键被删除时发送,然后重启redis使配置生效;

(2) 创建demo.php文件:

 1 <?php 
 2 
 3 class RedisInstance
 4 {
 5     private $redis;
 6 
 7     public function __construct($host = '127.0.0.1', $port = 6379)
 8     {
 9         $this->redis = new Redis();
10         $this->redis->connect($host, $port);
11     }
12 
13     public function expire($key = null, $time = 0)
14     {
15         return $this->redis->expire($key, $time);
16     }
17 
18     public function psubscribe($patterns = array(), $callback)
19     {
20         $this->redis->psubscribe($patterns, $callback);
21     }
22 
23     public function setOption()
24     {
25         $this->redis->setOption(\Redis::OPT_READ_TIMEOUT,-1);
26     }
27 
28 }
29 
30  echo "程序开始执行..\n";
31 $redis = new RedisInstance();
32 $redis->setOption();
33 $redis->psubscribe(array('__keyevent@0__:expired'), 'callback');
34 //回调
35 function callback($redis, $pattern, $chan, $msg)
36 {
37     echo "$pattern\n";
38     echo "$chan\n";
39     echo "$msg\n";
40       /*业务逻辑*/
41 }
View Code

相关文章:

  • 2021-11-21
  • 2022-12-23
  • 2021-11-20
  • 2021-06-05
  • 2021-06-26
  • 2022-12-23
  • 2021-11-05
猜你喜欢
  • 2021-11-21
  • 2021-08-16
  • 2021-06-02
  • 2022-01-23
  • 2021-09-22
  • 2021-09-19
  • 2022-12-23
相关资源
相似解决方案