首页 > 数据库 >使用redis做消息队列mq的总结

使用redis做消息队列mq的总结

时间:2022-12-14 11:37:40浏览次数:55  
标签:消费者 队列 redis list subscribe mq 消息 丢失


总结

目前使用redis做消息队列的的方式有3中,list,      publish/subscribe,       stream

list做mq的总结

使用方法

1. 生产者可以 lpush 写入消息,消费者可以 rpop 读取消息,也就是pull模式

2. 消费者可以使用 brpop 阻塞性读取消息,约等于服务器端的实时推送

3. 如何保证消息读取但未处理时,消费者程序异常宕机造成的消息丢失,答案:rpoplpushbrpoplpush ,即先从原队列中移除一个消息并插入到一个新队列,消费者处理完该消息后再从新队列中删除,相当于ack机制,避免消费者异常时消息丢失

缺点

1.一个消息只能被消费一次,缺乏广播机制

缺点举例:游戏开发中,玩家登陆时,很多进程需要监听该登陆消息做对应的处理,但是因为list消息只能被消费一次,无法满足需求(虽然你可以为登陆事件搞多个list,每个关心登陆事件的进程监听一个list,登陆时也把一个消息压入多个list,只是生产者消费者太过耦合)

publish/subscribe

使用方法

1. 生产者可以 publish 写入消息,消费者可以 subscribe 监听消息,也就是push模式

2. 多个消费者可以 subscribe 同一个消息,消费者publist后,所有的消费者都能收到通知,以此解决了list中一个消息只能被消费一次的缺点

3. 可以使用通配符*进行简单的正则匹配,比如多个类似channel(广东深圳频道,广东广州频道,广东东莞频道)这个时候消费者可以 subscribe 广东*频道 来监听所有这样的频道

缺点

1. 解决了list做mq时消息不能广播的问题

2. 服务器是即时推送,不保存消息,所以消费者一旦断线,消息就丢失了

3. 消息无堆积,不能削峰填谷。因为服务器不考虑消费者,只按照生产者的速度推送。若消费者速度慢,消息就会在client连接的buf中堆积,超过阀值后会断开连接,这样消息就全部丢失了

stream

使用方法

具体使用过可参考笔者的这篇博客

​​redis 流 stream的使用总结 - 基础命令_YZF_Kevin的博客

优点

1. 完全对标kafka的模型重新设计的全内存的mq,速度高于kafka

2. pull模式,且有ack机制。且数据也会随着持久化保存在rdb和aof文件中,即使redis重启,保证数据不会丢失

3. 有消费者组的概念,一个topic可以有多个消费者组,一个消费者组内可以有多个消费者,既支持消息广播(一条msg能被多个不同的消费者组重复消费),又可以水平扩展(一个消费者组内增加多个消费者依次增加处理速度)

缺点

1. 完全用内存做消息堆积,相比那些以硬盘做堆积的,成本较高

2. redis存在数据丢失的可能性(单点redis持久化时everysec也可能会丢失一秒的数据;集群redis的主从同步也可能会丢失数据)

标签:消费者,队列,redis,list,subscribe,mq,消息,丢失
From: https://blog.51cto.com/u_15912066/5936254

相关文章

  • centos7 redis5.0以后版本 集群部署示例
    简言1.redis5.0版本以前的集群部署是使用ruby脚本完成的,略为复杂2.本篇博客讲解redis5.0版本以后的集群部署,由于集成到了create_cluster中(位置:redis根目录/utils/create-c......
  • ubuntu16 redis5.0以后版本集群部署示例
    简言1.redis5.0版本以前的集群部署是使用ruby脚本完成的,略为复杂,具体示例见笔者的这篇博客,​​ubuntu16redis5.0以前版本集群部署示例_YZF_Kevin的博客2.本篇博客讲解red......
  • centos7 redis5.0以前版本 集群部署示例 - 第一篇
    简言1.redis5.0版本以前的集群部署是使用ruby脚本完成的,ruby脚本的安装少略麻烦(主要原因是系统自动安装的版本太低,无法部署集群,必须手动安装)2.redis5.0版本以后的集群部署......
  • ubuntu16 redis5.0以前版本集群部署示例
    简言1.redis5.0版本以前集群的部署是使用ruby脚本完成的,ruby脚本的安装少略麻烦(主要原因是系统自动安装的版本太低,无法部署集群,必须手动安装)2.redis5.0版本以后把集群的部......
  • redis反杀面试官之10问
    简言1.笔者近几年来一直使用redis,也对redis有过仔细的研究,不敢说精通,熟悉至少是有的2.redis越来越火,网上相应的文章,总结,面试问题也有很多,但大多是应付简单面试用的,如果面......
  • basic-paxos、 multi-paxos、 raft 、redis的raft 一致性算法总结
    阅读本篇博客前,希望各位对basic-paxos、multi-paxos、raft算法有基本的了解总结basic-paxos算法,也就是经典的paxos算法1)  2PC(2phasecommit,也就是2阶段提交),分为 prep......
  • 常用队列系统设计,通用his就诊叫号抢号模式,通用his体检叫号自动分配模式
    2022年12月12日14:03:33通用his就诊叫号抢号模式流程说明:患者挂号之后,到就诊科室区域,在护士站刷卡,进入队列,等到叫号屏排队,医生看完当前病人之后,点击叫号软件,从科室队列获......
  • 栈和队列
    3.1栈栈是限定插入或删除操作只能在表尾进行的线性表;后进先出 顺序栈:类似于顺序表,指向表尾(最后插入的位置)作为栈顶指针在非空栈中,栈顶指针top并不是指向栈顶元素,而......
  • 《Redis DevOps》二:API的理解和使用
    概述数据结构与内部编码优点:1)改进内部编码时,对外数据结构与命令无影响2)多种内部编码适配不同使用场景单线程架构单线程访问快速的原因:1)纯内存访问2)非阻塞IO,ep......
  • 《Redis DevOps》一:初识Redis
    初识Redis简介Redis(REmoteDictionaryServer)是一种基于键值对的NoSQL数据库,主要有string/hash/list/set/zset5种基本数据结构,字符串演变出bitmaps位图和HyperLogLog,3.2......