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排序任务,得到优先级队列,并为消费者提供最优先的任务。

 

  

  

 

 

文章主目录

    普通队列
    优先级队列
    延迟队列

 

posted @ 2021-11-30 10:01  dos_hello_world  阅读(507)  评论(0)    收藏  举报