我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Redis中Stream类型怎么用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Redis中Stream类型怎么用

这篇文章主要介绍Redis中Stream类型怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

一、背景

最近在看redis这方面的知识,发现在redis5中产生了一种新的数据类型Stream,它和kafka的设计有些类似,可以当作一个简单的消息队列来使用。

二、redis中Stream类型的特点

  • 是可持久化的,可以保证数据不丢失。

  • 支持消息的多播、分组消费。

  • 支持消息的有序性。

三、Stream的结构

Redis中Stream类型怎么用

解释:

消费者组: Consumer Group,即使用 XGROUP CREATE 命令创建的,一个消费者组中可以存在多个消费者,这些消费者之间是竞争关系。

  • 同一条消息,只能被这个消费者组中的某个消费者获取。

  • 多个消费者之间是相互独立的,互不干扰。

消费者: Consumer 消费消息。

last_delivered_id: 这个id保证了在同一个消费者组中,一个消息只能被一个消费者获取。每当消费者组的某个消费者读取到了这个消息后,这个last_delivered_id的值会往后移动一位,保证消费者不会读取到重复的消息。

pending_ids:记录了消费者读取到的消息id列表,但是这些消息可能还没有处理,如果认为某个消息处理,需要调用ack命令。这样就确保了某个消息一定会被执行一次。

消息内容:是一个键值对的格式。

Stream 中 消息的 ID: 默认情况下,ID使用 * ,redis可以自动生成一个,格式为 时间戳-序列号,也可以自己指定,一般使用默认生成的即可,且后生成的id号要比之前生成的大。

四、Stream的命令

1、XADD 往Stream末尾添加消息

1、命令格式
xadd key [NOMKSTREAM] [MAXLEN|MINID [=|~] threshold [LIMIT count]] *|ID field value [field value ...]

Redis中Stream类型怎么用

2、举例

xadd 命令 返回的是数据的id, xx-yy (xx指的是毫秒数,yy指的是在这个毫秒内的第几条消息)

向流中增加一条数据,

127.0.0.1:6379> xadd stream-key * username zhangsan # 向stream-key这个流中增加一个 username 是zhangsan的数据 *表示自动生成id"1635999858912-0" # 返回的是ID127.0.0.1:6379> keys *1) "stream-key" # 可以看到stream自动创建了127.0.0.1:6379>

向流中增加数据,不自动创建流

127.0.0.1:6379> xadd not-exists-stream nomkstream * username lisi # 因为指定了nomkstream参数,而not-exists-stream之前不存在,所以加入失败(nil)127.0.0.1:6379> keys *(empty array)127.0.0.1:6379>

手动指定ID的值

127.0.0.1:6379> xadd stream-key 1-1 username lisi # 此处id的值是自己传递的1-1,而不是使用*自动生成"1-1" # 返回的是id的值127.0.0.1:6379>

设置一个固定大小的Stream1、精确指定Stream的大小

指定指定Stream的大小比模糊指定Stream的大小会稍微多少消耗一些性能。

Redis中Stream类型怎么用

模糊指定Stream的大小

127.0.0.1:6379> xadd stream-key maxlen ~ 1 * first first"1636001034141-0"127.0.0.1:6379> xadd stream-key maxlen ~ 1 * second second"1636001044506-0"127.0.0.1:6379> xadd stream-key maxlen ~ 1 * third third"1636001057846-0"127.0.0.1:6379> xinfo stream stream-key 1) "length" 2) (integer) 3 3) "radix-tree-keys" 4) (integer) 1 5) "radix-tree-nodes" 6) (integer) 2 7) "last-generated-id" 8) "1636001057846-0" 9) "groups"10) (integer) 011) "first-entry"12) 1) "1636001034141-0"    2) 1) "first"       2) "first"13) "last-entry"14) 1) "1636001057846-0"    2) 1) "third"       2) "third"127.0.0.1:6379>

~ 模糊指定流的大小,可以看到指定的是1,实际上已经到了3.

