Redis键空间通知(keyspace notification),事件订阅
Redis键空间通知(keyspace notification),事件订阅
应用场景:有效期优惠券、24小时内支付、下单有效事件等等。
功能概览
- 所有修改键的命令。
- 所有接收到 LPUSH key value [value …] 命令的键。
- 0 号数据库中所有已过期的键。
- 键空间频道的订阅者将接收到被执行的事件的名字,在这个例子中,就是 del 。
- 键事件频道的订阅者将接收到被执行事件的键的名字,在这个例子中,就是 mykey 。
配置
- 当 notify-keyspace-events 选项的参数为空字符串时,功能关闭。
- 另一方面,当参数不是空字符串时,功能开启。
|
字符
|
发送的通知
|
|
K
|
键空间通知,所有通知以 __keyspace@<db>__ 为前缀
|
|
E
|
键事件通知,所有通知以 __keyevent@<db>__ 为前缀
|
|
g
|
DEL 、 EXPIRE 、 RENAME 等类型无关的通用命令的通知
|
|
$
|
字符串命令的通知
|
|
l
|
列表命令的通知
|
|
s
|
集合命令的通知
|
|
h
|
哈希命令的通知
|
|
z
|
有序集合命令的通知
|
|
x
|
过期事件:每当有过期键被删除时发送
|
|
e
|
驱逐(evict)事件:每当有键因为 maxmemory 政策而被删除时发送
|
|
A
|
参数 g$lshzxe 的别名
|
命令产生的通知
- DEL key [key …] 命令为每个被删除的键产生一个 del 通知。
- RENAME key newkey 产生两个通知:为来源键(source key)产生一个 rename_from 通知,并为目标键(destination key)产生一个 rename_to 通知。
- EXPIRE key seconds 和 EXPIREAT key timestamp 在键被正确设置过期时间时产生一个 expire 通知。当 EXPIREAT key timestamp 设置的时间已经过期,或者 EXPIRE key seconds传入的时间为负数值时,键被删除,并产生一个 del 通知。
- SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern …]] [ASC | DESC] [ALPHA] [STORE destination] 在命令带有 STORE 参数时产生一个 sortstore 事件。如果 STORE 指示的用于保存排序结果的键已经存在,那么程序还会发送一个 del 事件。
- SET key value [EX seconds] [PX milliseconds] [NX|XX] 以及它的所有变种(SETEX key seconds value 、 SETNX key value 和 GETSET key value)都产生 set 通知。其中 SETEX key seconds value 还会产生 expire 通知。
- MSET key value [key value …] 为每个键产生一个 set 通知。
- SETRANGE key offset value 产生一个 setrange 通知。
- INCR key 、 DECR key 、 INCRBY key increment 和 DECRBY key decrement 都产生 incrby通知。
- INCRBYFLOAT key increment 产生 incrbyfloat 通知。
- APPEND key value 产生 append 通知。
- LPUSH key value [value …] 和 LPUSHX key value 都产生单个 lpush 通知,即使有多个输入元素时,也是如此。
- RPUSH key value [value …] 和 RPUSHX key value 都产生单个 rpush 通知,即使有多个输入元素时,也是如此。
- RPOP key 产生 rpop 通知。如果被弹出的元素是列表的最后一个元素,那么还会产生一个 del 通知。
- LPOP key 产生 lpop 通知。如果被弹出的元素是列表的最后一个元素,那么还会产生一个 del 通知。
- LINSERT key BEFORE|AFTER pivot value 产生一个 linsert 通知。
- LSET key index value 产生一个 lset 通知。
- LTRIM key start stop 产生一个 ltrim 通知。如果 LTRIM key start stop 执行之后,列表键被清空,那么还会产生一个 del 通知。
- RPOPLPUSH source destination 和 BRPOPLPUSH source destination timeout 产生一个 rpop 通知,以及一个 lpush 通知。两个命令都会保证 rpop 的通知在 lpush 的通知之前分发。如果从键弹出元素之后,被弹出的列表键被清空,那么还会产生一个 del 通知。
- HSET hash field value 、 HSETNX hash field value 和 HMSET 都只产生一个 hset 通知。
- HINCRBY 产生一个 hincrby 通知。
- HINCRBYFLOAT 产生一个 hincrbyfloat 通知。
- HDEL 产生一个 hdel 通知。如果执行 HDEL 之后,哈希键被清空,那么还会产生一个 del 通知。
- SADD key member [member …] 产生一个 sadd 通知,即使有多个输入元素时,也是如此。
- SREM key member [member …] 产生一个 srem 通知,如果执行 SREM key member [member …] 之后,集合键被清空,那么还会产生一个 del 通知。
- SMOVE source destination member 为来源键(source key)产生一个 srem 通知,并为目标键(destination key)产生一个 sadd 事件。
- SPOP key 产生一个 spop 事件。如果执行 SPOP key 之后,集合键被清空,那么还会产生一个 del 通知。
- SINTERSTORE destination key [key …] 、 SUNIONSTORE destination key [key …] 和 SDIFFSTORE destination key [key …] 分别产生 sinterstore 、 sunionostore 和 sdiffstore三种通知。如果用于保存结果的键已经存在,那么还会产生一个 del 通知。
- ZINCRBY key increment member 产生一个 zincr 通知。(译注:非对称,请注意。)
- ZADD key score member [[score member] [score member] …] 产生一个 zadd 通知,即使有多个输入元素时,也是如此。
- ZREM key member [member …] 产生一个 zrem 通知,即使有多个输入元素时,也是如此。如果执行 ZREM key member [member …] 之后,有序集合键被清空,那么还会产生一个 del 通知。
- ZREMRANGEBYSCORE key min max 产生一个 zrembyscore 通知。(译注:非对称,请注意。)如果用于保存结果的键已经存在,那么还会产生一个 del 通知。
- ZREMRANGEBYRANK key start stop 产生一个 zrembyrank 通知。(译注:非对称,请注意。)如果用于保存结果的键已经存在,那么还会产生一个 del 通知。
- ZINTERSTORE destination numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX] 和 ZUNIONSTORE destination numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX] 分别产生 zinterstore 和 zunionstore 两种通知。如果用于保存结果的键已经存在,那么还会产生一个 del 通知。
- 每当一个键因为过期而被删除时,产生一个 expired 通知。
- 每当一个键因为 maxmemory 政策而被删除以回收内存时,产生一个 evicted 通知。
配置具体说明:
- 首先找到redis.conf配置文件,打开文件,查找notify-keyspace-events,将前面的#去掉即可。注意:这里配置的是notify-keyspace-events的Ex参数,即说明,当键过期的时候会触发通知,如果只需要哈希命令键触发通知则可以设置为notify-keyspace-events Eh。

