【Redis延迟队列】redis中的阻塞队列和延迟队列

news/2024/9/22 17:21:40/

阻塞队列(RBlockingQueue)

作用和特点:

  1. 实时性:阻塞队列用于实时处理消息。生产者将消息放入队列,消费者可以立即从队列中取出并处理消息。
  2. 阻塞特性:如果队列为空,消费者在尝试获取消息时会被阻塞(即等待),直到有新的消息进入队列。这种特性在需要确保消费者不空转的场景中特别有用。

使用场景:

  1. 实时数据处理:如日志处理、即时消息系统等。
  2. 任务队列:如线程池中的任务调度。

延迟队列(RDelayedQueue)

作用和特点:

  1. 延迟处理:延迟队列允许将消息在指定的延迟时间之后才加入实际的处理队列。这对于需要控制消息处理频率或需要在特定时间处理消息的场景非常有用。
  2. 有序性:消息按计划的处理时间顺序被放入实际队列。这种特性使得延迟队列非常适合于定时任务和延迟任务的实现。
  3. 缓冲和节流:通过延迟队列,可以缓冲突发的高流量,平滑处理高峰请求,避免系统过载。

使用场景:

  1. 定时任务:如定时发送邮件、定时清理任务等。
  2. 延迟处理:如订单超时取消、延迟支付处理等。
  3. 流量平滑:缓冲高峰流量,防止瞬时高负载对系统的冲击。

redis_19">redis中的存储格式

阻塞队列存储:

  • 阻塞队列(RBlockingQueue):在Redis中存储为列表(List)。元素加入时使用 LPUSH,取出时使用 RPOP。

延迟队列存储:

  • 延迟队列(RDelayedQueue):在Redis中存储为有序集合(Sorted Set),管理延迟时间。当元素的延迟时间到达时,元素从有序集合移动到实际的阻塞队列中。

使用方式

写入队列:

java">@Override
public voidawardStockConsumeSendQueue(StrategyAwardStockKeyVO strategyAwardStockKeyVO) {// 写入队列操作,奖品库存消耗的队列String cacheKey = Constants.RedisKey.STRATEGY_AWARD_COUNT_QUERY_KEY;// 创建队列信息// 通过 redisService 获取一个阻塞队列RBlockingQueue<StrategyAwardStockKeyVO> blockingQueue = redisService.getBlockingQueue(cacheKey);// 用阻塞队列 blockingQueue 创建一个延迟队列 delayedQueue// 将队列信息加入到延迟队列中,希望固定一个时间段写入队列,但是不要写的这么快,消费完了写的时候慢一些,让下游处理有一个反应时间RDelayedQueue<StrategyAwardStockKeyVO> delayedQueue = redisService.getDelayedQueue(blockingQueue);// 这里3秒之后再加入到队列中去// 将 strategyAwardStockKeyVO 加入到延迟队列中,设置延迟时间为 3 秒delayedQueue.offer(strategyAwardStockKeyVO, 3, TimeUnit.SECONDS);
}

从队列中取:

java">@Override
public StrategyAwardStockKeyVO takeQueueValue() {String cacheKey = Constants.RedisKey.STRATEGY_AWARD_COUNT_QUERY_KEY;// 通过 cacheKey 获取一个阻塞队列。RBlockingQueue<StrategyAwardStockKeyVO> destinationQueue = redisService.getBlockingQueue(cacheKey);// 这里不用take,take需要一直等待。已经有定时任务了,直接弹出即可// 从阻塞队列中取出一个元素,如果队列为空,返回 nullreturn destinationQueue.poll();
}

http://www.ppmy.cn/news/1467184.html

相关文章

【网络通信层】华为云连接MQTT设备

本文介绍华为云设备连接到设备的操作。 目录 一、在华为云创建设备 二、连接MQTT 三、通信 一、在华为云创建设备 现在华为云上可以免费使用部分受限服务&#xff0c;包括免费创建自己的设备连接。 首先&#xff0c;登录华为云平台共建智能世界云底座-华为云 (huaweicl…

Ollama+FastAPI+React手把手构建自己的本地大模型,支持SSE

最近大家都在玩LLM&#xff0c;我也凑了热闹&#xff0c;简单实现了一个本地LLM应用&#xff0c;分享给大家&#xff0c;百分百可以用哦&#xff5e;^ - ^ 先介绍下我使用的三种工具&#xff1a; Ollama&#xff1a;一个免费的开源框架&#xff0c;可以让大模型很容易的运行在…

Thread线程控制之sleep、join、setDaemon方法的用处

Thread线程控制之sleep、join、setDaemon方法的用处 sleep方法 public static void sleep(long millis) throws InterruptedException使当前正在执行的线程以指定的毫秒数暂停&#xff08;暂时停止执行&#xff09;&#xff0c;具体取决于系统定时器和调度程序的精度和准确性…

20232815 2023-2024-2 《网络攻防实践》实践十一报告

20232815 2023-2024-2 《网络攻防实践》实践十一报告 1.实践内容 网络渗透&#xff1a; 网络渗透是攻击者常用的一种攻击手段&#xff0c;也是一种综合的高级攻击技术&#xff0c;同时网络渗透也是安全工作者所研究的一个课题&#xff0c;在他们口中通常被称为”渗透测试&…

数据结构:双链表

数据结构&#xff1a;双链表 题目描述参考代码 题目描述 输入样例 10 R 7 D 1 L 3 IL 2 10 D 3 IL 2 7 L 8 R 9 IL 4 7 IR 2 2输出样例 8 7 7 3 2 9参考代码 #include <iostream>using namespace std;const int N 100010;int m; int idx, e[N], l[N], r[N];void init…

一个可以自动生成随机区组试验的excel VBA小程序

在作物品种区域试验时&#xff0c;通常会采用随机区组试验设计&#xff0c;特制作了一个可以自动生成随机区组试验的小程序。excel参数界面如下&#xff1a; 参数含义如下&#xff1a; 1、生成新表的名称&#xff1a;程序将新建表格&#xff0c;用于生成随机区组试验。若此处为…

C++中count()和count_if()函数简介

count()函数 [C] count函数 【C】统计string里面出现的字符的个数&#xff08;使用count函数&#xff09; algorithm头文件定义了一个count的函数&#xff0c;其功能类似于find。这个函数使用一对迭代器和一个值做参数&#xff0c;返回这个值出现次数的统计结果 #include algo…

uniapp - 填充页面

在上一篇文章中&#xff0c;创建了一个空白的文章模块页面。在这一篇文章&#xff0c;让我们来向页面中填充内容。 目录 页面效果涉及uniapp组件1.view2.swiper3.scroll-view4.属性解读1) class"style1 style2 .."2) circular单属性无赋值3) :autoplay"autoplay…