redis-缓存设计-队列(普通队列、优先级队列、延迟队列)
转载自:
https://www.cnblogs.com/LQBlog/p/13397685.html
redis-缓存设计-队列(普通队列、优先级队列、延迟队列)
原问内容不做转载,这里仅仅针对其内容做一些分析。
1、延迟队列
原文中的延迟队列,采用的是ZSET集合加一个延迟线程轮询实现。即某个延迟指令入队列前先进入ZSET。在该集合中记录记录命令(key)和计划执行的时间(score),延迟线程通过不断轮询对比时间,判断是否到达触发时间。
REDIS另有事件通知机制,在少量的情况下,也有人使用EXPIRE + REDIS的事件通知机制实现类似延迟队列的效果,但是事件通知机制需要单独修改配置文件,且对CPU的资源消耗较高。
延迟队列,有一个专属队列实现,即阿里的RocketMQ,采用时间轮算法实现,在使用效率上更高和可靠。另外延迟队列,也可以采用计划任务的方式推送,如果业务内部带有计划任务模块也可以尝试计划任务实现,毕竟轮询会增加REDIS的并发数,增大其访问压力。
2、优先级队列
原文中的优先级队列,采用的是一个键值对结构控制队列的优先级,其中key是队列名,value是其优先级。当消费时根据优先级消费,生产时根据目标需求向指定目标队列写数据。
其它实现方式:定义一个key-value字典,其中key记录任务名,value记录任务优先级,为一个整数。任务生成时,将任务的key-value推送到ZSET的key-score中,这样ZSET中就可以根据SCORE排序任务,得到优先级队列,并为消费者提供最优先的任务。
文章主目录
普通队列
优先级队列
延迟队列