keyspace notification(键空间通知)
Posted bcombettter
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了keyspace notification(键空间通知)相关的知识,希望对你有一定的参考价值。
一、需求分析:
- 设置了生存时间的Key,在过期时能不能有所提示?
- 如果能对过期Key有个监听,如何对过期Key进行一个回调处理?
- 如何使用 Redis 来实现定时任务?
二、序言:
本文所说的定时任务或者说计划任务并不是很多人想象中的那样,比如说每天凌晨三点自动运行起来跑一个脚本。这种都已经烂大街了,随便一个 Crontab 就能搞定了。
这里所说的定时任务可以说是计时器任务,比如说用户触发了某个动作,那么从这个点开始过二十四小时我们要对这个动作做点什么。那么如果有 1000 个用户触发了这个动作,就会有 1000 个定时任务。于是这就不是 Cron 范畴里面的内容了。
举个最简单的例子,一个用户推荐了另一个用户,我们定一个二十四小时之后的任务,看看被推荐的用户有没有来注册,如果没注册就给他搞一条短信过去。
三、Redis介绍
在 Redis 的 2.8.0 版本之后,其推出了一个新的特性——键空间消息(Redis Keyspace Notifications),它配合 2.0.0 版本之后的 SUBSCRIBE 就能完成这个定时任务
的操作了,不过定时的单位是秒。
(1)Publish / Subscribe
Redis 在 2.0.0 之后推出了 Pub / Sub 的指令,大致就是说一边给 Redis 的特定频道发送消息,另一边从 Redis 的特定频道取值——形成了一个简易的消息队列。
(2)Redis Keyspace Notifications
在 Redis 里面有一些事件,比如键到期、键被删除等。然后我们可以通过配置一些东西来让 Redis 一旦触发这些事件的时候就往特定的 Channel 推一条消息。
大致的流程就是我们给 Redis 的某一个 db 设置过期事件,使其键一旦过期就会往特定频道推消息,我在自己的客户端这边就一直消费这个频道就好了。
以后一来一条定时任务,我们就把这个任务状态压缩成一个键,并且过期时间为距这个任务执行的时间差。那么当键一旦到期,就到了任务该执行的时间,Redis 自然会把过期消息推去,我们的客户端就能接收到了。这样一来就起到了定时任务的作用。
四、Key过期事件的Redis配置
这里需要配置 notify-keyspace-events 的参数为 “Ex”。x 代表了过期事件。notify-keyspace-events "Ex" 保存配置后,重启Redis服务,使配置生效。
重启Reids服务器:
[email protected]:/etc/redis# service redis-server restart redis.conf Stopping redis-server: redis-server. Starting redis-server: redis-server.
添加过期事件订阅 开启一个终端,redis-cli 进入 redis 。开始订阅所有操作,等待接收消息。
[email protected]:~$ redis-cli -h 127.0.01.4 -p 63789 127.0.0.1:63789> psubscribe [email protected]__:expired Reading messages... (press Ctrl-C to quit) 1) "psubscribe" 2) "[email protected]__:expired" 3) (integer) 1
再开启一个终端,redis-cli 进入 redis,新增一个 123秒过期的键:
1270.01.1.1:63789> SETEX coolName 123 20 OK 121.41.188.109:63789> get coolName "20" 121.41.188.109:63789> ttl coolName (integer) 104
另外一边执行了阻塞订阅操作后的终端,123秒过期后有如下信息输出:
121.141.188.209:63789> psubscribe [email protected]__:expired Reading messages... (press Ctrl-C to quit) 1) "psubscribe" 2) "[email protected]__:expired" 3) (integer) 1 1) "pmessage" 2) "[email protected]__:expired" 3) "[email protected]__:expired" 4) "coolName"
说明:说明对过期Key信息的订阅是成功的。
以上是关于keyspace notification(键空间通知)的主要内容,如果未能解决你的问题,请参考以下文章
Redis键空间通知(Keyspace Notifications)
Redis实践操作之—— keyspace notification(键空间通知)
Redis实践操作之—— 直播视频定时控制TCP长连接框架(WorkerMan)+键空间通知的机制 ( Keyspace Notifications)+短信接口(API)