枫原万叶,

本文探讨了在互联网业务中如何使用Redis实现延时队列,涉及过期事件监听、zset以及Redisson三种方案,分析了它们的优缺点,重点介绍了Redisson的封装和优势,如简单易用、低延迟、异步处理和分布式支持。

1、前言
随着互联网的发展,越来越多的业务场景需要使用延时队列。比如:

任务调度:延时队列可以用于任务调度,将需要在未来某个特定时刻执行的任务放入队列中。消息延迟处理: 延时队列可以用于消息系统,其中一些消息需要在一段时间后才能被消费。例如,在需要进行消息重试的情况下,可以将消息放入延时队列,并在一段时间后重新处理订单处理:在电商系统中,有时需要对订单进行一些处理,例如取消未支付的订单或处理退货请求。
会员到期提醒:如果你有一个会员制度,需要提醒会员其订阅即将到期,延时队列可以用于安排在到期日期前发送提醒通知。
缓解高峰期负载:在高峰期,系统可能会面临大量的请求和负载。延时队列可以用于将一些请求推迟处理,进行削峰处理.
随着技术的进步,实现的方式也愈来愈多种多样,以 Java 语言为例,实现的方式也是多如牛毛,例如使用JDK自带的工具包实现;使用任务调度框架实现;使用Netty的时间轮询实现;使用消息队列实现;使用Redis 实现等等。本文主要探讨 Redis 实现延时消息的几种不同的方案演进。

2、技术方案
如前文所述,使用 Redis 来实现延时消息的实现方式主要有 3 种

过期事件监听
Redis zset (有序集合)
Redisson
得益于 Redis 自身设计的优点,使用 Redis 完全可以支撑高性能的要求。

从可靠性和使用便利性上来考虑,三种方案优先级排序: Redisson > zset> 过期事件监听

3、方案一: 过期事件监听
3.1 核心设计与原理
Redis 的过期事件监听是基于 pub/sub 的,key 过期时会 pub 消息到一个内置的 channel 中,客户端可以通过监听这个 channel 获取到消息,:进而实现延时队列的功能

3.2 方案缺陷
缺陷 1: 不支持持久化,可靠性低

pub/sub 模式下的过期事件监听,消息并不会做持久化,会有消息丢失的风险。

缺陷2:不保证及时性

过期事件监听的方案听起来很好理解,也似乎很完美,但事实并非如此。主要是借助 Redis 删除过期 key 的消息监听,不保证及时性

Redis 的单线程设计,如果需要支持定时过期,在 Redis 高负载的情况下或者有大量过期键需要同时处理时,会造成 Redis 服务器卡顿,影响主业务执行。考虑到可用性,Redis 的单线程机制并不能很好地支持定时删除过期 key 的场景,所以 Redis 使用惰性删除 + 定期删除key 的方式
也正因为 Redis key 的删除不是过期即删除的,所以 key 删除时发送消息的时间也不一定是 key的过期时间。

失效场景可以参考下图:

4、方案二: zset
Redis 提供了有序集合 zset,我们也可以利用 zset 封装延迟消息
zset 的常用命令及解释

ZADD key score member [score member ...]: 向有序集合 key 中添加一个或多个成员,每个成员都带有一个分值 score


ZRANGEBYSCORE key min max [WITHSCORES]: 返回有序集合 key 中分值介于 min 和 max 之间的成员。可选的 WITHSCORES 参数表示同时返回成员和分值


ZREM key member [member ...]: 从有序集合 key 中移除一个或多个成员

4.1 核心设计与原理
核心设计为使用 zset + 定时轮询器,基于 zset 的 ZRANGEBYSCORE 命获取已过期的延时任务,流程如下图所示:

4.2 方案缺陷
直接使用 zset 也存在一些端

缺陷 1: 额外的资源消耗

使用有序集合作为延时队列,并且需要定期地检查有序集合中的任务是否需要被处理,会占用CPU

资源2缺陷 2:使用上不够友好

需要自行封装,增加编码,在维护上增加了许多成本

5、方案三: Redisson
基于 4.2 小节的考虑,我们可以考虑使用 Redisson 提供的延时队列,它也是基于 zset 实现

5.1 核心设计与原理
Redisson 封装的延时队列源码还是蛮多的,限于篇幅,之后看情况再补充源码分析篇。本文只讲解源码核心链路的封装。

Redisson 封装了两个核心队列: RBlockingQueue 和 RDelayedQueue,其中 RDelayedQueue 作为中间队列,RBlockingQueue 作为目标消费队列。

