目录
💟这里是CS大白话专场,让枯燥的学习变得有趣!
💟没有对象不要怕,我们new一个出来,每天对ta说不尽情话!
💟好记性不如烂键盘,自己总结不如收藏别人!
🧡Redis实现消息队列
lpush&rpop / rpush&lpop
💌基于List结构实现先进先出队列,生产者lpush向List集合中存放信息,消费者rpop从List集合中获取信息。
🍠优点:
1)List数据结构有持久化。
2)支持多播。
🍠缺点:
1)无法及时获取消息,数据冗余。
2)没有确认机制。
pub&sub(发布订阅)
💌由生产者publish消息到所有频道,消费者subscribe监听的频道中的内容。
🍠缺点:
1)没有持久化,如果一个消费者宕机了,再启动后宕机期间产生的消息会丢失。
2)消费者被动接收消息。
3)没有确认机制。
🍠解决:
1)每个频道使用List结构存储信息,解决持久化问题。
2)消费者使用brpop/blpop+超时时间s(0:永久)阻塞接收信息,解决主动获取的延时问题。但是由于没有确认机制,最后一条消息依旧可能丢失。
P.S. block阻塞在连接上,当List结构为空时才会阻塞等待,后面的命令无法执行。
stream
💌基于基数树的数据结构,使用多个消费者组从不同的消息ID读取数据,每个消费者组内多个消费者为竞争关系。
// 创建消息队列que1,*为由Redis生成消息ID。
xadd que1 * msg "hello"
1.xadd+xread
// 若没有消费者组,相当于lpush&brpop,从第一个ID开始每次读一条。
xread count 1 block 0 streams que1 0-0
2.xadd+xreadgroup
// 创建消费者组group1。
xgroup create que1 group1 0-0
// 创建消费者consumer1,从当前ID获取信息。
xreadgroup group group1 consumer1 count 1 block 0 streams que1 >
// 查看消费者组group1内一个消费者未处理完成的消息。
xpending que1 group1 - + 1
// 确认消息。
xack que1 group1 未确认消息ID
// 将消息转给另一个消费者consumer2 处理。
xclain que1 group1 consumer2 min-idle-time 未确认消息ID
// 删除消息。
xdel que1 消息ID
🍠优点:
1)可持久化。
2)支持多播。
3)有确认机制。
🧡Kafka实现消息队列
💌可见之前的文章~