redis 流 stream的使用总结 - 基础命令

简言
1.   流(stream)是redist5.0版本新增加的数据结构,也是该版本最重要的更新,专门用于实现消息队列,事件系统
2.   redis之前的其他的数据结构实现消息队列,各有缺点
2.1 列表(list)可以快速地将新消息追加到列表的尾部,但是不适合范围查找或者
2.2 集合(set)有序集合(zset)虽然可以快速进行查找,但是缺少列表(list)和发布订阅等数据结构提供的阻塞弹出原语
2.3 发布订阅虽然可以将消息主动传递给多个客户端,也拥有阻塞弹出的原语,但是其发送即忘(send and forget)的策略,会导致离线的客户端丢失消息,这很严重
3.   其他数据结构共同的缺点,即是所有的元素都只能是单个值,如果你想传递多项信息,必须使用序列化工具比如json,先序列化压入,取出后再序列化才能使用
4.   流(stream)解决了上面提到的所有问题,每个元素可以包含任意多项信息,且每个元素都包含一个ID,这些元素会根据ID大小在流中有序排列

redis流stream使用系列文章

第一篇 redis 流 stream的使用总结 - 基础命令

第二篇 redis 流 stream的使用总结 - 如何遍历

第三篇 redis 流 stream的使用总结 - 消费者组

函数总结:

1. XADD 添加元素到末尾

2. XTRIM 对流进行修剪,限制长度

3. XDEL 移除指定元素

4. XLEN 获取流包含的元素数量

5. XRANGE 顺序访问流中的元素,元素ID从小到大

6. XREVRANGE 逆序访问流中的元素,元素ID从大到小

7. XREAD 以阻塞或非阻塞方式获取流元素

下面的是消费者组相关的

8.1 XGROUP CREATE 创建消费者组

8.2 XREADGROUP GROUP 读取消费者组中的消息

8.3 XACK 将消息标记为“已处理”

8.4 XGROUP SETID 为消费者组设置新的最后递送消息ID

8.5 XGROUP DELCONSUMER 删除消费者

8.6 XGROUP DESTROY 删除消费者组

8.7 XPENDING 显示待处理消息的相关信息

8.8 XCLAIM 转移消息的归属权

8.9 XINFO 查看流和消费者组的相关信息;XINFO GROUPS 打印消费者组的信息; XINFO STREAM 打印流信息


具体用法及示例
1. XADD 添加元素到末尾
    格式:XADD stream id field value [field value ...] 返回值是该元素的ID

    例如:redis> XADD s1 1100000000000-12345 k1 v1 k2 v2
          1100000000000-12345

    若追加的元素ID不完整时,redis会自动补全,可能是检测了分隔符‘-’吧
    例如:redis> XADD temp-stream 1000000000000 k1 v1
          1000000000000-0

    注意事项:新元素的ID必须比流中所有已有元素的ID都要大,redis会进行检测

    若将符号 * 用于ID参数的值时,redis将会自动为新元素生成一个可用的新ID
    规则如下:    

    如果当前毫秒之内还没有元素,则用当前毫秒的时间戳,顺序编号为0,例如1530000000000-0
    如果当前毫秒已经存在元素,则顺序编号加1即可,若原来最大的是1530000000000-12345,则新ID为1530000000000-12346
    例如:redis> XADD s1 * k1 v1
          1530513983956-0

    一个绝杀问题

    问:使用XADD 流名字 * key value命令时,产生新元素的ID的毫秒部分一定是当前时间戳的毫秒吗?

    答:不一定,因为若机器的当前时间比流中已有最大ID的毫秒时间要小(修改了机器时间导致)时,redis将使用最大ID的毫秒时间作为新ID的毫秒时间,顺序部分加1,以此来避免时间倒流产生的问题。即redis保证新产生的ID一定是最大的

2. XTRIM 对流进行修剪,限制长度
    格式:XTRIM steam MAXLEN len 返回值是被移除的元素的个数
    例如:redis> XTRIM s1 MAXLEN 3
       (integer) 2
    说明删除了2个最开头的元素

    其实XADD也可以限制流的长度
    格式:XADD stream [MAXLEN len] id field value [field value ...]

    例如:s1中已经有3个元素了,我们再添加一个
        redis> XADD s1 MAXLEN 3 * k1 v1

        1400000000000-0

        此时XADD命令将把该新元素添加到流mini-stream的末尾,并从流中移除一个最早的元素

3. XDEL 移除指定元素,返回值是被移除的元素的数量

    格式:XDEL stream [id id ... id]

    例如:XDEL s1  1000000000000 2000000000000

    (integer) 2    // 说明删除了流s1中的两个元素

4. XLEN 获取流包含的元素数量,复杂度:O(1)

    格式:XLEN stream

    例如:XLEN stream-1

    (integer) 3    // 流包含3个元素

    例如:XLEN empty-stream

    (integer) 0    // 空流

    例如:XLEN not-exist-stream

    (integer) 0    // 流不存在

至于流如何遍历请参考下篇博客 redis 流 stream的使用总结 - 如何遍历 

发布了105 篇原创文章 · 获赞 58 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/yzf279533105/article/details/104157267