https://www.cnblogs.com/wt645631686/p/8454021.html

我们平时习惯于使用 Rabbitmq 和 Kafka 作为消息队列中间件,来给应用程序之间增加 异步消息传递功能。这两个中间件都是专业的消息队列中间件,特性之多超出了大多数人的理 解能力。

使用过 Rabbitmq 的同学知道它使用起来有多复杂,发消息之前要创建 Exchange,再创 建 Queue,还要将 Queue 和 Exchange 通过某种规则绑定起来,发消息的时候要指定 routing- key,还要控制头部信息。消费者在消费消息之前也要进行上面一系列的繁琐过程。但是绝大 多数情况下,虽然我们的消息队列只有一组消费者,但还是需要经历上面这些繁琐的过程。

有了 Redis,它就可以让我们解脱出来,对于那些只有一组消费者的消息队列,使用 Redis就可以非常轻松的搞定。Redis 的消息队列不是专业的消息队列,它没有非常多的高级特性, 没有 ack 保证,如果对消息的可靠性有着极致的追求,那么它就不适合使用。

异步消息队列

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

> rpush notify-queue apple banana pear (integer) 3
> llen notify-queue
(integer) 3
> lpop notify-queue
"apple"
> llen notify-queue(integer) 2
> lpop notify-queue"banana"
> llen notify-queue(integer) 1
> lpop notify-queue"pear"
> llen notify-queue(integer) 0> lpop notify-queue(nil)

上面是 rpush 和 lpop 结合使用的例子。还可以使用 lpush 和 rpop 结合使用,效果是一 样的。这里不再赘述。

队列空了怎么办?

客户端是通过队列的 pop 操作来获取消息,然后进行处理。处理完了再接着获取消息, 再进行处理。如此循环往复,这便是作为队列消费者的客户端的生命周期。

可是如果队列空了,客户端就会陷入 pop 的死循环,不停地 pop,没有数据,接着再 pop, 又没有数据。这就是浪费生命的空轮询。空轮询不但拉高了客户端的 CPU,redis 的 QPS 也 会被拉高,如果这样空轮询的客户端有几十来个,Redis 的慢查询可能会显著增多。

通常我们使用 sleep 来解决这个问题,让线程睡一会,睡个 1s 钟就可以了。不但客户端 的 CPU 能降下来,Redis 的 QPS 也降下来了。

队列延迟

用上面睡眠的办法可以解决问题。但是有个小问题,那就是睡眠会导致消息的延迟增大。 如果只有 1 个消费者,那么这个延迟就是 1s。如果有多个消费者,这个延迟会有所下降,因 为每个消费者的睡觉时间是岔开来的。

有没有什么办法能显著降低延迟呢?你当然可以很快想到:那就把睡觉的时间缩短点。这 种方式当然可以,不过有没有更好的解决方案呢?当然也有,那就是 blpop/brpop。

这两个指令的前缀字符 b 代表的是 blocking,也就是阻塞读。

阻塞读在队列没有数据的时候,会立即进入休眠状态,一旦数据到来,则立刻醒过来。消 息的延迟几乎为零。用 blpop/brpop 替代前面的 lpop/rpop,就完美解决了上面的问题。.

空闲连接自动断开

你以为上面的方案真的很完美么?先别急着开心,其实他还有个问题需要解决。 什么问题?—— 空闲连接的问题。

锁冲突处理

上节课我们讲了分布式锁的问题,但是没有提到客户端在处理请求时加锁没加成功怎么办。 一般有 3 种策略来处理加锁失败:

如果线程一直阻塞在哪里,Redis 的客户端连接就成了闲置连接,闲置过久,服务器一般

会主动断开连接,减少闲置资源占用。这个时候 blpop/brpop 会抛出异常来。 所以编写客户端消费者的时候要小心,注意捕获异常,还要重试。...

1、直接抛出异常,通知用户稍后重试

这种方式比较适合由用户直接发起的请求,用户看到错误对话框后,会先阅读对话框的内 容,再点击重试,这样就可以起到人工延时的效果。如果考虑到用户体验,可以由前端的代码 替代用户自己来进行延时重试控制。它本质上是对当前请求的放弃,由用户决定是否重新发起 新的请求。

2、sleep 一会再重试

sleep 会阻塞当前的消息处理线程,会导致队列的后续消息处理出现延迟。如果碰撞的比 较频繁或者队列里消息比较多,sleep 可能并不合适。如果因为个别死锁的 key 导致加锁不成 功,线程会彻底堵死,导致后续消息永远得不到及时处理。

3、将请求转移至延时队列,过一会再试;

这种方式比较适合异步消息处理,将当前冲突的请求扔到另一个队列延后处理以避开冲突。

摘自《Redis深度历险:核心原理和应用时间》

