Keyspace Notification(键空间通知)

  • 2020.05.25

需求分析

  1. Redis中设置了生存时间的Key,在过期时能不能有所提示?

  2. 如果能对过期Key有个监听,如何对过期Key进行一个回调处理?

  3. 如何使用 Redis 来实现定时任务?

解决方案

Redis2.8.0 版本之后,其推出了一个新的特性————键空间消息(Redis Keyspace Notifications),它配合 2.0.0 版本之后的 SUBSCRIBE 就能完成这个定时任务。

Publish / Subscribe

Redis2.0.0 之后推出了 Pub / Sub 的指令,大致就是说一边给 Redis 的特定频道发送消息,另一边从 Redis 的特定频道取值————形成了一个简易的消息队列

Redis Keyspace Notifications

Redis 里面有一些事件,比如键到期键被删除等。然后我们可以通过配置一些东西来让 Redis 一旦触发这些事件的时候就往特定的 Channel 推一条消息。

大致的流程就是我们给 Redis 的某一个 db 设置过期事件,使其键一旦过期就会往特定频道推消息,我在自己的客户端这边就一直消费这个频道就好了。

以后一来一条定时任务,我们就把这个任务状态压缩成一个键,并且过期时间为距这个任务执行的时间差。那么当键一旦到期,就到了任务该执行的时间,Redis 自然会把过期消息推去,我们的客户端就能接收到了。这样一来就起到了定时任务的作用。

Key过期事件的Redis配置

这里需要配置 notify-keyspace-events 的参数为 Exx 代表了过期事件notify-keyspace-events Ex 保存配置后,重启Redis服务,使配置生效。

notify-keyspace-events

配置完成后执行

brew services restart redis

添加过期事件订阅 开启一个终端,redis-cli 进入 redis 。开始订阅所有操作,等待接收消息。

redis-cli -h 127.0.0.1 -p 6379

psubscribe __keyevent@0__:expired

# PSUBSCRIBE 命令订阅一个或多个符合给定模式的频道,0代表数据库0

执行结果

再开启一个终端,redis-cli 进入 redis,新增一个 10秒过期的键:

# SETEX key seconds value
setex test 10 123

另外一边执行了阻塞订阅操作后的终端,10秒过期后有如下信息输出:

输出

上次更新时间: 2020-05-25 19:37:00