redis键空间通知(keyspace notification)
一.需求
在redis中,设置好key和生存时间之后,希望key过期被删除时能够及时的发送一个通知告诉我key,以便我做后续的一些操作.
二.环境
系统:windows10 php:7.1 redis:3.2
三.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文件:
<?php class RedisInstance
{
private $redis; public function __construct($host = '127.0.0.1', $port = 6379)
{
$this->redis = new Redis();
$this->redis->connect($host, $port);
} public function expire($key = null, $time = 0)
{
return $this->redis->expire($key, $time);
} public function psubscribe($patterns = array(), $callback)
{
$this->redis->psubscribe($patterns, $callback);
} public function setOption()
{
$this->redis->setOption(\Redis::OPT_READ_TIMEOUT,-1);
} } echo "程序开始执行..\n";
$redis = new RedisInstance();
$redis->setOption();
$redis->psubscribe(array('__keyevent@0__:expired'), 'callback');
//回调
function callback($redis, $pattern, $chan, $msg)
{
echo "$pattern\n";
echo "$chan\n";
echo "$msg\n";
/*业务逻辑*/
}
(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 的时候。
redis键空间通知(keyspace notification)的更多相关文章
- Redis键空间通知(keyspace notification),事件订阅
Redis键空间通知(keyspace notification),事件订阅 应用场景:有效期优惠券.24小时内支付.下单有效事件等等. 功能概览 键空间通知使得客户端可以通过订阅频道或模式, ...
- Redis 键空间通知
[Redis 键空间通知] 键空间通知使得客户端可以通过订阅频道或模式, 来接收那些以某种方式改动了 Redis 数据集的事件. 以下是一些键空间通知发送的事件的例子: 所有修改键的命令. 所有接收到 ...
- 10Redis键空间通知(keyspace notifications)
Redis的键空间通知(keyspace notifications)功能是自2.8.0版本开始加入的,客户端可以通过订阅/发布(Pub/Sub)机制,接收那些以某种方式改变了Redis数据空间的事件 ...
- python中的Redis键空间通知(过期回调)
介绍 Redis是一个内存数据结构存储库,用于缓存,高速数据摄取,处理消息队列,分布式锁定等等. 使用Redis优于其他内存存储的优点是Redis提供持久性和数据结构,如列表,集合,有序集和散列. 在 ...
- Redis 键空间事件通知
出处: 使用Redis完成定时任务 场景 使用Java做过项目的人大概都用过定时器.一般来说,项目里订单模块和评论模块,都会涉及到定时任务执行.比如说: 用户下订单后,需要在5分钟内完成支付,否则 ...
- 利用Redis keyspace notification(键空间通知)实现过期提醒
一.序言: 本文所说的定时任务或者说计划任务并不是很多人想象中的那样,比如说每天凌晨三点自动运行起来跑一个脚本.这种都已经烂大街了,随便一个 Crontab 就能搞定了. 这里所说的定时任务可以说是计 ...
- redis过期回调以及键空间通知
背景 最近需要涉及一个定时通知的业务,之前的办法是采用定时任务,每秒查询一次.后来了解到Redis的键空间通知机制,其中的过期通知,和业务非常贴合. 键空间通知 下面是Redis中文文档的介绍 键空间 ...
- Redis源码解析:09redis数据库实现(键值对操作、键超时功能、键空间通知)
本章对Redis服务器的数据库实现进行介绍,说明Redis数据库相关操作的实现,包括数据库中键值对的添加.删除.查看.更新等操作的实现:客户端切换数据库的实现:键超时相关功能的实现.键空间事件通知等. ...
- redis中键空间通知
通过redis的键空间通知,当redis删除过期key的时候,及时更新mongodb数据库中user的状态 var Redis = require('ioredis'); var redis = ne ...
随机推荐
- keepalived+mysql双主热备
这里使用keepalived实现mysql的双主热备高可用 实验环境: 主机名 IP 系统版本 软件版本 master 192.168.199.6/vip:192.168.199.111 Rhel7. ...
- spring boot定时任务
介绍 该demo是基于注解(@Scheduled)以及多线程执行的定时任务. 步骤 启用异步执行 springboot实现异步调用 入口类添加启动注解 @EnableScheduling @Enabl ...
- JDK1.6历史版本的下载(關於TLSv1.2)Oracle的官方文檔
[资源描述]:对于部分老项目 仍然采用的是JDK1.6 版本 但是打开官方 JDK 都是最新的 版本 想找 历史版本 不容易找到 [资源详情]:提供下载链接: http://www.oracle.co ...
- java课后实验性问题1
一.一个java类文件中只能有一个公有类吗? 测试代码 public class Test{ public static void main(String[] args){ } public clas ...
- 彻底搞清楚javascript中的require、import和export(js模块加载规范的前世今生)
为什么有模块概念 理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. 但是,Javascript不是一种模块化编程语言,在es6以前,它是不支持”类”(class),所以也 ...
- 安装RabbitMQ管理插件失败
运行 rabbitmq-plugins.bat enable rabbitmq_management后提示失败信息 是因为erlang和RabbitMQ版本冲突导致
- SPSS python教程:[1]安装Python Essentials
python机器学习-乳腺癌细胞挖掘(博主亲自录制视频)https://study.163.com/course/introduction.htm?courseId=1005269003&ut ...
- VUE组件如何通信
Vue父子组件如何通信? 子组件通知父组件(调用父组件方法) 在父组件使用 on(eventName)监听事件,在子组件使用emit(eventName) 触发事件 : 父组件通知子组件(调用子组件方 ...
- AnimationDrawable
①先定义一个AnimationDrawable的xml资源文件: <?xml version="1.0" encoding="utf-8"?> &l ...
- VBA添加下拉菜单
Sub createMenus() Dim cmdBar As CommandBar Dim cmdMenu As CommandBarPopup Dim cmdBtn As CommandBarBu ...