转载于:https://www.cnblogs.com/yszr/p/10583739.html

了解一下Redis队列【缓兵之计-延时队列】相关推荐

  1. 【Redis核心原理和应用实践】应用 2:缓兵之计 —— 延时队列

    我们平时习惯于使用 Rabbitmq 和 Kafka 作为消息队列中间件,来给应用程序之间增加异步消息传递功能.这两个中间件都是专业的消息队列中间件,特性之多超出了大多数人的理解能力.  使用过 Ra ...

  2. redis stream java消息队列_Redis 异步消息队列与延时队列

    消息中间件,大家都会想到 Rabbitmq 和 Kafka 作为消息队列中间件,来给应用程序之间增加异步消息传递功能.这两个中间件都是专业的消息队列中间件,特性之多超出了大多数人的理解能力.但是这种属 ...

  3. 应用 2:缓兵之计 ——延时队列

    1.redis做消息队列 使用list(列表) 数据结构常用来作为异步消息队列使用,使用rpush/lpush操作入队列, 使用 lpop 和 rpop来出队列 2.队列空了怎么办 客户端是通过队列的 ...

  4. TP6(thinkphp6)队列与延时队列

    安装 在此我就不再略过TP6的项目创建过程了,大致就是安装composer工具,安装成功以后,再使用composer去创建项目即可. think-queue 安装 composer require t ...

  5. springboot集成rabbitmq死信队列的延时队列使用

    目录         1.自动分列延时队列 2.应答失败自动转储延时再通知机制 ------------------------------------------------------------ ...

  6. RabbitMQ死信队列,延时队列

    死信队列 消息被消费方否定确认,使用channel.basicNack或channel.basicReject, 并且此时requeue属性被设置为false. 消息在队列的存活时间超过设置的TTL时 ...

  7. 你知道Redis可以实现延迟队列吗?

    作者:_BKing 来源:www.cnblogs.com/xiaowei123/p/13222710.html 最近,又重新学习了下Redis,深深被Redis的魅力所折服,Redis不仅能快还能慢( ...

  8. 你知道 Redis 可以实现延迟队列吗?

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 作者:_ ...

  9. RabbitMQ介绍与延时队列

    RabbitMQ特性 消息可靠性:典型的生产者-消费者模型,发送端有消息发送确认机制,服务端有消息持久化方案,消费端有消息Ack机制 灵活的消息路由分发:多种多样的交换机 多语言客户端开发AMQP:只 ...

  10. 【SpringBoot】43、SpringBoot中整合RabbitMQ实现延时队列(延时插件篇)

    死信队列实现篇,参考文章:[SpringBoot]60.SpringBoot中整合RabbitMQ实现延时队列(死信队列篇) 一.介绍 1.什么是延时队列? 延时队列即就是放置在该队列里面的消息是不需 ...

最新文章

  1. 小型企业组织建设第二阶段
  2. mysql+字符串后8位_字符的一字节8位问题
  3. 游戏与算法的必经之路
  4. 圆桌的项目Alpha冲刺——测试
  5. android gridview控件使用详解_Android开发实现自定义日历、日期选择控件
  6. python 隐藏命令行窗口_python如何只执行cmd中的动作,但消除或隐藏cmd窗口 - 小众知识...
  7. 一次Linux驱动升级的问题记录
  8. [python]Python概述
  9. MIDL2011报错。
  10. 【单片机课程合集】摩尔吧魔鬼集训营,单片机尽情学!
  11. html5 游戏营销,五大H5游戏营销成功案例,你都玩过了吗?
  12. 比较拼音的相似度,汉字纠错使用
  13. android 获取视频码率和缓存大小,android - 使用MediaCodec和MediaMuxer录制视频,但比特率和帧率不正确 - 堆栈内存溢出...
  14. MyBatis自带的缓存配置(Cache)
  15. 便利店卷疯了:便利蜂、罗森、易捷“激战”
  16. 什么是股票情绪量化指标?
  17. 智慧校园,用“智慧”培育“未来之花”
  18. Arthas Web-Console一站式解决方案
  19. 论文“Structure-from-Motion Revisited” 对ISFM改进的理解
  20. 使用第三方账号认证(一):钉钉扫码登录

热门文章

  1. mysql日志课程_【mysql课程七】 MySQL日志管理
  2. MAB多臂老虎机/赌博机
  3. Ubuntu16.04安装python3.6
  4. html5仿微博弹出,JS 仿腾讯发表微博的效果代码
  5. I/O、Applet以及其他主题
  6. Playing Atari with Deep Reinforcement Learning 中文 讲解2
  7. 【扫描线】【POJ-1177】Picture【周长并】
  8. SQL Server数据库的查询语句
  9. 数字值太大,plsql显示不全的设置
  10. DATEADD日期函数的使用