当前位置:   article > 正文

Redis 实现消息队列_redis 消息队列

redis 消息队列

Redis 实现消息队列

导引

消息队列(Message Queue),从概念上来理解就是用来存放消息的队列,最简单的消息队列模型包括以下三个角色:

  • 生产者:发送消息到消息队列
  • 消息队列:存储和管理信息,也被称为消息代理(Message Broker)
  • 消费者:从消息队列中获取消息并处理消息

Redis也为我们提供了三种不同的方式来实现消息队列:

  1. List结构:基于List结构模拟消息队列
  2. PubSub:基本的点对点消息模型
  3. Stream:比较完善的消息队列模型(推荐

1. 基于List结构的消息队列

这种方式比较简单,因为Redis的list数据结构是一个双向链表,很容易模拟出队列的效果。

队列是入口和出口不在一边,对此我们可以利用:LPUSH 结合 BRPOP,或者 RPUSH 结合 BLPOP 来实现先进先出的效果

在这里插入图片描述

:这里使用BRPOP而不是RPOP是因为BRPOP能够实现阻塞的效果而RPOP不能

使用该方式实现消息队列的优缺点如下:

优点

  • 利用Redis存储,不受限与JVM内存上限
  • 基于Redis的持久化机制,数据安全性有保证
  • 能够满足消息有序性

缺点:

  • 无法避免消息丢失
  • 只支持单消费者

2. 基于PubSub的消息队列

PubSub(发布订阅),是Redis2.0版本引入的消息传递模型,消费者可以订阅一个或多个channel(频道),生产者向对应channel发送消息后,所有订阅者都能收到相关消息

它有以下命令:

  • SUBSCRIBE channel [channel]:订阅一个或多个频道

    在这里插入图片描述

  • PUBLISH channel msg:向一个频道发送消息

    在这里插入图片描述

  • PSUBSCRIBE pattern[pattern]:订阅与pattern格式匹配的所有频道

    在这里插入图片描述

具体操作如下所示:

在这里插入图片描述

该方式实现的消息队列支持多消费者的使用,但也存在着以下弊端:

  • 不能支持数据持久化,一旦redis宕机数据就会丢失
  • 无法避免消息丢失
  • 消息堆积有上限,超出上限后数据会丢失

3. 基于Stream的消息队列(推荐)

Stream是Redis5.0引入的一种新数据类型,能够实现功能完善的消息队列,因为它本身就是一个消息队列,所以我们可以直接通过命令来使用它:

3.1 XADD

作用:发送消息

在这里插入图片描述

其中:

  • key:队列名称

  • [NOMKSTREAM]:如果队列不存在,是否自动创建队列,默认是自动创建

  • [MAXLEN|MINID [=|~] threshold [LIMIT count]]:设置消息队列的最大消息数量

  • *|ID:消息的唯一id,表示由Redis自动生成,格式是“时间戳-递增数字”,一般推荐使用来自动生成

  • field value [field value …]:发送到队列中的消息,以键值对的格式录入,可以多个同时录入

举个栗子 本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/1012478

推荐阅读
相关标签