乐趣区

关于后端:redis-消息队列方案

redis 音讯队列计划

察看角度:音讯有序,反复音讯解决,音讯可靠性保障

pub/sub 公布订阅机制

list 汇合

音讯有序:lpush 和 rpop 能够保障音讯程序的被生产

反复音讯解决:list 没有为音讯提供惟一标识,须要生产者提供惟一标识,生产程序自行判断音讯是否反复

音讯可靠性保障:讲的是音讯因为网络,停电,宕机等突发因素失落,list 没有为音讯保留正本,这样消费者如果正在生产时有突发因素,那么就会产生音讯失落。

所以 list 做音讯队列时,如果是对音讯失落不是很敏感的场景能够应用。

stream

长处:反对长久化,反对生产组模式的音讯读取

Streams 同样可能满足音讯队列的三大需要。而且,它还反对生产组模式的音讯读取

Stream 根本构造

Redis Stream 像是一个仅追加内容的音讯链表,把所有退出的音讯都一个一个串起来,每个音讯都有一个惟一的 ID 和内容,它还从 Kafka 借鉴了另一种概念:消费者组(Consumer Group),这让 Redis Stream 变得更加简单。

Redis Stream 的构造如下:

每个 Stream 都有惟一的名称,它就是 Redis 的 key,在咱们首次应用 XADD 指令追加音讯时主动创立。

  1. Consumer Group消费者组,消费者组记录了 Starem的状态 **,应用 XGROUP CREATE 命令手动创立,在同一个 Stream 内消费者组名称惟一。一个生产组能够有多个消费者 (Consumer) 同时进行组内生产,所有消费者共享 Stream 内的所有信息,但同一条音讯只会有一个消费者生产到,不同的消费者会生产 Stream 中不同的音讯,这样就能够利用在分布式的场景中来保障音讯生产的唯一性。
  2. last_delivered_id游标,用来记录某个消费者组在 Stream上的生产地位信息 **,每个生产组会有个游标,任意一个消费者读取了音讯都会使游标 last_delivered_id 往前挪动。创立消费者组时须要指定从 Stream 的哪一个音讯 ID(哪个地位)开始生产,该地位之前的数据会被疏忽,同时还用来初始化 last_delivered_id 这个变量。这个 last_delivered_id 一般来说就是最新生产的音讯 ID。
  3. pending_ids消费者外部的状态变量,作用是保护消费者的未确认的音讯 ID。pending_ids 记录了以后曾经被客户端读取,然而还没有 ack (Acknowledge character:确认字符)的音讯。 目标是为了保障客户端至多生产了音讯一次,而不会在网络传输的中途失落而没有对音讯进行解决。如果客户端没有 ack,那么这个变量外面的音讯 ID 就会越来越多,一旦某个音讯被 ack,它就会对应开始缩小。这个变量也被 Redis 官网称为 PEL (Pending Entries List)。
插入音讯

往名称为 mqstream 的音讯队列中插入一条音讯,音讯的键是 repo,值是 5。* 号代表主动创立全局惟一的 id,也能够手动生成,但必须是增长且惟一的。

XADD mqstream * repo 5
"1599203861727-0"
读取音讯

应用 XREAD 以阻塞或非阻塞形式获取音讯列表,语法格局:

XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] id [id ...]
  • count:数量
  • milliseconds:可选,阻塞毫秒数,没有设置就是非阻塞模式
  • key:队列名
  • id:音讯 ID
创立消费者组(XGROUP CREATE)

应用 XGROUP CREATE 创立消费者组,语法格局:

XGROUP [CREATE key groupname id-or-$] [SETID key groupname id-or-$] [DESTROY key groupname] [DELCONSUMER key groupname consumername]
  • key:队列名称,如果不存在就创立
  • groupname:组名。
  • $:示意从尾部开始生产,只承受新音讯,以后 Stream 音讯会全副疏忽。

从头开始生产:

XGROUP CREATE mystream consumer-group-name 0-0  

从尾部开始生产:

XGROUP CREATE mystream consumer-group-name $

生产组命令

消费者组生产音讯(XREADGROUP GROUP)

应用 XREADGROUP GROUP 读取生产组中的音讯,语法格局:

XREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds] [NOACK] STREAMS key [key ...] ID [ID ...]
  • group:生产组名
  • consumer:消费者名。
  • count:读取数量。
  • milliseconds:阻塞毫秒数。
  • key:队列名。
  • ID:音讯 ID。
XREADGROUP GROUP consumer-group-name consumer-name COUNT 1 STREAMS mystream >

本文由 mdnice 多平台公布

退出移动版