为什么Redis的消息机制不适合实现延时队列?

简介: 为什么Redis的消息机制不适合实现延时队列?

一、背景

之前了解到一个朋友通过监听key实现来实现延时队列的功能。


后面了解到包括Java单机版的DelayQueue以及RabbitMQ延时队列/延迟重试等相对更靠谱一些。


常见的有:


定期轮询(数据库等)

DelayQueue

Timer

ScheduledExecutorService

时间轮(kafka)

RabbitMQ

Quartz

Redis Zset

Koala

JCronTab

SchedulerX(阿里)

有赞延迟队列


具体参见链接:https://juejin.im/post/5b5e52ecf265da0f716c3203



二、为什么?

Redis通过key失效监听的方式实现延时队列,用到了PubSub机制。

在Redis5之前版本存在如下两个关键问题:


(1)Redis的PubSub消息不会持久化,Redis宕机后消息就会被抛弃。


(2)Redis的消息队列没有太多高级特性,没有ack保证,可靠性不高。


这样如果消费者没有ack就挂掉,重启后无法再处理这个消息,导致消息丢失。



三、总结

由于Redis5.9开始引入了Stream,Stream借鉴了Kafka的设计,加入了ack以及PEL以及高可用机制来避免消息丢失。


具体参见《Redis深度历险》Stream部分章节。


其中Stream的高可用章节提到:


"鉴于Redis的指令复制是异步的,在failover发生时,Redis可能会丢失极小部分数据,这一点Redis的其他数据结构也是一样。"


总之消息队列这一块安全性和可用性提升很大。


但是如果延时队列还是用的是之前的PubSub,风险依然很大。


如果用Redis实现延时队列可考虑使用Zset结构,将score设置为超期的时间戳,采用不断轮询小顶堆顶部来核查是否超期,从而试下你延时队列。


当然可以参考上面提到的其他更成熟的方案。


四、附录

介绍Stream的参考文章


https://redis.io/topics/streams-intro



http://xiaorui.cc/2018/06/07/%E6%B5%85%E5%85%A5%E6%B5%85%E5%87%BAredis5-0%E7%9A%84streams%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/


 

————————————————

版权声明:本文为CSDN博主「明明如月学长」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/w605283073/article/details/90553397

相关文章
|
NoSQL Java Redis
实现基于Redis的分布式锁机制
实现基于Redis的分布式锁机制
|
8月前
|
缓存 NoSQL 算法
Redis数据库的键值过期和删除机制
我们需要注意的是,虽然Redis提供了这么多高级的缓存机制,但在使用过程中,必须理解应用的特性,选择合适的缓存策略,才能最大化Redis的性能。因此,在设计和实施应用程序时,理解应用的数据访问模式,以及这些模式如何与Redis的缓存机制相互作用,尤为重要。
283 24
|
canal 缓存 NoSQL
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
根据对一致性的要求程度,提出多种解决方案:同步删除、同步删除+可靠消息、延时双删、异步监听+可靠消息、多重保障方案
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
|
编解码 NoSQL Java
使用Spring Boot + Redis 队列实现视频文件上传及FFmpeg转码的技术分享
【8月更文挑战第30天】在当前的互联网应用中,视频内容的处理与分发已成为不可或缺的一部分。对于视频平台而言,高效、稳定地处理用户上传的视频文件,并对其进行转码以适应不同设备的播放需求,是提升用户体验的关键。本文将围绕使用Spring Boot结合Redis队列技术来实现视频文件上传及FFmpeg转码的过程,分享一系列技术干货。
963 4
|
NoSQL API Redis
在C程序中实现类似Redis的SCAN机制的LevelDB大规模key分批扫描
通过上述步骤,可以在C程序中实现类似Redis的SCAN机制的LevelDB大规模key分批扫描。利用LevelDB的迭代器,可以高效地遍历和处理数据库中的大量键值对。该实现方法不仅简单易懂,还具有良好的性能和扩展性,希望能为您的开发工作提供实用的指导和帮助。
205 7
|
存储 缓存 NoSQL
大数据-45 Redis 持久化概念 RDB AOF机制 持久化原因和对比
大数据-45 Redis 持久化概念 RDB AOF机制 持久化原因和对比
224 2
大数据-45 Redis 持久化概念 RDB AOF机制 持久化原因和对比
|
设计模式 NoSQL Go
Redis 实现高效任务队列:异步队列与延迟队列详解
本文介绍了如何使用 Redis 实现异步队列和延迟队列。通过 Go 语言的 `github.com/go-redis/redis` 客户端,详细讲解了 Redis 客户端的初始化、异步队列的实现和测试、以及延迟队列的实现和测试。文章从基础连接开始,逐步构建了完整的队列系统,帮助读者更好地理解和应用这些概念,提升系统的响应速度和性能。
311 6
|
设计模式 NoSQL 网络协议
大数据-48 Redis 通信协议原理RESP 事件处理机制原理 文件事件 时间事件 Reactor多路复用
大数据-48 Redis 通信协议原理RESP 事件处理机制原理 文件事件 时间事件 Reactor多路复用
218 2
|
NoSQL 关系型数据库 Redis
Redis6入门到实战------ 九、10. Redis_事务_锁机制_秒杀
这篇文章深入探讨了Redis事务的概念、命令使用、错误处理机制以及乐观锁和悲观锁的应用,并通过WATCH/UNWATCH命令展示了事务中的锁机制。
Redis6入门到实战------ 九、10. Redis_事务_锁机制_秒杀