文章目录

  • Pre
  • 方案1 Pub/Sub
    • 优点
    • 缺点
    • 小结
  • 方案2 List
    • 优点
    • 缺点
    • 小结
  • 方案3 ZSet
    • 优点
    • 缺点
    • 小结
  • 方案4 stream


Pre

最终方案-----> Redis进阶-Stream多播的可持久化的消息队列

我们知道redis 5.x版本,作者提供了stream这种基于radix tree 基数树的数据结构,解决使用Redis实现MQ“百花齐放”的乱象。

这里我们来聊一聊使用Redis实现MQ的主要集中实现以及利弊


方案1 Pub/Sub

Redis-13Redis发布订阅

优点

  1. Pub/Sub的消息是 Fan Out 多播模式 ,每个订阅了Channel的消费者都能从Channel中获取到同等的信息。

缺点

  1. 消息没有持久化的机制。当消费者的连接断掉 后,再次重连,那么Channel中的消息对于该消费者而言将无法消费。

  2. 消费消息的速度和消费者的数量成反比. 当消费者的数量达到一定规模时,服务器的性能将线性下降,因此每个消费者获取到消息的延迟也线性增长

  3. 当生产者产生消息的速度远大于消费者的消费能力的时候,消费者会被强制断开连接,因此会造成消息的丢失

client-output-buffer-limit pubsub 32mb 8mb 60
当消费者的buffer积压超过32MB,或者在60s内消费者的buffer一直保持在8MB以上,那么该消费者就会被redis服务器给强制断开连接,可以修改这个配置,但无法预料修改后的会带来什么样的结果。


小结

Redis的Pub/Sub模型对于无法容忍数据丢失,消息可能积压的场景不太适合。


方案2 List

Redis进阶-List底层数据结构精讲

优点

  1. 消息可以持久化。当consumer断开连接或者crash的时候,再次去消费,历史消息会得以保留,可以从最后一次消费的位置进行消费

  2. 消息可以积压。当生产者产生消息的速度大于消费者的速度的时候,除了会耗费一些内存外,无其他影响

缺点

  1. 一个消息最多只能被消费一次 。 一条消息被一个消费者消费之后,这条消息就被删除了,其他的消费者再无可能重复消费掉这条消息。也就是说List方案的消息不是发散的,同一条消息只能被一个消费者消费。

小结

List方案适合应用在消息最多被消费一次的场景 .

如果想要消息被重复消费,需要通过其他手段来解决,比如

  • 一个消费者消费完消息之后,把它加入到另外一个队列的对尾,其他消费者从这个新建的队列中消费消息,这样就会造成多个消费者消费的顺序依赖,不能并行执行

  • 在消费者消费之前,对消息进行处理,把该消息写入到若干个队列中,这样能支持多个消费者同时消费,但是数据却被拷贝了多次


方案3 ZSet

优点

在5.0的stream出现之前,zset是这几种之中最复杂的实现方案,但是它能有效地解决Pub/Sub和List方案的不足。

  • ZSet支持消息持久化

  • ZSet支持消息重复消费。 ZSet使用的获取消息操作ZRANGEBYSCORE(返回有序集合中指定分数区间的成员列表) ,该操作不会删除消息

缺点

使用zset要考虑一下几点

  • 消息的顺序。 score至关重要,这关系到消息的先后顺序,比如使用timestamp+seq作为score能够保证消息的顺序。
  • 重复消息的添加。zset重复的消息是不能够添加到集合中的, 当消息一样的时候,如何存放,需要考虑

小结

基于上述原因 ZSet方案的实现相比list和pub/sub 相对复杂。


方案4 stream

千呼万唤始出来, stream解决你的绝大部分苦恼 ~

Redis进阶-Stream多播的可持久化的消息队列

