Redis命令行以及测试例子
站内链接:
Stream
说明
基于 redis 的消息队列有好几种方式:
- 基于 list 队列的
PUSH + POP
, 这其中有好几种实现方式, 具体见redis 消息队列说明 - 基于 Sorted Set 的实现
- 订阅和发布模式
- Stream 实现
其中 Stream 是 redis5.0 新增的支持类型, 其支持消息队列大部分的功能:
- 消息 ID 的序列化生成, 格式为:
时间戳-序号
- 消息的遍历
- 消息的阻塞和非阻塞读取
- 消息的分组消费
- 消息队列监控
在演示各个 Stream 命令之前先简单的介绍下 Stream 消息 ID 生成方式和格式:
- 格式:
1666168208279-0
, 时间戳 + 序号, 其中序号表示相同时间戳时(毫秒时间点内)多个消息记录而产生的序列化序号, 这两者都是 64 位整型 - 相同时间戳多序号都是递增有序的, 一般在 multi 事务中执行时产生
基本命令
下面就从 redis 命令角度简单的演示下 Stream 类型操作, 首先时最基本的 CURD 操作.
- 创建和增加消息
1 | 1. 添加一条stream流数据, 其中消息内容使用如下是: key1 value1 key2 value2 |
好了, 上面我们往memberMessage
消息队列中添加了两条消息, 那么我们怎么查看消息呢?
- 查看消息
1 | # 1. 查看某一个消息队列中所有消息, 其会打印消息队列中每一个消息的ID以及信息, 这里0表示从第一条消息开始 |
- 删除和裁剪消息
1 | # 1. 删除某一个指定ID的记录, 删除成功后再查看消息队列会发现少了一条该ID的记录 |
- 队列简要信息
1 | # 1. 获取指定队列或者消费组中的摘要和统计信息 |
上面的命令输入如下:
1 | ----> 第一条命令 |
消费者组
上面已经简单介绍过消费组的摘要信息
查看命令, 那么消费组提出的目的是什么呢? 默认情况下,一个队列中的消息可以被多个人同时消费, 但若存在如下需求:
- a. 多个消费者协作消费同一个消息队列 M
- b. 例如消息队列中有 9 条消息, 消费者 A 仅仅消费 1, 4, 7, 消费者 C 仅仅消费 3, 6, 9, 这样可以提高消费能力(即分流)
消费者组模式
就是因此产生, 其提供了可以进行消费者组管理和操作的各种命令:
- 消费者组实现同组多个消费者并行但不重复消费消息的能力, 提升消费
- 消费者组能够记住最新消费的信息, 保证消息连续消费, 每一个 xgroup 都有一个
last-delivered-id
指向消息链表的某个元素, 类似散列链路
- 消费者组能够记住消息转移次数, 实现消费失败重试以及永久性故障的消息转移
- 消费者组提供了 PEL 未确认列表和 ACK 确认机制, 确保消息不丢失
下面就是消费者组的一些命令实战说明
1 | # 1. 首先, 批量事务的往消息队列中push5条消息 |
由上可知, 同一个消费者组中的多个用户消费信息时存在互斥原则
, 每次消费都更新last_delivered_id
. 在使用 xreadgroup 从流中获取数据之后, 此时并未进行数据的 ACK 确认, 此时待处理条目
中会记录这些被消费但是未ACK
的数据信息, 通过命令: xpending mq mqGroup
可以查看待处理条目
信息:
1 | # 这里表示由两条2消息未进行确认, 其中consumerA有两条信息未确认 |
其中书说明如下:
1)
表示行数2), 3)
表示待处理条目中的最小和最大 ID4)
中存储每一个用户至少一条待处理消息信息. 此时我们通过xack
命令确认某一个用户的某一个消息记录, 则会发现XPENDING
输出发生变化.
注意, xpending 返回的实际就是为进行 ACK 的消息信息, 该命令在异常场景中有这非常重要的意义.
1 | # 1. 设置ack |
未 ack 消息
- 获取当前消息队列中未进行 ACK 的数量:
xinfo consumers mq mqGroup
, 根据输出中的 pending 的值判断未进行 ACK 的数量, 根据 min 和 max 获取最小和最大 ID 值
1 | 1) 1) "name" |
调用 xrange 获取指定范围的数据:
xrange stream1 minid1 maxid2 count 1000
获取所有未确认的信息, 这种方式有点取消, 可能会对内存造成负担重新处理每一条信息, 并对消息进行再次 ACK 确认, 当然如果再次发生异常就不会进行 ACK 确认.
list 队列
这里仅仅介绍一些不常见的列表命令, 比如阻塞相关命令, 介绍流程仍然同上面, 从最简单的 CURD 开始介绍列表命令
- 阻塞推入和弹出, 非阻塞命令这里就不再描述了, 阻塞命令可以避免空转现象, 减少网络请求, 每次命令执行都是往 redis 服务发送请求
1 | # 原始数据, 返回当前list长度 |
- 原子性的返回并移除 Source 列表最后一个元素, 并把获取的元素存储到 DESTINATION 的头部
1 | # 1. 先创建source |
该命令的阻塞版本是BRPOPLPUSH
, 阻塞命令类似RLPOP
- 插入, 索引, 移除
1 | # 1. 类似Python的下标索引操作, 注意, 下标是从0开始算 |
- 更新指定下标值, 切片操作
1 | # 1. 更新指定下标值 |
有序集合
有序集合, 相比于 set 结构, 每个元素都有 score 分数来表示其在集合中的顺序, 有序集合也是作为 redis 消息队列的一种实现方式.
- 添加, 删除, 查看元素
1 | # a. 增加元素同时指定分数 |
- 更新
1 | # a. 给指定的member的score值加上增量值, 其中增量值可以为正数, 也可以是负数 |
- 获取区间元素
1 | # a. zrange根据下标返回指定区间内的元素, 排序: 按照score从低到高 |
shell 命令
批量删除
我们可以通过 redis-cli 来批量的执行在redis command line
上的命令, 其中频繁使用的就是批量删除
, 使用简单的正则来批量的删除一些通用规则
的减值. 在使用 redis-cli 执行命令的时候, 需要确保每一条命令的执行都有正确的访问权限.
例如, 批量删除以shenyuan
开头的所有 redis 键值, 并且指定数据库, 指定密码, 指定 host:
1 | # 使用keys匹配 |
注意, 请谨慎执行此类命令.
配置
Config
- SET
在 Redis 中,使用 CONFIG SET 命令可以动态地修改 Redis 的配置参数,其语法:CONFIG SET parameter value
,其中,parameter
是要修改的配置参数的名称,value
是要设置的新值,在 redis 2.0 之后,一旦执行该命令,则配置就会立即生效。
配置文件
上面的 CONFIG 命令可以在 Redis 实例运行的时候修改某些配置,但该命令不支持所有的配置项,例如rename-command
,此时就需要更改 redis.conf 配置文件并重启才能生效。