Redis延时队列解决方案:List、Streams、Pub/Sub应用详解

创始人
2025-02-27 06:37:37
0 次浏览
0 评论

redis应用 2:延时队列

我们通常倾向于采用RabbitMQ和Kafka作为中间件,以在应用程序之间实现异步消息。
但是这两次中间战争是特征的,可能不了解许多人。
熟悉RabbitMQ的朋友知道它以复杂的方式工作。
在发送消息之前,您需要进行交换并排队并通过规则绑定。
同时,您需要指定路由密钥和控制标头信息。
消费者还必须在食用新闻之前经历类似的烦人过程。
在大多数情况下,我们的消息队列只有一个消费者集,但仍然需要经过此阶段。
Redis的出现促进了解决这个问题的解决方案。
对于仅使用一个消费者组的消息队列,您可以使用Redis轻松实现它。
Redis的消息队列不是专业消息队列,没有高级功能,并且消息的可靠性很高。
REDIS的列表(列表)数据结构通常用于异步消息试验。
使用RPUSH/LPUSH工作输入队列,并使用LPOP和RPOP退出队列。
客户通过POP WORK进行处理。
以这种方式收到处理后处理并循环循环的消息。
这是客户的生命周期,是队列消费者。
但是,如果队列为空,客户将落入流行循环中,并希望继续收到消息。
这不仅会浪费资源,而且还会增加客户的CPU使用和REDIS QP。
通常,您可以通过睡眠来解决此问题。
停止暂停螺纹1 秒钟,以减少CPU使用情况和REDIS的QP。
但是,这种方法增加了消息等待时间。
如果有几个消费者,此延迟将减少。
但是,更好的解决方案是使用BLPOP/BRPOP。
这两个指令的前缀字符B表示一个块(读取块)。
如果队列中没有数据,您将立即入睡。
数据到达时立即使用。
BLPOP/BRPOP而不是LPOP/RPOP允许您完美地解决此问题。
但这不是一个完美的解决方案。
当线程被阻止时,REDIS的客户端连接是空闲连接,并且可以预先发布服务器以减少空闲资源的使用。
目前,BLPOP/BRPOP将抛出异常。
因此,在撰写客户消费者时,您需要捕获并重试。
在上一堂课中,我们引入了分布式锁定问题,但没有提及客户在处理请求时没有添加锁定的情况。
有三种处理锁定故障的策略。
换句话说,除了直接例外,睡眠和延迟队列。
延迟提示可以通过REDIS的ZSET实现。
用带有ZSET值的字符串序列化消息,消息的到期时间是分数。
然后使用多个线程安装ZSET来获取过期的任务进行处理。
Redis的Zem方法是与工作竞争的多线程和多过程的核心。
唯一的生殖器所有者是通过ZEM确定的。
同时,handle_msg的句柄必须保证例外。
为了优化这种逻辑,您可以使用Luasscripting来避免浪费,当多个过程与多个过程竞争以与多个过程竞争。

Redis命令详解:Lists

