【一篇详解Redis延时队列】redis的 list 数据结构常用来作为 异步消息队列 使用,使用 rpush/lpush 操作 入队 ,使用 lpop/rpop 来操作 出队
![一篇详解Redis延时队列](http://img.jiangsulong.com/220410/10213a422-0.jpg)
文章插图
> rpush my-queue Apple banana pear(integer) 3> llen my-queue(integer) 3> lpop my-queue"apple"> llen my-queue(integer) 2> lpop my-queue"banana"> llen my-queue(integer) 1> lpop my-queue"pear"> llen my-queue(integer) 0> lpop my-queue(nil)空队列
- 如果队列为空,客户端会陷入 pop的死循环 , 空轮询 不仅拉高了 客户端的CPU , Redis的QPS 也会被拉高
- 如果空轮询的客户端有几十个, Redis的慢查询 也会显著增加,可以尝试让客户端线程 sleep 1s
- 但睡眠会导致消息的 延迟增大 ,可以使用 blpop/brpop (blocking, 阻塞读 )
- 阻塞读在队列没有数据时,会立即进入 休眠 状态,一旦有数据到来,会立即被 唤醒, 消息延迟几乎为0
- 如果线程一直阻塞在那里,Redis的客户端连接就成了 闲置连接
- 闲置过久, 服务器 一般会 主动断开 连接, 减少闲置的资源占用 ,此时 blpop/brpop 会 抛出异常
- 分布式锁 加锁失败 的处理策略
- 直接抛出异常 ,通知用户稍后重试
- sleep 后再重试
- 将请求转移到 延时队列 ,过一会重试
- 抛出异常
- 这种方式比较适合由 用户直接发起 的请求
- sleep
- sleep会 阻塞 当前的消息处理线程,从而导致队列的后续消息处理出现 延迟
- 如果 碰撞比较频繁 ,sleep方案不合适
-
推荐阅读
- 两种拿盖碗的手法,男女各不同视频详解
- 阿里P9架构师分享:通俗易懂Redis原理,都是你没看过的
- 4000 字详解TCP超时与重传,看完没收获算我输
- 图文详解为什么电脑没有声音
- 最强 Java Redis 客户端
- 详解Web应用的底层逻辑,掌握Spring框架开发的思路
- 一文详解 MySQL 高可用之 DRBD
- VPC是什么,VPC能做什么,VPC详解
- 音频压缩编码的基本原理详解
- 记住这四点,彻底搞懂Redis到底快在哪里