redis键空间通知(keyspace notification)
2019-07-23 08:43:03来源:博客园 阅读 ()
一.需求
在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 }
(3) 使用php运行demo.php文件,首先你的php是否设置环境变量,设置方法:找到我的电脑右键选择属性—高级系统设置—环境变量—找到path变量编辑/没有path变量的可以新建一个—将你的php.exe的绝对路径放进去保存即可,之后就可以直接使用php命令了,其次必须开启了redis拓展,查看是否装有redis拓展:
php -m
确认已安装拓展,直接运行文件:
php demo.php
(4) 打开一个redis客户端,即运行redis-cli.exe文件或者使用命令 redis-cli.exe -p 6379,创建一个key,并将过期时间设置在五秒,然后观察运行demo.php的窗口:
五秒之后key过期被删除,php接收通知走进回调方法,这里就可以处理业务逻辑了.
五.测试通知时效性:
写一个脚本循环往redis中插入50条记录,且每条记录的过期时间在五秒和十秒随机产生,观察接收到的通知状态:
注意:redis 使用以下两种方式删除过期的键:
- 当一个键被访问时,程序会对这个键进行检查,如果键已经过期,那么该键将被删除。
- 底层系统会在后台渐进地查找并删除那些过期的键,从而处理那些已经过期但是不会被访问到的键。
也就是说如果一个键过期了但是没有程序访问它,并且底层系统还没有排查到它的时候这个键是不会被删除的,也不会有通知产生,因此,redis 产生 expired
通知的时间为过期键被删除的时候, 而不是键的生存时间变为 0
的时候。
原文链接:https://www.cnblogs.com/52lnamp/p/11213239.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:PDO简单的DB类封装
下一篇:rbac
- Laravel框架实现redis集群的方法分析 2020-01-17
- PHP使用Redis实现防止大并发下二次写入的方法 2019-12-29
- PHP+redis实现添加处理投票的方法 2019-12-25
- 深入解析PHP中redis的用法 2019-10-12
- 微信支付和微信支付通知基于sdk的说明 2019-07-24
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash