redis是一种高性能的内存数据库,它支持多种数据结构和功能,其中之一就是key的过期机制。redis可以为每个key设置一个过期时间,当key到达过期时间后,redis会自动删除该key,从而释放内存空间。这个特性可以用来实现缓存、限流、排行榜等常见的业务场景。
但是,有时候我们不仅仅想要删除过期的key,还想要在key过期的时候做一些额外的操作,比如通知其他系统、更新统计数据、执行清理任务等。这时候,我们就需要监听redis的key过期事件,也就是key过期回调。
那么,如何利用redis的key过期事件实现业务逻辑呢?本文将介绍两种常用的方法:使用发布订阅模式和使用键空间通知。
使用发布订阅模式
发布订阅模式是一种消息传递模式,它允许多个订阅者监听一个或多个频道,并接收发布者发送到这些频道的消息。redis提供了pub/sub命令来实现发布订阅模式。
要使用发布订阅模式监听key过期事件,我们需要做以下几个步骤:
1. 在redis服务器上开启notify-keyspace-events配置项,并设置为Ex或者Kx,表示开启key过期事件的通知。这可以通过修改配置文件或者运行config set命令来实现。
2. 在一个或多个客户端上订阅__keyevent@0__:expired频道,这是一个特殊的频道,用来接收0号数据库中所有key过期事件的通知。如果想要监听其他数据库或者其他类型的事件,可以参考[官方文档](https://redis.io/topics/notifications)。
3. 在另一个客户端上设置一个或多个带有过期时间的key,比如使用setex命令。
4. 等待key过期,此时订阅了__keyevent@0__:expired频道的客户端会收到一个消息,消息的内容是过期的key的名称。
5. 在收到消息后,根据业务需求执行相应的操作,比如调用其他接口、更新数据库、写日志等。
使用发布订阅模式监听key过期事件的优点是简单易用,不需要额外的组件或者代码。缺点是可能会有消息丢失或者延迟的风险,因为redis并不保证消息的可靠性和顺序性。另外,如果订阅者数量太多或者处理速度太慢,也可能会影响redis服务器的性能。
使用键空间通知
键空间通知是一种更高级的特性,它允许客户端通过psubscribe命令订阅一个或多个匹配模式,并接收与这些模式匹配的键空间变化事件的通知。键空间变化事件包括了key的增删改查等操作,其中也包括了key过期事件。
要使用键空间通知监听key过期事件,我们需要做以下几个步骤:
1. 在redis服务器上开启notify-keyspace-events配置项,并设置为Ex或者Kx,表示开启key过期事件的通知。这可以通过修改配置文件或者运行config set命令来实现。
2. 在一个或多个客户端上使用psubscribe命令订阅__keyspace@0__:*模式,这是一个特殊的模式,用来接收0号数据库中所有key的键空间变化事件的通知。如果想要监听其他数据库或者其他类型的事件,可以参考[官方文档](https://redis.io/topics/notifications)。
3. 在另一个客户端上设置一个或多个带有过期时间的key,比如使用setex命令。
4. 等待key过期,此时订阅了__keyspace@0__:*模式的客户端会收到两个消息,第一个消息的内容是__keyspace@0__:key,表示key发生了变化,第二个消息的内容是__keyevent@0__:expired key,表示key过期了。
5. 在收到消息后,根据业务需求执行相应的操作,比如调用其他接口、更新数据库、写日志等。
使用键空间通知监听key过期事件的优点是更灵活和更精确,可以根据不同的模式订阅不同的事件,并且可以区分出事件的类型和源头。