- 重启redis-server。
- 配置完成。
代码说明:
<?php
class Redis2
{
private $redis; public function __construct($host = '127.0.0.1', $port = 6379)
{
$this->redis = new Redis();
$this->redis->connect($host, $port);
} public function setex($key, $time, $val)
{
return $this->redis->setex($key, $time, $val);
} public function set($key, $val)
{
return $this->redis->set($key, $val);
} public function get($key)
{
return $this->redis->get($key);
} public function incr($key)
{
return $this->redis->incr($key);
} 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);
} }
<?php
require_once './Redis.class.php';
$redis = new \Redis2();
// 解决Redis客户端订阅时候超时情况
$redis->setOption();
$redis->psubscribe(array('__keyevent@0__:incrby'), 'keyCallback');
// 回调函数,这里写处理逻辑
function keyCallback($redis, $pattern, $chan, $msg)
{
echo "Pattern: $pattern\n";
echo "Channel: $chan\n";
echo "Payload: $msg\n\n";
//keyCallback为订阅事件后的回调函数,这里写业务处理逻辑,
//比如前面提到的商品不支付自动撤单,这里就可以根据订单id,来实现自动撤单
}
<?php
require_once './Redis.class.php';
$redis = new \Redis2();
$var = 123;
$redis->incr($var);
进行测试
- 运行psubscribe.php。

- 运行 index.php。

- 观察订阅状态。如下。

