共计 2049 个字符,预计需要花费 6 分钟才能阅读完成。
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 指令追加音讯时主动创立。
- Consumer Group:消费者组,消费者组记录了 Starem的状态 **,应用 XGROUP CREATE 命令手动创立,在同一个 Stream 内消费者组名称惟一。一个生产组能够有多个消费者 (Consumer) 同时进行组内生产,所有消费者共享 Stream 内的所有信息,但同一条音讯只会有一个消费者生产到,不同的消费者会生产 Stream 中不同的音讯,这样就能够利用在分布式的场景中来保障音讯生产的唯一性。
- last_delivered_id:游标,用来记录某个消费者组在 Stream上的生产地位信息 **,每个生产组会有个游标,任意一个消费者读取了音讯都会使游标 last_delivered_id 往前挪动。创立消费者组时须要指定从 Stream 的哪一个音讯 ID(哪个地位)开始生产,该地位之前的数据会被疏忽,同时还用来初始化 last_delivered_id 这个变量。这个 last_delivered_id 一般来说就是最新生产的音讯 ID。
- 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 多平台公布
正文完