5.2 方案优点
简单易用:可以通过注册监听的方式获取延时消息。
批量处理,低延迟: Redisson 延时队列使用定时任务进行批量处理,而不是每个任务都单独处理。这种批处理方式减少了与Redis的通信次数,提高了处理效率
异步处理: Redisson的延时队列支持异步任务处理,减少了等待时间和阻塞,提升了整体的吞吐量和响应性能。
支持分布式: Redisson的延时队列可以在分布式环境中使用,并提供了分布式锁和协调机制确保多个节点或实例之间的任务处理的一致性和可靠性。
延迟更低: Redisson 底层使用了 HashedWheelTimer,基于时间轮算法,具有高性能、较高精确度、内存友好、并发安全的特点。

A007:初行者推荐祈愿 A008:奔行世间 A009:杯装之诗 A010:黎明巡礼 A011:南风之眷 A012:靖妖傩舞 A013:神铸赋形 A015:闪焰的驻足 A016:初行者推荐祈愿 A017:奔行世间 A018:闪焰的驻足 A019:杯装之诗 A020:神铸赋形 A021:神铸赋形 A022:奔行世间 A023:暂别冬都 A024:陵薮市朝 A027:深秘之息 A028:浮生孰来 A031:烟火之邀 A032:鱼龙灯昼 A033:赤团开时 A036:杯装之诗 A037:暂别冬都 A040:陵薮市朝 A041:浪涌之瞬 A045:叶落风随 A048:白鹭之庭 A049:焰色天河 A052:影寂天下人 A053:浮岳虹珠 A061:鬼门斗宴 A065:出尘入世 A071:华紫樱绯 A076:苍流踏花 A081:素霓伣天 A091:巡御蘙荟-提纳里 A092:陵薮市朝-钟离 A093:神铸赋形-猎人贯虹 A097:雳裁冥昭-赛诺 A098:杯装之诗-温迪 A099:神铸赋形-赤沙终末 A100:翩舞歈莲-妮露 A101:深秘之息-阿贝多 A102:神铸赋形-圣显绿箭 A103:月草的赐慧-纳西妲 A104:焰色天河-宵宫 A105:神铸赋形-千夜飞雷 A106:华紫樱绯-八重神子 A107:暂别冬都-达达利亚 A108:神铸赋形-神乐冬极 A109:余火变相-流浪者 A110:鬼门斗宴-荒泷一斗 A111:神铸赋形-图莱杜拉赤角 A112:影寂天下人-雷电将军 A113:苍流踏花-神里绫人 A114:神铸赋形-薙草波乱 A115:敕诫枢谋-艾尔海森 A116:烟火之邀-魈 A117:神铸赋形-裁叶萃光和璞鸢 A118:赤团开时-胡桃 A119:素霓伣天-夜兰 A120:神铸赋形-护摩若水 A121:迪希雅 A122:赛诺 A123:苇海信标/赤沙之杖 A124:申鹤 A125:神里绫华 A126:雾切之回光/息灾 A127:纳西妲 A128:妮露 A129:千夜浮梦/圣显之钥 A130:白术 A131:甘雨 A132:碧落之珑/阿莫斯之弓 A133:宵宫 A134:八重神子 A135:飞雷之弦振/神乐之真意 A136:艾尔海森 A137:万叶 A138:苍古自由之誓/裁叶萃光 A139:优菈 A140:可莉 A141:松籁响起之时/四风典 A142:珊瑚宫心海 A143:流浪者 A144:不灭月华/图莱杜拉的回忆 A145:林尼 A146:夜兰 A147:最初的大魔术/若水 A148:钟离 A149:公子 A150:贯虹之槊/冬极白星 A151:那维莱特 A152:胡桃 A153:万世流涌大典/护摩之杖 A154:莱欧斯利 A155:温迪 A156:金流监督/终未嗟叹之诗 A157:芙宁娜 A158:白术 A159:静水流涌之辉/碧落之珑 A160:赛诺 A161:神里绫人 A162:波乱月白经津/赤沙之杖 A163:娜维娅 A164:神里绫华 A165:裁断/雾切之回光 A166:雷电将军 A167:宵宫 A168:薙草之稻光/飞雷之弦振 A169:闲云 A170:纳西妲 A171:鹤鸣余音/千夜浮梦 A172:魈 A173:八重神子 A174:和璞鸢/神乐之真意 A175:千织 A176:荒泷一斗 A177:有乐御簾切/赤角石溃杵 A178:那维莱特 A179:万叶 A180:万世流涌大典/苍古自由之誓 A181:阿蕾奇诺 A182:林尼 A183:赤月之形/最初的大魔术 A184:流浪者 A185:白术 A186:图莱杜拉的回忆/碧落之珑 提取出 1.0-4.0版本的内容
12-04
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值