- 事件触发通知成功。
完成
参考资料:http://redisdoc.com/topic/notification.html
Redis键空间通知(keyspace notification),事件订阅的更多相关文章
- redis键空间通知(keyspace notification)
一.需求 在redis中,设置好key和生存时间之后,希望key过期被删除时能够及时的发送一个通知告诉我key,以便我做后续的一些操作. 二.环境 系统:windows10 php:7.1 redis ...
- 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过期回调以及键空间通知
背景 最近需要涉及一个定时通知的业务,之前的办法是采用定时任务,每秒查询一次.后来了解到Redis的键空间通知机制,其中的过期通知,和业务非常贴合. 键空间通知 下面是Redis中文文档的介绍 键空间 ...
- 利用Redis keyspace notification(键空间通知)实现过期提醒
一.序言: 本文所说的定时任务或者说计划任务并不是很多人想象中的那样,比如说每天凌晨三点自动运行起来跑一个脚本.这种都已经烂大街了,随便一个 Crontab 就能搞定了. 这里所说的定时任务可以说是计 ...
- Redis源码解析:09redis数据库实现(键值对操作、键超时功能、键空间通知)
本章对Redis服务器的数据库实现进行介绍,说明Redis数据库相关操作的实现,包括数据库中键值对的添加.删除.查看.更新等操作的实现:客户端切换数据库的实现:键超时相关功能的实现.键空间事件通知等. ...
- redis中键空间通知
通过redis的键空间通知,当redis删除过期key的时候,及时更新mongodb数据库中user的状态 var Redis = require('ioredis'); var redis = ne ...
随机推荐
- httpclient 登录成功后返回的cookie值访问下一页面
HttpClient4.x可以自带维持会话功能,只要使用同一个HttpClient且未关闭连接,则可以使用相同会话来访问其他要求登录验证的服务(见TestLogin()方法中的"执行get请 ...
- 聊聊 Kubernetes Pod or Namespace 卡在 Terminating 状态的场景
这个话题,想必玩过kubernetes的同学当不陌生,我会分Pod和Namespace分别来谈. 开门见山,为什么Pod会卡在Terminationg状态? 一句话,本质是API Server虽然标记 ...
- Noip模拟34 2021.8.9
T1 Merchant 一眼二分,然后想了想维护凸包,好像并没有什么关系, 然后又想了想维护一个栈,发现跳指针细节过多不想打 最后直接打了二分,大点跑的飞快,感觉比较稳,出来$78$分 是没用神奇的$ ...
- stm32电机控制之控制两路直流电机!看完你会了吗
手头上有一个差分驱动的小车,使用两个直流电机驱动,要实现小车的在给定速度下运动,完成直线行驶,转向,加速,刹车等复杂运动. 使用的电机是12v供电的直流电机,带编码器反馈,这样就可以采用闭环速度控制, ...
- 常用Java API:大数类
摘要 java中的基础数据类型能存储的最大的二进制数是 2 ^ 63 - 1, 对应的十进制数是9223372036854775807,也就是说只要运算过程中会超过这个数,就会造成数据溢出,从而造成错 ...
- 【做题记录】[NOIP2016 普及组] 魔法阵
P2119 魔法阵 2016年普及组T4 题意: 给定一系列元素 \(\{X_i\}\) ,求满足以下不等式的每一个元素作为 \(a,b,c,d\) 的出现次数 . \[\begin{cases}X_ ...
- DeWeb 与 Unigui的区别
DeWeb 与 Unigui 相同: 都是采用Delphi开发网页的平台 不同: 1 DeWeb不需要安装控件, 而Unigui需要安装自己的控件 2 DeWeb无需要学习HTML/CSS/JavaS ...
- lamp 架构的理解
1,lamp架构下的求情过程如下: 2,httpd服务器连接php服务器的三种方式 3,php和mysql的连接
- webpack 之 js语法检查eslint
webpack 之 js语法检查eslint // 用来拼接绝对路径的方法 const {resolve} = require('path') const HtmlWebpackPlugin = re ...
- [第二章]c++学习笔记1(类和对象的基础2)
类的成员函数可和类的定义分开写 类成员的可访问范围(private,public,protected) 具体使用方法 使用例