Redis进阶-Redis 4种MQ 方案对比相关推荐

  1. Redis进阶-Redis的惰性删除

    文章目录 Pre del ------> unlink FLUSHDB/FLUSHALL --> FLUSHDB ASYNC/FLUSHALL ASYNC 异步队列 AOF Sync 扩展 ...

  2. Redis进阶-Redis集群 【高可用切换】【cluster-require-full-coverage】集群是否完整才能对外提供服务

    文章目录 Pre 需求 :集群不完整仍然需要对外提供服务 验证 Redis Cluster 架构 高可用切换 Code访问测试 继续停掉8006 ,验证集群是否down掉 Pre Redis进阶-Re ...

  3. Redis进阶-Redis缓存优化

    文章目录 缓存穿透 定义 原因 缓存穿透问题解决方案 缓存空对象 布隆过滤器 缓存同时失效 缓存同时失效解决方案 缓存雪崩 缓存雪崩的解决方案 缓存击穿 ( 热点缓存key重建优化 ) 缓存击穿的解决 ...

  4. Redis进阶-Redis安全相关操作

    文章目录 Pre port command lua script SSL proxy 小结 Pre 这里我们主要谈一下使用 Redis 需要注意的安全风险以及防范措施,避免数据泄露和丢失,避免所在主机 ...

  5. redis 缓存数据_Redis 缓存数据方案对比:常规 VS 高并发服务器

    1 Redis 是什么 Redis 是一种开源的非关系型数据库.起源于负载较大时,当前关系型数据库无法承载的情况. 到目前为止,Redis 可以用作数据库.缓存.消息处理.Redis 可以存储键和5种 ...

  6. Redis进阶-Redis对于过期键的三种清除策略

    文章目录 Pre Redis Key的超时设置处理 被动删除 主动删除 当前已用内存超过maxmemory限定时,触发主动清理策略 总结 Pre Redis-17Redis内存回收策略 Redis K ...

  7. Redis进阶-Redis持久化原理

    文章目录 Pre 快照原理 fork( 多进程) AOF 原理 AOF 重写 fsync 运维 Redis 4.0 混合持久化 Pre Redis-16Redis备份(持久化) Redis 的数据全部 ...

  8. Redis进阶 - Redis主从工作原理详解

    文章目录 主从配置 主从工作原理 全量复制 增量复制 主从复制风暴 主从配置 简要回顾一下,Redis的主从配置 复制一份redis.conf文件 将相关配置修改为如下值: port 6380pidf ...

  9. Redis进阶-Redis使用建议一二事

    文章目录 命令使用 客户端使用 命令使用 [推荐] O(N)命令关注N的数量 例如hgetall.lrange.smembers.zrange.sinter等并非不能使用,但是需要明确N的值.有遍历的 ...

最新文章

  1. FZU - 2020 计算大组合数取模
  2. Dataset之MNIST:MNIST(手写数字图片识别+ubyte.gz文件)数据集的下载(基于python语言根据爬虫技术自动下载MNIST数据集)
  3. SpringMVC自定义视图 Excel视图和PDF视图
  4. .NET应用迁移到.NET Core--调查案例
  5. mysql 表丢失_Mysql数据库备份 部分数据表丢失 Mysql table doesn't exist 解决
  6. word-break属性和css换行显示
  7. 在 Win10 中配置 Linux 开发环境
  8. 4年猎洞赚百万美金:谈谈我的入门和成功经验
  9. 类和对象编程(二):类访问修饰符
  10. c++ vector,list,deque,map,set,hash_map 特点及区别
  11. 计算机论文指数,我国计算机领域学术论文引用中的马太效应——以《计算机学报》和《计算机研究与发展》为例...
  12. python3 爬取半次元cosplay图片
  13. macbook黑屏_Macbook苹果笔记本电脑开机黑屏如何解决【解决方法】
  14. linux常见服务解释
  15. web性能测试的关注点
  16. vue3.0 + tsx 构建el-button
  17. 用php实现加减乘除计算器,利用php怎么编写一个加减乘除计算器
  18. 【input 身份证号】星号 代替,input 切割成 多个 小格格(类似)
  19. 20200329——剑指offer 面试题49:丑数
  20. 【油猴脚本 Greasemonkey】GM_xmlhttpRequest内部实现原理

热门文章

  1. 图形界面不卡的linux,图形化界面linux(linaro)的安装小结
  2. C++ 中的 inline 用法
  3. C++ 重载运算符和重载函数(一)
  4. Leetcode 349. 两个数组的交集 (每日一题 20211014)
  5. Leetcode 189. 旋转数组 (每日一题 20210909)
  6. Leetcode 61 旋转链表 (每日一题 20210723)
  7. 文巾解题 67. 二进制求和
  8. Elasticsearch 使用过程中有哪些坑?教你避开这些坑
  9. hadoop学习--数据排序
  10. hive解决数据倾斜问题_八种解决 Spark 数据倾斜的方法