前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于Redis 实现一个轻量级的延迟队列

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

作者头像
路行的亚洲
发布2022-11-16 14:47:28
4930
发布2022-11-16 14:47:28
举报
文章被收录于专栏:后端技术学习后端技术学习

一、问题场景

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

二、基于redis实现延迟队列

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

业务系统调用Api:

代码语言:javascript
复制
sendMsg(topic, msgId, msg, delaySeconds, TimeUnit.SECONDS, ttlSeconds, TimeUnit.SECONDS, maxRetry)

相关参数说明:

主题:topic

消息体:msg

delaySeconds:延迟时间

TimeUnit.SECONDS:延迟单位

ttlSeconds:过期时间

TimeUnit.SECONDS:过期单位

maxRetry:重试次数

使用原因:

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

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

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

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

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

三、实现数据结构

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

代码语言:javascript
复制
client.zadd(key, score, member);

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

代码语言:javascript
复制
client.lpush(key, strings);

获取可以基于eval实现

代码语言:javascript
复制
client.eval(script, toByteArray(keyCount), params);

四、具体实现时序图

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-10-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 后端技术学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、问题场景
  • 二、基于redis实现延迟队列
  • 三、实现数据结构
  • 四、具体实现时序图
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档