2、XRANGE查看Stream中的消息

1、命令格式
xrange key start end [COUNT count]

Redis中Stream类型怎么用

2、准备数据
127.0.0.1:6379> multiOK127.0.0.1:6379(TX)> xadd stream-key * username zhangsanQUEUED127.0.0.1:6379(TX)> xadd stream-key * username lisiQUEUED127.0.0.1:6379(TX)> exec1) "1636003481706-0"2) "1636003481706-1"127.0.0.1:6379> xadd stream-key * username wangwu"1636003499055-0"127.0.0.1:6379>

使用redis的事务操作,获取到同一毫秒产生的多条数据,时间戳一样,序列号不一样

3、举例

获取所有的数据(-+的使用)

127.0.0.1:6379> xrange stream-key - +1) 1) "1636003481706-0"   2) 1) "username"      2) "zhangsan"2) 1) "1636003481706-1"   2) 1) "username"      2) "lisi"3) 1) "1636003499055-0"   2) 1) "username"      2) "wangwu"127.0.0.1:6379>

-: 表示最小id的值

+:表示最大id的值

获取指定id范围内的数据,闭区间

127.0.0.1:6379> xrange stream-key 1636003481706-1 1636003499055-01) 1) "1636003481706-1"   2) 1) "username"      2) "lisi"2) 1) "1636003499055-0"   2) 1) "username"      2) "wangwu"127.0.0.1:6379>

获取指定id范围内的数据,开区间

127.0.0.1:6379> xrange stream-key (1636003481706-0 (1636003499055-01) 1) "1636003481706-1"   2) 1) "username"      2) "lisi"127.0.0.1:6379>

(:表示开区间

获取某个毫秒后所有的数据

127.0.0.1:6379> xrange stream-key 1636003481706 +1) 1) "1636003481706-0"   2) 1) "username"      2) "zhangsan"2) 1) "1636003481706-1"   2) 1) "username"      2) "lisi"3) 1) "1636003499055-0"   2) 1) "username"      2) "wangwu"127.0.0.1:6379>

直接写毫秒不写后面的序列号即可。

获取单条数据

127.0.0.1:6379> xrange stream-key 1636003499055-0 1636003499055-01) 1) "1636003499055-0"   2) 1) "username"      2) "wangwu"127.0.0.1:6379>

startend的值写的一样即可获取单挑数据。

获取固定条数的数据

127.0.0.1:6379> xrange stream-key - + count 11) 1) "1636003481706-0"   2) 1) "username"      2) "zhangsan"127.0.0.1:6379>

使用 count进行限制

3、XREVRANGE反向查看Stream中的消息

XREVRANGE key end start [COUNT count]

使用方式和XRANGE类似,略。

4、XDEL删除消息

1、命令格式
xdel key ID [ID ...]
2、准备数据
127.0.0.1:6379> xadd stream-key * username zhangsan"1636004176924-0"127.0.0.1:6379> xadd stream-key * username lisi"1636004183638-0"127.0.0.1:6379> xadd stream-key * username wangwu"1636004189211-0"127.0.0.1:6379>
3、举例

需求:往Stream中加入3条消息,然后删除第2条消息

127.0.0.1:6379> xdel stream-key 1636004183638-0(integer) 1 # 返回的是删除记录的数量127.0.0.1:6379> xrang stream -key - +127.0.0.1:6379> xrange stream-key - +1) 1) "1636004176924-0"   2) 1) "username"      2) "zhangsan"2) 1) "1636004189211-0"   2) 1) "username"      2) "wangwu"127.0.0.1:6379>

注意:

需要注意的是,我们从Stream中删除一个消息,这个消息并不是被真正的删除了,而是被标记为删除,这个时候这个消息还是占据着内容空间的。如果所有Stream中所有的消息都被标记删除,这个时候才会回收内存空间。但是这个Stream并不会被删除。

5、XLEN查看Stream中元素的长度

