当前位置 博文首页 > wang785994599的博客:redis和rabbitmq实现延时队列
有时候有些业务是需要在消息过期后执行一些操作,譬如订单创建三十分钟后自动删除。
通过redis键过期通知可以实现此功能
首先启用redis通知功能:
编辑/etc/redis/redis.conf文件,添加或启用以下内容(过期通知):
notify-keyspace-events Ex
或者登陆redis-cli之后,输入以下命令:
config set notify-keyspace-events Ex
?
python客户端
import time
from redis import Redis
redis = Redis()
pubsub = redis.pubsub()
pubsub.psubscribe('__keyevent@0__:expired')
while True:
message = pubsub.get_message()
if message:
print(message)
else:
time.sleep(0.01)
?通过死信队列实现,
声明队列时添加参数:x-dead-letter-exchange:'test',那么当消息过期后将会发送到该参数所指定的交换机,routing_key默认为消息自带的routing_key,也实现了过期后做进一步处理的功能。
需要注意的时,不同过期时间(expiration)的消息不要存储到同一个死信队列,因为队列的FIFO特点,先进来的消息先出去,如果一个有效期很大的在队首,那么后面的数据即使已经过期也无法发送到下一个交换机内,因为被队首元素阻塞了。
?
?
cs