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

阻塞队列(RBlockingQueue)

作用和特点:

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

使用场景:

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

延迟队列(RDelayedQueue)

作用和特点:

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

使用场景:

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

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需要一直等待。已经有定时任务了,直接弹出即可
    // 从阻塞队列中取出一个元素,如果队列为空,返回 null
    return destinationQueue.poll();
}
相关推荐
vistaup几秒前
Android ContentProvier
android·数据库
4Forsee3 分钟前
【Android】View 事件分发机制与源码解析
android·java·前端
Pluchon5 分钟前
硅基计划5.0 MySQL 陆 视图&JDBC编程&用户权限控制
数据库·mysql·1024程序员节
摇滚侠9 分钟前
Spring Boot3零基础教程,自定义 starter,把项目封装成依赖给别人使用,笔记65
数据库·spring boot·笔记
不剪发的Tony老师9 分钟前
SQLiteSpy:一款轻量级的SQLite管理工具
数据库·sqlite
刘一说15 分钟前
Spring Boot 主程序入口与启动流程深度解析:从 `@SpringBootApplication` 到应用就绪
java·spring boot·后端
eguid_132 分钟前
【从零开始开发远程桌面连接控制工具】01-项目概述与架构设计
java·远程连接·远程控制·远程桌面·vnc·teamviewer
一 乐32 分钟前
车辆管理|校园车辆信息|基于SprinBoot+vue的校园车辆管理系统(源码+数据库+文档)
java·前端·数据库·vue.js·论文·毕设·车辆管理
得物技术42 分钟前
告别数据无序:得物数据研发与管理平台的破局之路
大数据·数据库·数据分析
百锦再1 小时前
Python、Java与Go:AI大模型时代的语言抉择
java·前端·vue.js·人工智能·python·go·1024程序员节