首页 > 数据库 >Redis队列和阻塞队列

Redis队列和阻塞队列

时间:2023-11-09 18:04:05浏览次数:42  
标签:队列 Redis redis 阻塞 消息 超时

redis 队列的优点是轻量级,业务足够简单时不需要使用rabbitMq这样专业的消息中间件;缺点是弹出队列中的元素时,即使该消息处理失败也无法再次进行消费

Redis队列 List

Redis队列和阻塞队列_redis

简单演示如下

Redis队列和阻塞队列_redis_02

普通的redis队列,为了实现业务,通常会使用while进行循环,这样的话没有消息时依旧会频繁的执行循环,造成cpu的空转,所以一般会在代码中增加sleep来解决该问题,但因此又会造成消息延迟问题。

Redis队列和阻塞队列_redis_03

阻塞队列可以很好的解决这些问题。

Redis阻塞队列

redis队列提供了 “阻塞式” 拉取消息的命令:BRPOP / BLPOP,这里的 B 指的是阻塞(Block)。如果队列为空,消费者在拉取消息时就「阻塞等待」,一旦有新消息过来,就通知消费者立即处理新消息。

Redis队列和阻塞队列_阻塞队列_04

阻塞队列实现:

Redis队列和阻塞队列_redis_05

使用 BRPOP 这种阻塞式方式拉取消息时,还支持传入一个「超时时间」,如果设置为 0,则表示不设置超时,直到有新消息才返回,否则会在指定的超时时间后返回 NULL

下面是某业务完整的消费者代码

Redis队列和阻塞队列_redis_06

注意:

  1. 阻塞时间结束后代码会继续向下执行
  2. 如果设置的超时时间太长,这个连接太久没有活跃过,可能会被 Redis Server 判定为无效连接,之后 Redis Server 会强制把这个客户端踢下线。所以,客户端要有处理机制。实际项目中redis连接超时时间远大于20s,因此正常情况不会出现redis超时问题。以防万一增加redis异常捕获,出现异常时杀掉当前进程,同时supervisord会自动重新拉起该进程

标签:队列,Redis,redis,阻塞,消息,超时
From: https://blog.51cto.com/u_16330580/8285017

相关文章

  • redis 类型Hash 中value字符串存储空间大小
    在Redis中,Hash数据类型中的value是字符串,存储空间大小取决于存储在Hash中的每个value字符串的长度。Redis内部并不会额外存储每个value的元信息,因此存储空间大小主要由存储的字符串长度决定。每个字符串值的存储空间大小取决于以下因素:字符串长度:字符串的长度是主要的决定因素。较......
  • BlockingQueue队列详解
    /**本例介绍一个特殊的队列:BlockingQueue,如果BlockQueue是空的,从BlockingQueue取东西的操作将会被阻断进入等待状态,直到BlockingQueue进了东西才会被唤醒.同样,如果BlockingQueue是满的,任何试图往里存东西的操作也会被阻断进入等待状态,直到BlockingQueue里有空间才会被......
  • Redis内存淘汰策略
    内存淘汰策略分类早期版本的Redis有以下6种淘汰策略:noeviction:不淘汰任何数据,当内存不足时,新增操作会报错,Redis默认内存淘汰策略;allkeys-lru:淘汰整个键值中最久未使用的键值;allkeys-random:随机淘汰任意键值;volatile-lru:淘汰所有设置了过期时间的键值中最久未使用的键值......
  • redis特点
    知识点归纳:1.Redis速度快的原因:内存存储、C语言实现、单线程、优秀的源代码2.Redis支持的5种数据结构:字符串、列表、集合、有序集合、哈希3.Redis额外的功能:订阅、流水线、Lua脚本、键过期、事务4.Redis的简单现在:源代码少、单线程、不依赖类库,独立处理事件5.Redis支持多种语言6.Re......
  • SpringBoot AOP + Redis 延时双删功能实战
    一、业务场景在多线程并发情况下,假设有两个数据库修改请求,为保证数据库与redis的数据一致性,修改请求的实现中需要修改数据库后,级联修改Redis中的数据。请求一:A修改数据库数据B修改Redis数据请求二:C修改数据库数据D修改Redis数据并发情况下就会存在A—>C—>D—>B的情......
  • Redis 哨兵模式的原理及其搭建
    1.Redis哨兵Redis提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复。1.1.哨兵原理1.1.1.集群结构和作用哨兵的结构如图:哨兵的作用如下:监控:Sentinel会不断检查您的master和slave是否按预期工作。自动故障恢复:如果master故障,Sentinel会将一个slave提升为master。当......
  • 04-栈和队列
    4.栈和队列栈:push,pop,peek(返回当前值),empty队列:add,remove,peek(返回当前值),isEmpty4.1双向链表实现栈和队列4.2数组实现栈和队列加一个指针指向某个位置。队列:环形数组4.3最小栈1.题目https://leetcode.cn/problems/min-stack/设计一个支持push,pop,top操作,并能在常数......
  • 第二节:队列详解 和 面试题剖析
    一.        二.        三.         !作       者:Yaopengfei(姚鹏飞)博客地址:http://www.cnblogs.com/yaopengfei/声     明1:如有错误,欢迎讨论,请勿谩骂^_^。声     明2:原创博客请在转载......
  • Redis系列之常见数据类型应用场景
    目录String简单介绍常见命令应用场景Hash简单介绍常见命令应用场景List简单介绍常见命令应用场景Set简单介绍常见命令应用场景SortedSet(Zset)简单介绍常见命令应用场景Bitmap简单介绍常见命令应用场景附录Redis支持多种数据类型,比如String、hash、list、Set、SortedSet、Stream......
  • Redis哨兵集群
    ●slave节点宕机恢复后可以找master节点同步数据,那master节点宕机怎么办?哨兵的作用Redis提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复。哨兵的结构和作用如下:●监控:Sentinel会不断检查您的master和slave是否按预期工作自动故障恢复:如果master故障,Sentinel会将一个......