该列表是REDIS的基本数据类型之一,类似于Java中的LinkedList。
该列表最多包含2 ^3 2 个元素,通常用于模拟队列中的操作。
以下是与列表有关的命令的详细介绍:BLPP FIRST版本:2 .0.0时间复杂度:O(1 )使用:BLPP是LPOP的锁定版本。
当列表中没有元素出现时,连接将被阻止。
当您提供更多键时,将按照参数键的顺序检查每个列表,并将显示非空列表的标题的第一个元素。
超时表示块秒的最大数量,而0表示超时表示无限块。
当将多个元素同时推入列表时,将显示Blocker BLPP命令的哪个元素? Redis 2 .4 和2 .6 版本中的处理方法不同。
客户阻止和等待,B客户执行推送操作。
Redis 2 .6 后,客户将返回C; 如果您需要等待新的设定元素并阻止尾巴,则可以使用BLPP。
伪模型的示例如下:消费者:生产者:BRPOP原始版本:2 .0.0时间复杂性:或(1 )BRPOP基本上与蓝色基本相同,区别在于它是用尾巴呈现的。
BRPOPLPUSH第一个版本:2 .2 .0时间复杂性:O(1 )是Rpoplpush的群众版本。
当源包含元素时,它的行为类似于rpoplpush; lindex第一版:1 .0.0时间复杂度:o(n),n是目标元素扩展的元素数量。
当索引为0或-1 时,时间的复杂性为或(1 )。
使用:将元素返回列表中指定的位置。
索引从0,-1 开始代表倒数第二个元素-2 代表倒数第二个元素,等等。
Linsert Prime版本:2 .2 .0时间复杂性:O(n),n是在找到参考值之前已经越过元素的数量。
使用:将值插入前面或参考值后面。
如果键不存在,则将其视为空列表。
命令在插入操作后返回列表的长度。
LLEN PRIME版本:1 .0.0时间复杂性:O(1 )返回指定键列表的长度。
如果不存在密钥,则将其视为空列表并返回0。
如果密钥不是列表类型,则将报告错误。
LPOP第一节经文:1 .0.0时间复杂性:O(1 )消除并返回列表的第一个元素。
如果不存在密钥,请返回零。
LPUSH PRIME版本:1 .0.0时间复杂性:O(1 )插入列表头部指定的所有值。
如果不存在密钥,则创建和插入一个空列表。
如果密钥不是列表类型,将报告错误。
可以按顺序从左到右插入更多元素。
LPUSHX PRIME版本:2 .2 .0时间复杂度:O(1 )当键存在时,将指定元素插入头部。
如果键不存在,则不会执行操作。
LRANGE第一版:1 .0.0时间复杂度:O(S+N),S是初始元素的偏移,N是指定间隔中的元素数。
使用:返回指定密钥的指定间隔的元素。
开始和逮捕是季票(从0开始),这可能是负数。
结果包含带有Peice的元素作为停止。
启动或停止遥不可及,并返回一个空列表。
LREM第一版:1 .0.0时间复杂性:O(1 )删除列表中上一个计数中出现的值。
键不作为空列表存在,并返回0。
lsetfirst版本:1 .0.0时间复杂度:o(n),n是列表的长度。
使用:设置指定帧的值。
如果Peice超过间隔,将报告错误。
ltrim Prime版本:1 .0.0时间复杂性:O(n),n是被消除元素的数量。
使用:剪切现有列表,剪切列表仅包含指定间隔中的元素。
开始和逮捕是从0开始的指数。
开始和逮捕可能是负数。
如果无法触及,则不会根据实际参数报告和处理错误。
RPOP第一版:1 .0.0时间复杂性:O(1 )消除并返回列表的最后一个元素。
密钥不存在并返回零。
从版本中获取的rpoplpush:1 .2 .0时间复杂性:或(1 )原子返回并消除源的最后一个元素,并将元素存储在目标的第一个元素的位置。
例如,原点保存A,B,C,Save X,Y,Y,Z,并且在执行后,源保存A,B和目标保存C,X,Y和Z。
返回已删除并存储到目的地的元素。
rpushversion之前:1 .0.0时间复杂性:o(1 )将指定元素插入指定键的尾部。
如果不存在密钥,则创建一个空列表。
关键类型未列出会发出错误。
版本2 .4 后,可以一次从左到右插入更多值。
rpushx我进行了版本:2 .2 .0时间复杂性:o(1 )如果键不存在,则不会执行操作,与RPUSH不同。

Redis 消息队列的三种方案(List、Streams、Pub/Sub)

