Redis数据结构:流
流是一个包含0个或多个流元素的有序队列,队列中的每个元素都包含一个ID和任意多个键值对,这些元素会根据ID的大小在流中有序地进行排列。
数据结构
- 流
流
-
追加新元素
1.xadd命令 格式:xadd key [NOMKSTREAM] [MAXLEN|MINID [=|~] threshold [LIMIT count]] *|ID field value [field value …]
将一个带有指定ID以及包含指定键值对的元素追加到流的末尾,元素可以包含一个或多个键值对,且同一个流中的不同元素可以包含不同数量的键值对。在流中,元素会以有序方式存储键值对。
相关说明:
1)流元素的ID
ID由毫秒时间(UNIX时间戳)和顺序编号(以0为起始值)组成,两部分均使用64位的非负整数表示,Redis在接受流ID输入及展示时使用“-”分割此两部分。
Redis要求,新元素的ID必须比流中已有元素的ID大,毫秒时间大允许添加,毫秒时间同顺序编号必须大。
2)自动生成ID
xadd命令的id参数取“*”时,Redis将自动为新添加元素生成一个可用的新ID。
执行成功会返回ID值,ID不满足规则时报error。
xadd key ID field value [field value ...]
MAXLEN选项的作用是限制流的长度,即添加新元素时按照先进先出规则删除旧元素。
xadd key MAXLEN ID field value [field value ...]
-
修剪流
1.xtrim命令 格式:xtrim key MAXLEN|MINID [=|~] threshold [LIMIT count]
先进先出的原则将流修剪至指定长度,执行后返回被移除元素的数量。
xtrim key MAXLEN len
-
移除指定元素
1.xdel命令 格式:xdel key ID [ID …]
从流中移除指定ID对应的元素,执行后返回被移除元素的数量。
xdel key ID [ID ...]
-
获取流中元素数量
1.xlen命令 格式:xlen key
若流不存在或流中无元素则返回0。
xlen key
-
获取流元素
1.xrange命令 格式:xrange key start end [COUNT count]
以列表的形式返回结果,若流不存在或范围内无元素返回空列表(empty array)。start end为起始ID、结束ID,闭区间,“-”表示最小ID值,“+”表示最大ID值。COUNT用于指定返回的最大元素数量。
xrange key start end [COUNT count]
2.xrevrange命令 格式:xrevrange key end start [COUNT count]
逆序返回,ID从大到小的顺序。
xrevrange key end start [COUNT count]
3.xread命令 格式:xread [COUNT count] [BLOCK milliseconds] STREAMS key [key …] ID [ID …]
xread可以阻塞或非阻塞的方式获取流元素,COUNT为每个流返回元素个数的最大值,若某个流中元素不足COUNT个则全部返回。若STREAMS后查询单个流当流不存在时返回nil,查询多个流时当流不存在时无返回。
xread [COUNT count] STREAMS key [key …] ID [ID …]
BLOCK选项表示可以阻塞的方式执行xread命令,其值是任何大于0等于0的数值,给定0则表示阻塞直到出现可返回的元素。
xread [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...]
当使用阻塞方式BLOCK选项时,若只希望获取新出现的元素,Redis为xread提供了特殊ID参数$符号,使用$后命令就会只获取给定流在命令执行后新出现的元素.
xread [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] $ [$ ...]
消费者组
消费者组允许将一个流从逻辑上划分为多个不同的流,并让消费者组属下的消费者去处理组中消息。
-
创建消费者组
1.xgroup CREATE命令 格式:xgroup CREATE key groupname ID|$
ID值为要从流的哪个ID之后开始读取,$表示从尾部开始消费,只接受新消息,当前 Stream 消息会全部忽略。创建成功返回OK,不可重复创建。
xgroup CREATE key groupname ID|$
-
修改消费者组的最后递送消息ID
1.xgroup SETID命令 格式:xgroup SETID key groupname ID|$
流或消费者组不存在时报error,修改成功返回OK。
xgroup SETID key groupname ID|$
-
删除消费者
1.xgroup DELCONSUMER命令 格式:xgroup DELCONSUMER key groupname consumername
执行后返回消费者被删除时仍在处理的消息数量。
xgroup DELCONSUMER key
-
删除消费者组
1.xgroup DESTROY命令 格式:xgroup DESTROY key groupname
成功删除后返回1,否则返回0。
xgroup DESTROY key groupname
-
读取消费者组
1.xreadgroup命令 格式:xreadgroup GROUP group consumer [COUNT count] [BLOCK milliseconds] [NOACK] STREAMS key [key …] ID [ID …]
GROUP选项指定了消费者组和消费者。
xreadgroup GROUP group consumer STREAMS key [key ...] ID [ID ...]
-
显示待处理消息的信息
1.xpending命令 格式:xpending key group [[IDLE min-idle-time] start end count [consumer]]
获取指定流的指定消费者组目前的待处理消息的信息,包括待处理消息的数量、待处理消息队列中的首条消息和最后一条消息的ID,以及该组名下各个消费者正在处理的消息数量。
xpending key group
-
将消息标记为已处理
1.xack命令 格式:xack key group ID [ID …]
将消费者组中指定的消息标记为“已处理”,被标记的消息从当前消费者的待处理消息队列中移除。执行后返回被标记的消息数量。
xack key group ID [ID ...]
-
转移消息归属权
1.xclaim命令 格式:xclaim key group consumer min-idle-time ID [ID …] [IDLE ms] [TIME ms-unix-time] [RETRYCOUNT count] [force] [justid]
将指定消息的归属权从一个消费者转向另一个消费者。min-idle-time参数指若消息当前消费者处理该消息时间超过该值才将消息转移给指定consumer,执行后返回被转移消息的ID以及内容,justid可指定仅返回消息ID。
-
查看流和消费者组的信息
xinfo命令用于查看流和消费者组的相关信息。
1.xinfo CONSUMERS命令 格式:xinfo CONSUMERS key groupname
打印指定消费者组的所有消费者,信息包括消费者名称、正在处理的消息数量以及消费者的闲置时长。
xinfo CONSUMERS key groupname
2.xinfo GROUPS命令 格式:xinfo GROUPS key
打印与指定流相关联的所有消费者组,信息包括消费者组名称、组拥有的消费者数量、组中正在处理消息的数量以及最后递送的消息ID。
xinfo GROUPS key
3.xinfo STREAM命令 格式:xinfo STREAM key
打印给定流的信息,信息包括流的长度、流在底层的基数树表示的相关信息、流最后生成的消息ID、流第一个节点以及最后一个节点。
xinfo STREAM key
-
常见用法
1.消息队列