基于Redis 实现一个轻量级的延迟队列

简介: 想实现一个轻量级的延迟队列,此时可以考虑基于Redis来实现,如果当前的基础设施不是阿里云Mq,开源的RocketMQ只有18个等级,1ms~2h的18个等级。当然商业版的阿里云可以实现精度的延迟。

一、问题场景

想实现一个轻量级的延迟队列,此时可以考虑基于Redis来实现,如果当前的基础设施不是阿里云Mq,开源的RocketMQ只有18个等级,1ms~2h的18个等级。当然商业版的阿里云可以实现精度的延迟。


二、基于redis实现延迟队列

那如果基于redis实现延迟队列。首先需要考虑:

业务系统调用Api:

sendMsg(topic, msgId, msg, delaySeconds, TimeUnit.SECONDS, ttlSeconds, TimeUnit.SECONDS, maxRetry)

相关参数说明:

主题:topic

消息体:msg

delaySeconds:延迟时间

TimeUnit.SECONDS:延迟单位

ttlSeconds:过期时间

TimeUnit.SECONDS:过期单位

maxRetry:重试次数

使用原因:

如果发送失败,需要执行重试。发送的时候,需要考虑实时和延迟的情况的处理。

如果是实时的,如何处理?如果是延迟的,又如何处理?

如果实时的,则可以先将消息存到Redis中,然后执行操作,基于事件,发布需要生产的消息,然后订阅需要消费的消息,执行消费。

如果是非实时的话,需要基于定时任务触发器触发,触发当前的延迟队列消息,如果到了需要发送的时候,执行发送。此时的操作基于扫描定时任务和事件触发。

而且获取消息的时候,需要考虑基于原子操作实现,也即可以基于lua脚本实现。


三、实现数据结构

而需要实现对消息和延迟的实现,可以考虑基于zset数据结构实现。其中score可以作为延迟时间。

client.zadd(key, score, member);

而对应实时的消息,可以考虑lpush操作 即可

client.lpush(key, strings);

获取可以基于eval实现

client.eval(script, toByteArray(keyCount), params);


四、具体实现时序图

image-20221030173725522.png

目录
相关文章
|
11月前
|
存储 监控 NoSQL
使用Redis实现延迟消息发送功能
使用 Redis 的密码认证功能,为实例设置密码以防止未授权访问。为消息提供适当加密,确保消息内容在网络传输过程中不被窃取或篡改。
399 16
|
编解码 NoSQL Java
使用Spring Boot + Redis 队列实现视频文件上传及FFmpeg转码的技术分享
【8月更文挑战第30天】在当前的互联网应用中,视频内容的处理与分发已成为不可或缺的一部分。对于视频平台而言,高效、稳定地处理用户上传的视频文件,并对其进行转码以适应不同设备的播放需求,是提升用户体验的关键。本文将围绕使用Spring Boot结合Redis队列技术来实现视频文件上传及FFmpeg转码的过程,分享一系列技术干货。
1107 4
|
设计模式 NoSQL Go
Redis 实现高效任务队列:异步队列与延迟队列详解
本文介绍了如何使用 Redis 实现异步队列和延迟队列。通过 Go 语言的 `github.com/go-redis/redis` 客户端,详细讲解了 Redis 客户端的初始化、异步队列的实现和测试、以及延迟队列的实现和测试。文章从基础连接开始,逐步构建了完整的队列系统,帮助读者更好地理解和应用这些概念,提升系统的响应速度和性能。
371 6
|
消息中间件 存储 NoSQL
如何用Redis实现延迟队列?
综上所述,通过Redis的有序集合和一些基本命令,我们可以轻松地构建出功能完善的延迟队列系统。根据具体需求,可以进一步优化和扩展,以满足高性能和高可靠性的业务需求。
529 1
|
消息中间件 NoSQL Go
PHP转Go系列 | ThinkPHP与Gin框架之Redis延时消息队列技术实践
【9月更文挑战第7天】在从 PHP 的 ThinkPHP 框架迁移到 Go 的 Gin 框架时,涉及 Redis 延时消息队列的技术实践主要包括:理解延时消息队列概念,其能在特定时间处理消息,适用于定时任务等场景;在 ThinkPHP 中使用 Redis 实现延时队列;在 Gin 中结合 Go 的 Redis 客户端库实现类似功能;Go 具有更高性能和简洁性,适合处理大量消息。迁移过程中需考虑业务需求及系统稳定性。
436 1
|
NoSQL Linux Redis
Redis性能优化问题之想确认Redis延迟变大是否因为fork耗时导致的,如何解决
Redis性能优化问题之想确认Redis延迟变大是否因为fork耗时导致的,如何解决
|
NoSQL Redis
Redis性能优化问题之为什么配置为 appendfsync everysec 的 AOF 也可能导致 Redis 延迟变大
Redis性能优化问题之为什么配置为 appendfsync everysec 的 AOF 也可能导致 Redis 延迟变大
|
监控 NoSQL Redis
Redis性能优化问题之配置 Redis 的自动碎片整理功能,如何解决
Redis性能优化问题之配置 Redis 的自动碎片整理功能,如何解决
|
存储 缓存 NoSQL
Redis实现延迟任务的几种方案
Redis实现延迟任务的几种方案
|
存储 NoSQL Java
Redis 实现延迟任务的深度解析
【4月更文挑战第17天】
525 0