背景

最近需要涉及一个定时通知的业务,之前的办法是采用定时任务,每秒查询一次。后来了解到Redis的键空间通知机制,其中的过期通知,和业务非常贴合。

键空间通知

下面是Redis中文文档的介绍

键空间通知使得客户端可以通过订阅频道或模式, 来接收那些以某种方式改动了 Redis 数据集的事件。事件通过 Redis 的订阅与发布功能(pub/sub)来进行分发, 因此所有支持订阅与发布功能的客户端都可以在无须做任何修改的情况下, 直接使用键空间通知功能。

事件类型

对于每个修改数据库的操作,键空间通知都会发送两种不同类型的事件。

比如说,对 0 号数据库的键 mykey 执行 DEL 命令时, 系统将分发两条消息, 相当于执行以下两个 PUBLISH 命令:

PUBLISH keyspace@0:mykey del

PUBLISH keyevent@0:del mykey

订阅第一个频道 keyspace@0:mykey 可以接收 0 号数据库中所有修改键 mykey 的事件, 而订阅第二个频道 keyevent@0:del 则可以接收 0 号数据库中所有执行 del 命令的键。

以 keyspace 为前缀的频道被称为键空间通知(key-space notification), 而以 keyevent 为前缀的频道则被称为键事件通知(key-event notification)。

当 del mykey 命令执行时:

键空间频道的订阅者将接收到被执行的事件的名字,在这个例子中,就是 del 。

键事件频道的订阅者将接收到被执行事件的键的名字,在这个例子中,就是 mykey 。

配置

另外开启Redis的键空间通知,需要修改配置文件。查看默认的配置你会发现“notify-keyspace-events”字段,且为空,表示不开启。总共有以下这几种设置:

字符 发送的通知

K 键空间通知,所有通知以 keyspace@ 为前缀

E 键事件通知,所有通知以 keyevent@ 为前缀

g DEL 、 EXPIRE 、 RENAME 等类型无关的通用命令的通知

$ 字符串命令的通知

l 列表命令的通知

s 集合命令的通知

h 哈希命令的通知

z 有序集合命令的通知

x 过期事件:每当有过期键被删除时发送

e 驱逐(evict)事件:每当有键因为 maxmemory 政策而被删除时发送

A 参数 g$lshzxe 的别名

其中必选K或E,比如开启过期通知,“Ex”或者"Kx",两者的区别在于事件名不同,不过我们可以采用模糊订阅的方式,如果开启所有事件则是“AKE”

订阅

订阅的表达式:

__key空间/事件@数据库id__:对象
比如:
__keyspace@0__:mykey 订阅数据库0中 mykey的相关事件
__keyevent@0__:del 订阅数据库0中的 del事件
两者的区别在于,一个是符合key就通知,一个是符合事件就通知。
对于key在哪个数据库,我们很难知道,那么可以使用"*"匹配所有:
__key*__:*

PHP实现

在PHP里可以使用PHPRedis扩展,注意事项取消连接超时

$redis = new Redis();
$redis->connect("127.0.0.1");
$redis->setOption(\Redis::OPT_READ_TIMEOUT,-1); $redis->psubscribe(['__key*__:*'], 'psCallback'); function psCallback($redis, $pattern, $chan, $msg)
{
echo "Pattern: $pattern\n"; //订阅的模式
echo "Channel: $chan\n"; //符合模式的频道
echo "Payload: $msg\n\n"; //订阅的key
}

后台运行

Linux下,可以使用nohup php file.php 在后台持续运行

最新文章

  1. Ubuntu杂记——Ubuntu下Eclipse安装Maven问题
  2. vimtutor
  3. 本博客不再更新,欢迎访问本人托管在GitHub上的博客:www.wshunli.com
  4. IIS7.5 去除 index.php web.config配置文件
  5. SpringMVC4.0以后版本返回json格式数据问题
  6. virtualbox中新版本Ubuntu安装软件增强包后重启无限登录界面的解决办法
  7. ReactJS 生命周期、数据流与事件
  8. 【AI开发】基于深度学习的卡口车型、车牌识别
  9. HTML5_canvas_线性渐变
  10. 白话skynet第二篇:skynet的通信调试pack和sprotol
  11. luogu5024 [NOIp2018]保卫王国 (动态dp)
  12. 20165220 Java第四周学习总结
  13. BZOJ:1816 [Cqoi2010]扑克牌 (贪心或二分答案)
  14. 【apache tika】apache tika获取文件内容(与FileUtils的对比)
  15. EF-一对一关系
  16. Edit Distance问题在两种编程范式下的求解
  17. 【python3】 django2.0 加载css 、js 、img 等静态文件
  18. 《剑指offer》— JavaScript(15)反转链表
  19. 从源码层面解析SpringIOC容器
  20. HPUX 配置zabbix开机自动启动

热门文章

  1. 基于matplotlib的数据可视化 - 笔记
  2. JDBC连接SQLServer出现的异常
  3. 在没有创建Provision Profile权限的情况下 发布Enterprise inhouse app 的方法
  4. 用SQL语句将远程SQL Server数据库中表数据导入到本地数据库相应的表中
  5. python 多进程,实际上都没有运行,sleep
  6. adb 切换android输入法
  7. 关于 Xcode 调试工具 GDB and LLDB
  8. RDD转换DataFrame
  9. 安装/移除 MySQL 服务
  10. 开发前奏曲之添加Android SDK平台工具