问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

redis应用 2:延时队列

发布网友 发布时间:2024-09-30 12:05

我来回答

1个回答

热心网友 时间:2024-09-30 16:19

我们通常倾向于采用 Rabbitmq 和 Kafka 作为中间件,以实现应用程序间的异步消息传递。然而,这两个中间件功能丰富,可能超出了许多人的理解。

熟悉 Rabbitmq 的朋友都知道,它操作复杂。发消息前需要创建 Exchange 和 Queue,并通过规则将它们绑定起来。同时,还需指定 routing-key 和控制头部信息。消费者在消费消息前,也需要进行类似的繁琐过程。尽管大多数情况下,我们的消息队列只有一组消费者,但仍然需要经历这些步骤。

Redis 的出现,为解决这一问题提供了便利。对于只有一组消费者的消息队列,使用 Redis 可以轻松实现。Redis 的消息队列并非专业的消息队列,缺乏高级特性,无法保证消息的可靠性,因此不适用于对消息可靠性要求极高的场景。

Redis 的 list(列表)数据结构常用于异步消息队列。使用 rpush/lpush 操作入队列,使用 lpop 和 rpop 来出队列。

客户端通过 pop 操作获取消息进行处理。处理完毕后,再次获取消息进行处理,如此循环。这就是作为队列消费者的客户端的生命周期。

然而,如果队列空了,客户端将陷入 pop 的死循环,不停地尝试获取消息。这不仅会浪费资源,还会导致客户端的 CPU 使用率和 Redis 的 QPS 增高。

通常,我们可以通过 sleep 来解决这个问题。让线程暂停 1 秒,以降低 CPU 使用率和 Redis 的 QPS。

然而,这种方法会导致消息延迟增大。如果有多个消费者,这个延迟会降低。但更好的解决方案是使用 blpop/brpop。

这两个指令的前缀字符 b 代表 blocking(阻塞读)。在队列没有数据时,它们会立即进入休眠状态。一旦数据到来,则立刻醒来。使用 blpop/brpop 替代 lpop/rpop,可以完美解决这个问题。

然而,这并非完美方案。如果线程一直阻塞,Redis 的客户端连接将成为闲置连接,服务器可能会主动断开连接,以减少闲置资源占用。此时,blpop/brpop 会抛出异常。

因此,在编写客户端消费者时,需要小心捕获异常,并进行重试。

上节课我们介绍了分布式锁的问题,但没有提到客户端在处理请求时加锁失败的情况。通常有三种策略来处理加锁失败:直接抛出异常、sleep 和延时队列。

延时队列可以通过 Redis 的 zset(有序列表)实现。我们将消息序列化成一个字符串作为 zset 的 value,消息的到期处理时间作为 score,然后使用多个线程轮询 zset,获取到期的任务进行处理。

Redis 的 zrem 方法是多线程多进程争抢任务的关键。通过 zrem 来决定唯一的属主。同时,要确保 handle_msg 的异常捕获,避免因个别任务处理问题导致循环异常退出。

为了优化这个逻辑,可以考虑使用 lua scripting 将 zrangebyscore 和 zrem 一起进行原子化操作,避免多个进程之间争抢任务时的浪费。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
少儿学什么舞蹈 青年学什么舞蹈好 成年人学什么舞蹈 福州企业最低工资标准 2013年厦门的底薪是多少 生产要素的需求有哪些性质 生产要素的需求有何特点? 什么是生产要素需求 微观经济学要素需求什么是条件要素需求?它和要素需求有什么不同?_百度... 养宠物的人遵守规则,是不是就能和别人平安相处呢? 我支票写羊字的时候再“万”下面多划了一顿号,其他很清楚,给对方公司的... 台风怎么分等级划分 ...自己骑自行车上一个很斗的坡没上去别人帮我推上去的但他把我的包拿... 怎样将自己制作的闪图放大并保存? ...自己骑自行车上一个很斗的坡没上去别人帮我推上去的但他什么意思把... 怎么把闪图保存在电脑上,然后上传到空间?要详细...急用 怎么把手机里的闪图发送到电脑上 有一艘船载重是800t,容积是795m³,现在装运生铁和棉花两种物资,生铁... 如雷贯耳褒义还是贬义 聚乙烯PE98膜是什么意思?与100膜又有什么区别?做进口塑料的帮帮我 soul如何注销手机号绑定的账号呢? 我是做酒水生意的是个体户,碰到一些团购的话需要开取发票的话 到哪里开... 拼多多运营单位性质怎么填?如何运营? 鉬靶检查:双乳腺体呈致密型,所见腺体呈团片状,类结节状混杂密度影。部分... 我检查双乳致密型腺体,双乳内见数枚椭圆形密度增高影,部分边界尚清,部分... 去灵堂时先上香还是先磕头 淀粉是什么淀粉简单介绍 双乳多量腺体型,实质呈片状密度增高,右乳外上见一不规则肿块影,边缘模 ... 为什么苹果手机隔空投送不了? 为什么苹果xr能把图片隔空投送给8p,但是8p要隔空投送图片给xr时候,xr却... 微信群如何召开电话会议? 带Lettuce连接池、多数据源配置的RedisTemplate方案 如何发起微信电话会议 ...逮鱼我要了两条,鱼塘水干了好多鱼,什么意思?我是个生意人、有什么... ...种类的鱼在鱼缸里。昨天梦见大鱼塘,好多鱼,然后我又掉下去了。这是... 2019小年阳历多少号 2019年小年是几月几号 移动代理这样为用户开卡违反法了吗 移动公司没经过我同意拿我的身份证给别人开卡触犯了我的什么权益?_百 ... ...中国移动充错了100元话费给我用身份证开卡的,我有事吗, 我梦见我妈被蛇咬了,很担心我妈 关于别人违法使用自己身份证办理移动电话 并欠费 用我的身份证办移动电话卡给别人有什么风险吗 脚气很严重腐烂怎么办 win8自带主题在哪个文件夹 梦见妈妈被自己养的蛇咬了两口,现实生活中老妈很怕蛇,这几天眼睛... 我的脚是怎么了,疼死了,开始是一点点腐烂现在是整只脚 ...和别人的聊天记录发给别人 怎么发 别人说是用微信公众号 但是我知道... 苹果手机为什么拨号没有声音 红米note右键在播放器中只能调节通话声音,不能调节媒体音量,耳机...