1、命令格式
xlen key
2、举例

查看Stream中元素的长度

127.0.0.1:6379> xadd stream-key * username zhangsan"1636004690578-0"127.0.0.1:6379> xlen stream-key(integer) 1127.0.0.1:6379> xlen not-exists-stream-key(integer) 0127.0.0.1:6379>

注意:

如果xlen后方的key不存在则返回0,否则返回元素的个数。

6、XTRIM对Stream中的元素进行修剪

1、命令格式
xtrim key MAXLEN|MINID [=|~] threshold [LIMIT count]
2、准备数据
127.0.0.1:6379>  xadd stream-key * username zhangsan"1636009745401-0"127.0.0.1:6379> multiOK127.0.0.1:6379(TX)> xadd stream-key * username lisiQUEUED127.0.0.1:6379(TX)> xadd stream-key * username wangwuQUEUED127.0.0.1:6379(TX)> exec1) "1636009763955-0"2) "1636009763955-1"127.0.0.1:6379> xadd stream-key * username zhaoliu"1636009769625-0"127.0.0.1:6379>
3、举例

maxlen精确限制

127.0.0.1:6379> xtrim stream-key maxlen 2 # 保留最后的2个消息(integer) 2127.0.0.1:6379> xrange stream-key - + # 可以看到之前加入的2个消息被删除了1) 1) "1636009763955-1"   2) 1) "username"      2) "wangwu"2) 1) "1636009769625-0"   2) 1) "username"      2) "zhaoliu"127.0.0.1:6379>

上方的意思是,保留stream-key这个Stream中最后的2个消息。

minid模糊限制

minid 是删除比这个id小的数据,本地测试的时候没有测试出来,略。

7、XREAD独立消费消息

XREAD只是读取消息,读取完之后并不会删除消息。 使用XREAD读取消息,是完全独立与消费者组的,多个客户端可以同时读取消息。

1、命令格式
xread [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...]

Redis中Stream类型怎么用

2、准备数据
127.0.0.1:6379> xadd stream-key * username zhangsan"1636011801365-0"127.0.0.1:6379> xadd stream-key * username lisi"1636011806261-0"127.0.0.1:6379> xadd stream-key * username wangwu"1636011810905-0"127.0.0.1:6379>
3、举例

获取用户名是wangwu的数据

127.0.0.1:6379> xread streams stream-key 1636011806261-0 # 此处写的是lisi的id,即读取到的数据需要是 > 1636011806261-01) 1) "stream-key"   2) 1) 1) "1636011810905-0"         2) 1) "username"            2) "wangwu"

获取2条数据

127.0.0.1:6379> xread count 2 streams stream-key 0-01) 1) "stream-key"   2) 1) 1) "1636011801365-0"         2) 1) "username"            2) "zhangsan"      2) 1) "1636011806261-0"         2) 1) "username"            2) "lisi"127.0.0.1:6379>

count限制单次读取最后的消息,因为当前读取可能没有这么多。

非阻塞读取Stream对尾的数据

即读取队列尾的下一个消息,在非阻塞模式下始终是nil

127.0.0.1:6379> xread streams stream-key $(nil)

阻塞读取Stream对尾的数据

Redis中Stream类型怎么用

注意:

  • $表示读取队列最新进来的一个消息,不是Stream的最后一个消息。是xread block执行后,再次使用xadd添加消息后,xread block才会返回。

  • block 0表示永久阻塞,当消息到来时,才接触阻塞。block 1000表示阻塞1000ms,如果1000ms还没有消息到来,则返回nil

  • xread进行顺序消费 当使用xread进行顺序消息时,需要记住返回的消息id,同时下次调用xread时,需要将上次返回的消息id传递进去。

  • xread读取消息,完全无视消费组,此时Stream就可以理解为一个普通的list。

8、消费者组相关操作

1、消费者组命令

Redis中Stream类型怎么用

2、准备数据

创建Stream的名称是 stream-key

创建2个消息,aa和bb

127.0.0.1:6379> xadd stream-key * aa aa"1636362619125-0"127.0.0.1:6379> xadd stream-key * bb bb"1636362623191-0"
3、创建消费者组

创建一个从头开始消费的消费者组

xgroup create stream-key(Stream 名) g1(消费者组名) 0-0(表示从头开始消费)

创建一个从Stream最新的一个消息消费的消费者组

xgroup create stream-key g2 $

$表示从最后一个元素消费,不包括Stream中的最后一个元素,即消费最新的消息。

4、创建一个从某个消息之后消费的消费者组
xgroup create stream-key g3 1636362619125-0  #1636362619125-0 这个是上方aa消息的id的值

1636362619125-0某个消息的具体的ID,这个g3消费者组中的消息都是大于>这个id的消息。

从消费者中读取消息

127.0.0.1:6379> xreadgroup group g1(消费组名) c1(消费者名,自动创建) count 3(读取3条) streams stream-key(Stream 名) >(从该消费者组中还未分配给另外的消费者的消息开始读取)1) 1) "stream-key"   2) 1) 1) "1636362619125-0"         2) 1) "aa"            2) "aa"      2) 1) "1636362623191-0"         2) 1) "bb"            2) "bb"127.0.0.1:6379> xreadgroup group g2 c1 count 3 streams stream-key >(nil) # 返回 nil 是因为 g2消费组是从最新的一条信息开始读取(创建消费者组时使用了$),需要在另外的窗口执行`xadd`命令,才可以再次读取到消息127.0.0.1:6379> xreadgroup group g3 c1 count 3 streams stream-key >  #只读取到一条消息是因为,在创建消费者组时,指定了aa消息的id,bb消息的id大于aa,所以读取出来了。1) 1) "stream-key"   2) 1) 1) "1636362623191-0"         2) 1) "bb"            2) "bb"127.0.0.1:6379>

读取消费者的pending消息

127.0.0.1:6379> xgroup create stream-key g4 0-0OK127.0.0.1:6379> xinfo consumers stream-key g11) 1) "name"   2) "c1"   3) "pending"   4) (integer) 2   5) "idle"   6) (integer) 88792127.0.0.1:6379> xinfo consumers stream-key g4(empty array)127.0.0.1:6379> xreadgroup group g1 c1 count 1 streams stream-key 1636362619125-01) 1) "stream-key"   2) 1) 1) "1636362623191-0"         2) 1) "bb"            2) "bb"127.0.0.1:6379> xreadgroup group g4 c1 count 1 block 0 streams stream-key 1636362619125-01) 1) "stream-key"   2) (empty array)127.0.0.1:6379>

Redis中Stream类型怎么用

转移消费者的消息

127.0.0.1:6379> xpending stream-key g1 - + 10 c11) 1) "1636362619125-0"   2) "c1"   3) (integer) 2686183   4) (integer) 12) 1) "1636362623191-0"   2) "c1"   3) (integer) 102274   4) (integer) 7127.0.0.1:6379> xpending stream-key g1 - + 10 c2(empty array)127.0.0.1:6379> xclaim stream-key g1 c2 102274 1636362623191-01) 1) "1636362623191-0"   2) 1) "bb"      2) "bb"127.0.0.1:6379> xpending stream-key g1 - + 10 c21) 1) "1636362623191-0"   2) "c2"   3) (integer) 17616   4) (integer) 8127.0.0.1:6379>

Redis中Stream类型怎么用

也可以通过xautoclaim来实现。

6、一些监控命令

查看消费组中消费者的pending消息

127.0.0.1:6379> xpending stream-key g1 - + 10 c21) 1) "1636362623191-0"   2) "c2"   3) (integer) 1247680   4) (integer) 8127.0.0.1:6379>

查看消费组中的消费者信息

127.0.0.1:6379> xinfo consumers stream-key g11) 1) "name"   2) "c1"   3) "pending"   4) (integer) 1   5) "idle"   6) (integer) 14748642) 1) "name"   2) "c2"   3) "pending"   4) (integer) 1   5) "idle"   6) (integer) 1290069127.0.0.1:6379>

查看消费组信息

127.0.0.1:6379> xinfo groups stream-key1) 1) "name"   2) "g1"   3) "consumers"   4) (integer) 2   5) "pending"   6) (integer) 2   7) "last-delivered-id"   8) "1636362623191-0"2) 1) "name"   2) "g2"   3) "consumers"......

查看Stream信息

127.0.0.1:6379> xinfo stream stream-key 1) "length" 2) (integer) 2 3) "radix-tree-keys" 4) (integer) 1 5) "radix-tree-nodes" 6) (integer) 2 7) "last-generated-id" 8) "1636362623191-0" 9) "groups"10) (integer) 411) "first-entry"12) 1) "1636362619125-0"    2) 1) "aa"       2) "aa"13) "last-entry"14) 1) "1636362623191-0"    2) 1) "bb"       2) "bb"127.0.0.1:6379>

以上是“Redis中Stream类型怎么用”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Redis中Stream类型怎么用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Redis中Stream类型怎么用

这篇文章主要介绍Redis中Stream类型怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、背景最近在看redis这方面的知识,发现在redis5中产生了一种新的数据类型Stream,它和kafka的设计有些
2023-06-25

Redis入门 - 数据类型:Stream详解

Redis5.0 中还增加了一个数据类型Stream,它借鉴了Kafka的设计,是一个新的强大的支持多播的可持久化的消息队列。@pdaiRedis入门 - 数据类型:Stream详解为什么会设计StreamStream详解Stream的结构增删改查独立消费消费
Redis入门 - 数据类型:Stream详解
2017-07-13

Redis中Hash类型的使用

目录Hash与String比较Hash类型的常见命令(显而易见,在String命令前加入H就是Hash的命令) 1.HSET key field value:添加或修改hash类型keandroidy的field的值(实操举例)2.HGE
2023-06-09

Redis数据类型string和Hash怎么用

这篇文章给大家分享的是有关Redis数据类型string和Hash怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。String类型命令操作String类型是在Redis中最常用的数据类型,它也是很多程序员在日
2023-06-29

Redis中的Zset是什么类型

Zset是Redis中的有序集合(Sorted Set)类型,它是通过将元素与分数(score)关联在一起来实现的,元素在有序集合中按照分数的大小进行排序。这使得Zset可以支持高效地按照分数范围进行范围查询,并且可以保持元素的唯一性。Zs
Redis中的Zset是什么类型
2024-04-09

java怎么redis取数据类型

Java通过Jedis获取Redis数据类型简介Redis是广泛使用的键值对数据库,支持多种数据类型。JavaJedis客户端提供了便捷的方法来获取这些类型。Jedis的get方法get方法获取指定键的值,返回Object类型,可根据键类型转换为Java类型。确定数据类型type方法返回字符串表示键类型。常见数据类型Redis支持多种类型,包括字符串、列表、集合、散列和有序集合。获取特定类型的值根据类型使用特定方法获取值:字符串:get列表:lrange集合:smembers散列:hget有序集合:zra
java怎么redis取数据类型
2024-04-02

redis怎么更改数据类型

在Redis中,可以使用以下命令更改数据类型:1. `SET key value`:将键 key 的值设置为 value,如果键 key 不存在,则创建新的键值对。2. `GETSET key value`:设置键 key 的值为 valu
2023-08-30

Redis特殊数据类型Geospatial怎么使用

这篇文章主要介绍“Redis特殊数据类型Geospatial怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Redis特殊数据类型Geospatial怎么使用”文章能帮助大家解决问题。Redi
2023-06-30

redis中hash数据类型

remoteSelf:1>hset website google "www.google.com""1"remoteSelf:1>hget website"ERR wrong number of arguments for 'hget' command"rem
redis中hash数据类型
2021-09-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录