Redis键通知机制
Redis键通知机制
一、概念
自从redis2.8.0以后出了一个新特性,Keyspace Notifications 称为“键空间通知”。
这个特性大概是,凡是实现了Redis的Pub/Sub的客户端,只需要订阅相应Channel,就可以获得对Key操作的一些事件,从而可以处理一些业务。
比如:
1、当你del一个key时,就可以触发一个del事件通知。
2、一个key的失效时间到了,就会触发expire事件通知。
3、对一个库所有key操作,都可以获取通知。比如对0库所有key的操作。
注意事项:
1)因为 Redis 目前的订阅与发布功能采取的是发送即忘(fire and forget)策略, 所以如果你的程序需要可靠事件通知(reliable notification of events), 那么目前的键空间通知可能并不适合你:当订阅事件的客户端断线时, 它会丢失所有在断线期间分发给它的事件。并不能确保消息送达。
2)Redis Pub/Sub 是一种并不可靠地消息机制,他不会做信息的存储,只是在线转发,那么肯定也没有ack确认机制,另外只有订阅段监听时才会转发!所以Keyspace Notification 也不是可靠地通知系统,如果你的系统需要很好的可靠性,那么Keyspace Notification可能并不是一种很好的选择。
二、配置
默认情况下,Redis 并不会开启Keyspace Notification, 我们可以通过修改redis.conf的notify-keyspace-events 或者使用CONFIG SET命令来开启该功能,设置参数,来开启全部或者部分通知, 以下是设置参数详细说明列表:
过期通知的发送时间:
Redis 使用以下两种方式删除过期的键:
1)当一个键被访问时,程序会对这个键进行检查,如果键已经过期,那么该键将被删除。
2)底层系统会在后台渐进地查找并删除那些过期的键,从而处理那些已经过期、但是不会被访问到的键。
当过期键被以上两个程序的任意一个发现、 并且将键从数据库中删除时, Redis 会产生一个 expired 通知。
Redis 并不保证生存时间(TTL)变为 0 的键会立即被删除: 如果程序没有访问这个过期键, 或者带有生存时间的键非常多的话, 那么在键的生存时间变为 0 , 直到键真正被删除这中间, 可能会有一段比较显著的时间间隔。
因此, Redis 产生 expired 通知的时间为过期键被删除的时候, 而不是键的生存时间变为 0 的时候。
二、订阅
1)subscribe & psubscribe命令来对特定主题进行订阅,完成事件通知的过程。
SUBSCRIBE channel [channel ...]
PSUBSCRIBE channelPattern [channelPattern ...]
区别:PSUBSCRIBE 跟 SUBSCRIBE 唯一不同,就是支持通配符。每个模式以 * 作为匹配符,比如 huangz* 匹配所有以 huangz。显然支持通配符的性能消耗会大一点。
2)订阅的表达式
__key空间/事件@数据库id__:对象
比如:
__keyspace@0__:mykey 订阅数据库0中 mykey的相关事件
__keyevent@0__:del 订阅数据库0中的 del事件
__keyevent@0__:expired 订阅数据库0的expired事件
两者的区别在于,一个是符合key就通知,一个是符合事件就通知。
对于key在哪个数据库,我们很难知道,那么可以使用"*"匹配所有:
__key*__:*
3)订阅subscribe与发布publish
三、与Laravel框架的配合使用
1.app\Console\Commands\OrderFailure.php
在handle()函数中处理
参考如图:
2.设置监听的键
Redis::setex("shopOrder_".$this->order_id,$timeout*60,$this->order_id);
参考链接:https://blog.csdn.net/qijiqiguai/article/details/78229111
Redis键通知机制的更多相关文章
- Redis的缓存策略和主键失效机制
作为缓存系统都要定期清理无效数据,就需要一个主键失效和淘汰策略. >>EXPIRE主键失效机制 在Redis当中,有生存期的key被称为volatile,在创建缓存时,要为给定的key设置 ...
- python中的Redis键空间通知(过期回调)
介绍 Redis是一个内存数据结构存储库,用于缓存,高速数据摄取,处理消息队列,分布式锁定等等. 使用Redis优于其他内存存储的优点是Redis提供持久性和数据结构,如列表,集合,有序集和散列. 在 ...
- Redis 键空间通知
[Redis 键空间通知] 键空间通知使得客户端可以通过订阅频道或模式, 来接收那些以某种方式改动了 Redis 数据集的事件. 以下是一些键空间通知发送的事件的例子: 所有修改键的命令. 所有接收到 ...
- redis主键失效机制
Memcached删除主键的方式与Redis有何异同 首先,Memcached 在删除失效主键时也是采用的消极方法,即 Memcached 内部也不会监视主键是否失效,而是在通过 Get 访问主键时才 ...
- redis键空间通知(keyspace notification)
一.需求 在redis中,设置好key和生存时间之后,希望key过期被删除时能够及时的发送一个通知告诉我key,以便我做后续的一些操作. 二.环境 系统:windows10 php:7.1 redis ...
- Redis 键空间事件通知
出处: 使用Redis完成定时任务 场景 使用Java做过项目的人大概都用过定时器.一般来说,项目里订单模块和评论模块,都会涉及到定时任务执行.比如说: 用户下订单后,需要在5分钟内完成支付,否则 ...
- Redis键空间通知(keyspace notification),事件订阅
Redis键空间通知(keyspace notification),事件订阅 应用场景:有效期优惠券.24小时内支付.下单有效事件等等. 功能概览 键空间通知使得客户端可以通过订阅频道或模式, ...
- Redis数据持久化机制AOF原理分析一---转
http://blog.csdn.net/acceptedxukai/article/details/18136903 http://blog.csdn.net/acceptedxukai/artic ...
- 详解 Redis 内存管理机制和实现
Redis是一个基于内存的键值数据库,其内存管理是非常重要的.本文内存管理的内容包括:过期键的懒性删除和过期删除以及内存溢出控制策略. 最大内存限制 Redis使用 maxmemory 参数限制最大可 ...
随机推荐
- Jquery “This”的指向
JavaScript中的this不总是指向当前对象,函数或类中的this指向与调用这个函数的对象以及上下文环境是息息相关的.如在全局作用域调用一个含this的对象,此时当前对象的this指向的是win ...
- STM32 HAL库 UART 串口读写功能笔记
https://www.cnblogs.com/Mysterious/p/4804188.html STM32L0 HAL库 UART 串口读写功能 串口发送功能: uint8_t TxData[10 ...
- 基于JS的高级脚本语言 Sara
Sara-基于JS的高级脚本语言 欢迎使用Sara,Sara是一款基于JavaScript的全新的高级脚本语言! Sara不像我们工作室上一款编程语言作品-Ginit一样,他属于更高级的语言 Sara ...
- 进程与线程与GIL的总结
- HDU-2082-找单词(母函数)
链接: http://acm.hdu.edu.cn/showproblem.php?pid=2082 题意: 假设有x1个字母A, x2个字母B,..... x26个字母Z,同时假设字母A的价值为1, ...
- Vin2008 X64安装.Net Framework1.1
http://www.iis.net/learn/install/installing-iis-7/how-to-install-aspnet-11-with-iis-on-vista-and- ...
- 数据库学习之七--视图(View)
一.定义 视图:指计算机数据库中的一个临时虚拟表,其内容由查询定义:同真实的表一样,视图包含一系列带有名称的列和行数据.但是,视图并不在数据库中以存储的数据值集形式存在. 二.优点 1. 优点: a. ...
- (7)打鸡儿教你Vue.js
计算属性 computed <div id="app"> {{ message.split('').reverse().join('') }} </div> ...
- c++ 将字符串转换为数字
int string2int(string x); int string2int(string x){ int a; string res=x; stringstream ss; ss << ...
- [PKUSC2018]真实排名——线段树+组合数
题目链接: [PKUSC2018]真实排名 对于每个数$val$分两种情况讨论: 1.当$val$不翻倍时,那么可以翻倍的是权值比$\frac{val-1}{2}$小的和大于等于$val$的. 2.当 ...