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消息队列 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

  您可能感兴趣的文章: