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 ...
随机推荐
- Java:NIO 学习笔记-3
Java:NIO 学习笔记-3 根据 黑马程序员 的课程 JAVA通信架构I/O模式,做了相应的笔记 3. JAVA NIO 深入剖析 在讲解利用 NIO 实现通信架构之前,我们需要先来了解一下 NI ...
- UltraSoft - Beta - Scrum Meeting 1
Date: May 17th, 2020. Scrum 情况汇报 进度情况 组员 负责 今日进度 q2l PM.后端 维护Beta阶段文档 Liuzh 前端 增加删除操作按钮 Kkkk 前端 查询增加 ...
- oo第三单元学习总结
OO第三单元小结 一.JML语言理论基础及工具链梳理 在本单元我们学习了JML语言的一些基础知识,能够让我们看懂简单的JML规格并写出对应代码, 主要用到的知识点有: 1.requires 该子句 ...
- 算法:拉丁方阵(Latin Square)
拉丁方阵(英语:Latin square)是一种 n × n 的方阵,在这种 n × n 的方阵里,恰有 n 种不同的元素,每一种不同的元素在同一行或同一列里只出现一次.以下是两个拉丁方阵举例: 拉丁 ...
- 【代码更新】单细胞分析实录(20): 将多个样本的CNV定位到染色体臂,并画热图
之前写过三篇和CNV相关的帖子,如果你做肿瘤单细胞转录组,大概率看过: 单细胞分析实录(11): inferCNV的基本用法 单细胞分析实录(12): 如何推断肿瘤细胞 单细胞分析实录(13): in ...
- uvm_subscriber
subscriber是消费,用户的意思 uvm_subscriber主要作为coverage的收集方式之一 uvm_subscriber的代码非常简单,继承于uvm_component,再加上一个an ...
- ssh key公钥
在ubuntu上生成ssh key 首先使用 ls -al ~/.ssh 查看本地是否已经有key 如果没有会显示如下: ~$ ls -al ~/.ssh ls: cannot access '/ho ...
- linux下创建文件的文件权限问题
今天发现创建文件的权限和自己规定的权限不一致,了解到了权限掩码的问题,这里总结一下. 首先权限掩码umask是chmod配套的,总共为4位(gid/uid,属主,组权,其它用户的权限),不过通常我们都 ...
- vim vi 高亮第80列 Python PEP8规范 行最大长度设置
命令模式下 :set cc=80 或者 打开 vim的配置 文件 .vimrc vim ~/.vimrc 接着你会看到你的配置文件 在配置文件中加上这样行配置代码 set cc=80 ok 现在退出v ...
- CF398A Cards | 贪心
题目链接 我怎么连这种题都做得那么艰难-- 可以发现一些结论,然后枚举'x'被分成几段就好了. 我真的越来越菜 #include<iostream> #include<cstdio& ...