在消息后面的三个解决方案中,队列涉及白色,河流和酒吧 /在背面的机制下。
作为分布式帐户体系结构的核心组成部分,Messenger队列具有当前的COIT,可靠的交付,广播,流量和最后一致性,并且用于内部通信。
尽管市场上不再有各种各样的开源消息队列(例如Rabbitmq,Kafka,Zeromq,Kafka,Kafka,Zeromq,Mysql和Grysique,MySQL,MySQL,以及残留的残留物以及队列的效果吗?不仅返回数据操作能力,而且还提供了灵活的和多样性的功能,并且还提供了灵活性和多样性 构建消息队列的解决方案。
使用背部的队列,有一些关键问题要注意,并有一系列消息队列操作列表,阻止阅读(例如BLPOP,BRPOP)可以有效地避免不必要的CPU头。
为了使消息可靠性,可以在业务处理后安全完成以实现口头确认后从队列中采用消息确认机制来从队列中删除消息。
此外,酒吧的背部 /机制背面允许客户订阅频道,多播消息的复杂性的效果,并为消息队列提供更灵活的通信模式。
但是,酒吧 /下游模型在毅力和可靠性一词中存在局限性,因此数据结构的河流回溯提供了强大而安全的杂乱排队的能力。
在很短的时间内,向后提供的白色,河流和酒吧 /酒吧 /酒吧提供了多种选择,以实现高效,指定和可扩展的消息队列。
在实际项目中,根据业务需求和沙拉角色,开发人员可以轻松地使用这些机制来构建满足各种需求的消息队列系统。

Redis使用bitmap、zset、hash、list等结构完成骚操作?

当同时满足以下条件时,请使用Ziplist编码:Springboot:实现X,除了Necondi的Negon的盟军外,在Necondi的宗教上:借助REDIS的ZSET集合,得分存储了异常的时间,并在一定时间间隔内获得集合集。
确定设定的数字是否符合条件,并在满足情况下触发警报。
API相关:基于与Redis的API有关的延迟延迟尾部设计方案的简介:SpringBoot2 .x:使用Redis的位图实现Bloom集。
有一个错误率:集合中未找到的元素将在集合中错误地判断。
因此,Bloom过滤器适用于准确性要求不那么严重的情况,但在时间和空间方面相对有效。
实现方法:REDIS实现了盛开的过滤器 - 从guava的算法BF借用:使用redis在Springboot2 .x中使用redis的bitmap(工具类)结构。
注意:使用位图存在风险。
通常,必须在剩余过程中获得哈希的价值。
根据REDIS有钥匙的事实确定是否获得块; 因此,Redis哈希结构应用于存储块对象。
3 .1 如何解决发布块中网络波动的问题? 有必要在块中添加超时时间。
线程正确阻塞后,它可以启动一个背景线程并每隔几秒钟检查一次。
在Master-Slave Switch期间,从从服务器上没有锁定信息,同时导致了多个客户端的块。
列表列表的基础层是Ziplist/QuickList(您可以查看双端尾巴)。
常用命令:将列表用作对象的缓存池。
将RPUSH的对象放置,然后使用LPOP卸下对象。
如果是阻止程序,则可以使用BLPP命令来实现它。
REDIS和LUA脚本(令牌存储桶的当前限制的实现)选择了哈希数据结构。
哈希维护:最后一次包含在令牌中,存储桶中的当前令牌量,存储桶中的最大数字和令牌(元数据)的定位速度。
被动维护:累积刺激计数的积累; 窗口时间结束时,请重置0。
优点:简单实现且易于理解; 1 系统服务一段时间内不可用(不超过时间窗口)。
例如,窗口的大小为1 ,当前限制为1 00。
碰巧1 00个请求到达第一个MS的某个窗口,因此将拒绝2 ms-9 9 9 ms的请求。
在此期间,用户会觉得系统服务不可用(即这不是很规律的)。
2 在窗口切换期间可能会发生阈值贩运的两倍的请求。
例如,窗口的大小为1 ,当前限制的大小为1 00,因此在某个窗口的9 9 9 毫秒上有1 00个请求,并且在窗口的初始阶段中没有请求。
因此,这1 00条请求将获得批准。
因此,在下一个窗口的第一个MS中将有1 00个其他请求,然后所有内容都将通过。
实际上,在1 毫秒内也有2 00条批准。
命令:Redis的Intris命令是对固定窗口组合的组合的优化,该命令解决了窗口宣誓就职的情况是阈值两倍的情况。
具体解决方案是:将电流的限制窗口分为多个窗口,以限制小电流,并计数每个窗口限制电流。
什么时候当前时间大于最大窗口时间,丢弃了头部的小窗口数据,并在队列中添加一个小窗口以处理新的请求。
优点:本质上,是固定窗口的优化
热门文章
1
高效掌握:CMD命令轻松启动、关闭及登录... 如何用cmd命令快速启动和关闭mysql数据库服务开发中经常使用MySQL数据库...

2
MySQL分区删除技巧与8.0版本新特性... mysql删除分区在MySQL中,删除分区操作主要使用“可替代”的命令与“ dr...

3
Python代码实现:如何判断三角形的三... python三角形三条边长,判断能否构成三角形Python三角形的三个长边如下:...

4
深度解析:MySQL查询语句执行顺序及优... mysql查询语句执行顺序当这是由于执行SQL的过程时,了解其过程很重要。 ...

5
SQL教程:使用SUBSTRING和IN... sql取特定字符的前面几位字符selectsubstr('L-0FCLDRBCT...

6
MySQL日期差异计算方法:轻松获取日期... MySQL计算时间差两日期相减得月份mysql两时间相减得月MySQL计算时间之...

7
MySQL及SQL查询获取前10条数据方... MySql查询前10条数据sql语句是从MySQL获取前1 0个数据的SQL查询...

8
MySQL启动问题排查与解决指南 Mysql为什么启动不了如果要配置MySQL,则遇到无法启动的问题,可能是由于配...

9
DbVisualizer添加MySQL数... 如何在DbVisualizer中添加本地mysql数据库由于DbVisualiz...

10
SQL字段默认值设置全攻略:轻松实现自动... sql如何设置字段默认值设置SQL中某个字段的默认值;需要遵循几个步骤。首先您需...