redis stream终端间使用流消费者组通信
附redis消息队列和消费者相关命令表
消息队列的相关命令:
- XADD:添加消息到末尾(生产消息)
- XTRIM:对流进行修剪,限制长度
- XDEL:删除消息
- XLEN:获取流包含的元素数量,及消息长度
- XRANGE:获取消息列表,会自动过滤已经删除的消息
- XREVERANGE:反向获取消息列表,ID从大到小
- XREAD:以阻塞或非阻塞方式获取消息列表(消费消息)
消费者组相关命令:
- XGROUP CREATE:创建消费者组
- XREADGROUP GROUP:读取消费者组中的消息
- XACK:将消息标记为“已处理”
- XGROUP SETID:为消费者组设置新的最后递送消息ID
- XGROUP DELCONSUMER:删除消费者
- XGROUP DESTROY:删除消费者组
- XPENDING:显示待处理消息的相关信息
- XCLAIM:转移消费者组的相关信息
- XINFO GROUPS:打印消费者组的信息
- XINFO STREAM:打印流信息
要在Redis中创建一个Stream并使用两个不同的客户端进行发布和订阅,并且为该Stream创建消费者组,可以按照以下步骤操作:
第一步:启动Redis服务端
在第一个终端中启动Redis Server。
redis-server
第二步:启动两个Redis客户端
在第二个终端和第三个终端中分别启动两个Redis客户端:
redis-cli
redis-cli
第三步:创建Stream
XADD mystream * message hello
其中,*表示使用当前时间戳作为Stream ID,message hello表示发送的消息内容。
第四步:创建消费者组
在第二个终端中,执行以下命令创建一个名为mystream的Stream,并创建一个名为mygroup的消费者组:
XGROUP CREATE mystream mygroup $
其中,$表示从最新的消息开始消费,0表示从开头消费。执行该命令后,第二个终端将成为mygroup消费者组的消费者。
第五步:消费消息
在第三个终端中,执行以下命令加入mygroup消费者组并从最新的消息开始消费:
XREADGROUP GROUP mygroup consumer1 STREAMS mystream >
其中,mygroup是要加入的消费者组名称,consumer1是消费者名称,mystream是要消费的Stream名称,>表示从最新的消息开始读取。
此时,第三个终端将接收到第二个终端发送的消息。
如果第三个终端想要停止消费消息,可以执行以下命令:
XGROUP DELCONSUMER mystream mygroup consumer1
其中,mystream是要删除消费者的Stream名称,mygroup是要删除消费者的消费者组名称,consumer1是要删除的消费者名称。
redis_stream数据类型特点:
- 当一个消费者组创建后,消费者开始读取消息,假设consumer1读取了message1消息,那么message1消息不再会被其他consumer读取和看到
- 一个消息被读取后,消费者没有使用xack应答,该消息会一直被标记为未应答状态,消费者挂掉再来读取时,消息不会丢失,该消费者可以再次读取消息,但其他消费者始终无法读取该消息
- 一条消息被xadd发出后,没有xdel之前,不管其他消费者有没有xack该消息,该消息始终保存在内存中,即使该消息被读取过并xack,也始终保存在内存中,可以通过xrange命令看到,如确定该消息不再需要,请使用xdel将该消息从内存中删除