Redis5.0的Stream数据结构

一、概述  

        Redis Stream是Redis5.0版本新加的一个数据结构,Steam数据结构可以被视为一个日志或消息队列。它是一个由多个键值对组成的可持久化、有序、可重复的数据流。每个键值对表示一个消息,其中键表示消息的唯一标识,值标识消息的内容。

        在Redis 5.0之前,消息队列的实现主要是发布订阅(pub/sub),但这种方式的缺点就是消息无法持久化,如果出现网络宕机、Redis宕机等情况,消息就会被丢弃。

        而Redis stream提供了消息的持久化和主备复制功能,可以让客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失。

二、Stream的特性

        Stream的特性主要包括以下几点:

        1.有序性:Stream中的消息按照ID的递增顺序排序,保证消息的有序性;

        2.消息持久化:Stream中的消息可以持久化到磁盘上,即使Redis重启也不会丢失消息;

        3.多消费者支持:多个消费者可以订阅同一个Stream并独立消费消息,支持竞争式消费和共享式消费两种消费模式;

        4.消息传递模式灵活:Stream支持多种消费传递模式,例如发布-订阅模式、队列模式、消息分组模式等;    

三、实现原理

        Stream底层采用了类似日志的数据结构,每个Stream都是由一个或多个日志实现的。每个日志包含多个消息,每个消息包含一个唯一的ID和一些附加的字段,如消息体、时间戳等。

        下图是一系列的Stream命令(网上找的图,侵权立删)。

        

四、Stream的使用

  1.添加消息到Stream

Jedis jedis = new Jedis("localhost", 6379);

// 发布一条消息到名为 "mystream" 的 Stream 中
String messageId = jedis.xadd("mystream", null, ImmutableMap.of("event", "click", "page", "home"));

System.out.println("Published message with ID: " + messageId);
/**
*在上面的代码中,我们使用 Jedis 的 xadd() 方法向一个名为 mystream 的 Stream 中发布一条消息。
*由于消息的 ID 是自动生成的,因此我们可以使用返回值 messageId 来获取新消息的 ID。
**/

 2.消费者消费消息

Jedis jedis = new Jedis("localhost", 6379);

// 从名为 "mystream" 的 Stream 中读取所有未读消息
StreamEntryID lastSeenId = new StreamEntryID();
List<Map.Entry<String, String>> messages = jedis
       .xread(1, 0, ImmutableMap.of("mystream", lastSeenId.toString()));

// 遍历消息列表,并将其打印到控制台上
for (Map.Entry<String, String> message : messages.get(0).getValue().entrySet()) {
    System.out.println("Received message with ID " + message.getKey() + ":");
    System.out.println(message.getValue());
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橡 皮 人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值