Redis消息队列的三种实现方式
目录
前言
为什么要使用Redis的消息队列?
成本低,对于RabbitMQ或是Kafka来说,已经是重量级的消息队列。
Redis的三种实现方式:
List实现消息队列
我们可以利用Redis中List的命令LPUSH与RPOP来实现消息的发送与接收,但是需要注意的是,队列中没有消息时,RPOP会返回null,不会向JVM中阻塞队列一样进行阻塞并等待消息,因此这里应该使用BRPOP来实现阻塞效果。
优点:利用Redis存储,不受限于JVM内存上限。
基于Redis的持久化机制,数据安全性有保证。
可以满足消息有序性。
缺点:无法避免消息丢失。
只支持单消费者。
PubSub消息队列
是Redis2.0版本引入的消息传递模型,顾名思义,消费者可以订阅一个或多个channel,生产者向对应的channel发送消息后,所有订阅者都能收到相关信息。
PubSub消息队列的基本命令
# 订阅一个或多个频道
SUBSCRIBE channel [channel]
# 向一个频道发送消息
PUBLISH channel msg
# 订阅与pattern格式匹配的所有频道
PSUBSCRIBE pattern [pattern]
优点:采用发布订阅模式,支持多生产者,多消费者。
缺点:不支持数据持久化。
无法避免消息丢失。
消息堆积有上限,超出时数据丢失。
Stream消息队列
Stream是Redis5.0之后引入新的数据类型,支持持久化,因此相比于PubSub更加安全,可以通过Stream实现一个功能完善的消息队列
发送消息的命令:
XADD key [NOMKSTREAM] [MAXLEN|MINID [=|~] threshold [LIMIT count]] *|ID filed value[filed value]
命令解释:
读取消息的第一种方法
命令如下
XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...]
命令解释:
XREAD命令的特点:
读取消息的第二种方法
将多个消费者划分到一个组(Consumer Group)当中,监听同一个队列。特点如下
创建消费者组命令:
XGROUP CREATE key groupName ID [MKSTREAM]
命令解释:
# 删除指定的消费者组
XGROUP DESTORY key groupName
# 给指定的消费者组添加消费者
XGROUP CREATECONSUMER key groupName consumername
# 删除消费者组中的指定消费者
XGROUP DELCONSUMER key groupname comsumername
从消费者组中读取消息
XREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds] [NOACK] STREAMS key [key ...] ID[ID ...]
命令解释:
Group类型的消息队列特点:
三种实现方式对比
LIST
PubSub
Stream
消息持久化
支持
不支持
支持
阻塞读取
支持
支持
支持
消息堆积处理
受限于内存空间,可以利用多消费者加快处理
受限于消费者缓冲区
受限于队列长度,可以利用消费者组提高消费速度,减少堆积
消息确认机制
不支持
不支持
支持
消息回溯
不支持
不支持
支持
到此这篇关于Redis消息队列的三种实现方式的文章就介绍到这了,更多相关Redis消息队列 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
您可能感兴趣的文章:
- .NET Core系列之MemoryCache 初识
- 007手机一键Root(安机网一键Root) v3.0 官方最新版 一键ROOT您的Android手机
- 12306密码被盗了怎么办?12306密码外泄解决方法
- 12个字的qq网名
- 150M迷你型无线路由器怎么设置?
- 192.168.1.1打不开怎么办?路由器192.168.1.1打不开的原因以及解决办法
- 2011年电子报合订本 电子报 编辑部 中文 PDF版 [84M]
- 2015年1月15日小米新旗舰发布会现场图文直播
- 2016.3.1vivo Xplay5新品发布会现场视频直播 优酷直播
- 2016华为P9发布会视频直播地址 4月15日华为P9国行发布会直播