⑨【Stream】Redis流是什么?怎么用?: Stream [使用手册]

news2025/2/23 7:41:26

在这里插入图片描述

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~
个人主页:.29.的博客
学习社区:进去逛一逛~

在这里插入图片描述

⑨Redis Stream基本操作命令汇总

  • 一、Redis流 (Stream)
  • 二、Redis Stream 基本操作命令
    • 1.队列相关命令
      • ① xadd 向Stream队列添加消息
      • ② xrange 获取指定队列的消息列表
      • ③ xrevrange 获取指定队列的消息列表
      • ④ xdel 删除消息列表
      • ⑤ xlen 获取Stream队列消息的长度
      • ⑥ xtrim 对Stream的长度进行截取
      • ⑦ xread 获取消息,只会返回大于指定id的消息
    • 2.消费组相关命令
      • ① xgroup create 创建消费组
      • ② xreadgroup GROUP 指定消费组中消费者来消费消息
      • ③ xpending 查询已读取但尚未确认的消息
      • ④ xack 向消息队列确认消息已经处理完成
      • ⑤ xinfo stream 查询流的详细信息
      • 重点问题


一、Redis流 (Stream)


Redis 5.0 之前,实现消息队列的两种方案

方案一:List实现

在这里插入图片描述


方案二:发布订阅(Pub/Sub)

在这里插入图片描述




Redis 5.0 后

  • Redis Steam 是redis 5.0 新增的一种数据结构
  • Redis Stram可以用来实现消息队列,它支持消息的持久化、支持自动生成全局唯一ID、支持ack确认消息的模式、支持消费组模式等,让消息队列更加稳定和可靠

Stream 结构

在这里插入图片描述

  • Stream本质是一个消息链表,将所有加入的消息都串起来,每个消息都有一个唯一的ID和对应的内容
  • Message Content : 消息内容
  • Consumer group消费组,通过XGROUP CREATE命令创建,一个消费组中可以有多个消费者
  • Last_delivered_id游标,每个消费组会有一个游标Last_delivered_id,任意一个消费者读取了消息都会使得这个游标往前移动
  • Consumer :消费组中的消费者
  • Pending_ids :每个消费者都会有一个状态变量,用于记录被当前消费者已读取但未被ack确认的消息ID,如果客户端没有ack确认,这个变量里面的消息ID会愈来愈多,一旦某个消息被ack,它就开始减少。这个Pending_ids变量在Redis官方被称为PEL(Pending Entries List),记录了当前已经被客户端读取的但还未ack (Acknowledge character:确认字符)的消息,它用来确保客户端至少消费了消息一次,而不会在网络传输的中途丢失而导致没处理。



二、Redis Stream 基本操作命令


1.队列相关命令


① xadd 向Stream队列添加消息


xadd key [NOMKSTREAM] [MAXLEN|MINID [=|~] threshold [LIMIT count]] *|id field value [field value ...]


# 消息队列:mystream ,不存在会先创建再添加消息
# * : * 号表示服务器自动生成 MessageID
# id —— 29 , name —— little29 ,两对键值对,也是添加到队列中的消息
xadd mystream * id 29 name little29

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述




② xrange 获取指定队列的消息列表


xrange key start end [COUNT count]

start : 代表开始值

end : 代表结束值

count :表示最多获取多少个值


# -号:代表最小值
# +号:代表最大值
xrange mystream - +

在这里插入图片描述




③ xrevrange 获取指定队列的消息列表


  • 与xrange的区别在于,获取消息队列元素的方向是相反的,end在前,start在后

xrevrange key end start [COUNT count]

start : 代表开始值

end : 代表结束值

count :表示最多获取多少个值


# -号:代表最小值
# +号:代表最大值
xrange mystream + -

在这里插入图片描述




④ xdel 删除消息列表


  • 根据指定的MessageID,删除一个或多个消息列表

xdel key id [id ...]


xdel mystream 1681006258096-0

在这里插入图片描述




⑤ xlen 获取Stream队列消息的长度


xlen key


xlen mystream

在这里插入图片描述




⑥ xtrim 对Stream的长度进行截取


xtrim key MAXLEN|MINID [=|~] threshold [LIMIT count]

MAXLEN : 允许的最大长度,超过就会对流进行截取

MINID : 允许的最小ID,从某个ID值开始,比这个ID值小的将会被抛弃


# 1681007772647-0作为最小id,id值小于它的会被抛弃
xtrim mystream minid 1681007772647-0

在这里插入图片描述




⑦ xread 获取消息,只会返回大于指定id的消息


xread [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] id [id ...]

COUNT : 最多读取多少条消息

BLOCK : 表示是否以阻塞的方式读取消息,默认不阻塞,如果milliseconds设置为0,表示永久阻塞


# $代表特殊ID,表示以当前Stream已经存储的最大的ID作为最后一个ID,当前Stream中不存在大于当前最大ID的消息,因此此时返回nil
xread count 2 streams mystream $
# 0-0代表从最小的ID开始获取Stream中的消息,当不指定count,将会返回Stream中的所有消息,注意也可以使用0(00/000也都是可以的……)
xread count 2 streams mystream 0-0

在这里插入图片描述
在这里插入图片描述




2.消费组相关命令

  • Stream中的消息一旦被消费组里的一个消费者读取了,就不能再被该消费组内的其他消费者读取了,即同一个消费组里得消费者不能消费同一条消息。
  • 但是,不同消费组中的消费者可以消费同一条消息。
  • 消费组的目的 让组内多个消费者共同分担读取消息,所以,我们通常会让每个消费者读取部分消息,从而实现消息读取负载在多个消费者间是均衡分布的。

① xgroup create 创建消费组


xgroup create key groupname id|$ [MKSTREAM] [ENTRIESREAD entries_read]

  • 创建消费者组的时候必须指定 ID, ID 为 0 表示从头开始消费,为 $ 表示只消费新的消息
  • $表示从Stream尾部开始消费
  • 0表示从Stream头部开始消费

# 从头开始消费
xgroup create mystream group1 0
# 只消费新的消息
xgroup create mystream group2 $

在这里插入图片描述




② xreadgroup GROUP 指定消费组中消费者来消费消息


xreadgroup GROUP group consumer [COUNT count] [BLOCK milliseconds] [NOACK] STREAMS key [key ...] id [id ...]

  • 命令末尾加上“>”,表示从第一条尚未被消费的消息开始读取

# 消费组group1中的消费者consumer1从mystream消息队列中读取所有消息
# “>”:表示从第一条尚未被消费的消息开始读取
xreadgroup GROUP group1 consumer1 STREAMS mystream >

在这里插入图片描述




③ xpending 查询已读取但尚未确认的消息


xpending key group [[IDLE min-idle-time] start end count [consumer]]


# 查询指定消费组group1对mystream中已读取但未确认的消息
xpending mystream group1

在这里插入图片描述




④ xack 向消息队列确认消息已经处理完成


xack key group id [id ...]


# 通过xack,向消息队列确认指定消息ID:1681007772647-0的消息已经处理完成
xack mystream group1 1681007772647-0

在这里插入图片描述




⑤ xinfo stream 查询流的详细信息


xinfo stream key [FULL [COUNT count]]


# 查询流:mystream的详细信息
xinfo stream mystream

在这里插入图片描述


重点问题

在这里插入图片描述





在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1253394.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

系列十六、Spring IOC容器的扩展点

一、概述 Spring IOC容器的扩展点是指在IOC加载的过程中,如何对即将要创建的bean进行扩展。 二、扩展点 2.1、BeanDefinitionRegistryPostProcessor 2.1.1、概述 BeanDefinitionRegistryPostProcessor是bean定义的后置处理器,在BeanDefinition加载后&a…

HarmonyOS应用开发者高级认证【题库答案】

HarmonyOS应用开发者基础认证【题库答案】 一、判断题 云函数打包完成后,需要到AppGallery Connect创建对应函数的触发器才可以在端侧中调用(错)在column和Row容器组件中,aligntems用于设置子组件在主轴方向上的对齐格式&#xf…

BUUCTF [HBNIS2018]低个头 1

BUUCTF:https://buuoj.cn/challenges 题目描述: 得到的 flag 请包上 flag{} 提交。来源: https://github.com/hebtuerror404/CTF_competition_warehouse_2018 密文: 下载附件,得到一个.txt文件。 解题思路: 1、低头…

数字图像处理-Matlab实验

实验一 图像增强 实验内容: 对于给定的低对比度测试图像,利用灰度图像直方图均衡化算法进行图像视觉效果增强。 对于给定的低照度彩色测试图像,结合颜色空间转换和灰度图像直方图均衡化算法进行图像视觉效果增强。 实验数据: Test1_1.jpg: Test1_2.jpg: 实验步骤: %% …

基于ncurse实现的俄罗斯方块

1. 需求分析 方块的类型方块的变形方块的消除方块的存储方块的移动接受用户的输入 2. 概要设计 2.1 方块类型与变形 一共有七种,变换的方式如下。变换后的任意形状方块实际上可以存在一个4x4的矩阵中。 我们再压一下位,就可以存在16位中。 2.2 方块…

python之静态服务器程序开发

文章目录 Python静态Web服务器开发Web静态服务器初识搭建Python自带的静态Web服务器静态Web服务器返回固定页面数据静态Web服务器返回指定页面数据静态Web服务器多任务版静态Web服务器面向对象开发静态Web服务器命令行启动动态绑定端口号 Python静态Web服务器开发 Web静态服务…

求集合的笛卡尔乘积

求集合的笛卡尔乘积 一:【实验目的】二:【实验内容】三:【实验原理】四:代码实现: 一:【实验目的】 通过编实现给定集合A和B的笛卡尔积CAA,DAB,EBA,FAAB,GA(A*B). 二:【实验内容】…

Linux系统常用指令大全(图文详解)

目录 前言 一、UNIX的登录与退出 1、登录 (1)执行格式: (2)步骤 2、退出 二、UNIX命令格式 三、常用命令 1、目录操作 (1)显示目录文件 ls (2)建新目录 …

PgSQL技术内幕-Analyze做的那些事-pg_stat_all_tables

PgSQL技术内幕-Analyze做的那些事-pg_stat_all_tables pg_stat_all_tables视图中记录有analyze信息,比如何时做的analyze、表元组个数(活元组、死元组)等。重启后发现该视图中表的统计信息重置不见了,发生了什么? 1、p…

纵观手机市场,手机即鏖战全面屏

9月13日,在相继发布Apple TV、Apple Watch 和iPhone 8/8 Plus之后,当大家都以为苹果新品发布会临近结束之时,苹果前CEO史蒂夫乔布斯的这句经典名言再现屏幕,iPhone X终于揭开了神秘面纱。 “One more thing”。 9月13日&#xff…

Java每日一题:26. 删除有序数组中的重复项

删除有序数组中的重复项 分析: 数组是有序的,因此重复的元素会相邻 每次取出两个数进行比较,因此,需要有两个变量去存储每次取出的值 采用双指针方法: 指针p和q, pnum1,qnum2 p和q进行比较&…

【服务器能干什么】搭建一个短网址平台,可以查看数据详情!

昨天在 YouTube 上看到又一个搭建自己短网址的视频教程,用的是开源的 polr,但是按照步骤一步步搭建下来,最后一步都会出现 顺哥轻创 PLAINTEXT Whoops, looks like something went wrong百度、谷歌查了一圈也没找到有效的解决方法。&#x…

1.2 全加器

处理1个进位的加法 根据半加器可知,结果和进位只有1种情况:要么有结果要么有进位因此全加器可由2个半加器组合而成通过一个半加器输出的结果和进位再次由另一个半加器输出2个半加器的进位通过或门输出

Python 安装Vue依赖包发生异常:npm ERR! notsup Required: {“node“:“^18.17.0 || >=20.5.0“}

异常: 原因:node和npm要求升级为高版本 解决:重新安装node环境 (1) 官网下载Node.js (2)双击安装node.js (3)运行查看

STK Components 二次开发-创建卫星

1.卫星数据 可以用stk 里面自带的 参数帮助文档。 也可以自己下载 CelesTrak: Current GP Element Sets 这里你所需要的最新卫星数据全有。 其实创建需要的就是卫星的二根数。 给定二根数也可以。 读取数据库中的卫星数据 这个接口优先下载最新的。 var tleList TwoL…

宝塔面板安装搭建DiscuzQ论坛教程与小程序上架发布后的展示效果

DiscuzQ论坛小程序上架发布后的展示效果: 1、需要用到的环境: php7.2 mysql5.7或者MariaDB 10.2(我安装用的mysql8.0) php除了必要的一些扩展外,还需要启用readlink、symlink函数等,具体看官方说明,安装的时候也会提醒…

MidJourney笔记(3)-Prompts

MidJourney的Prompts介绍 MidJourney的Prompts是MidJourney的核心之一,这也是我们后续使用MidJourney过程中最重要的工作内容,根据生成的图片,不断的优化我们的Prompts内容。 那Prompts的中文意思是提示的意思。 Prompts的提示语有很多,最基础的用法就是: /imagine prompt…

【数据结构实验】查找(一)基于散列表的查找算法

文章目录 1. 引言2. 实验原理2.1 散列表2.2 线性探测法2.3 冲突解决 3. 实验内容3.1 实验题目(一)输入要求(二)输出要求 3.2 算法实现3.3 代码整合 4. 实验结果 1. 引言 本实验将通过C语言实现基于散列表的查找算法 2. 实验原理 …

Unity 场景切换

Unity场景切换可使用以下方法: 1、SceneManager.LoadScene()方法: using UnityEngine.SceneManagement;// 切换到Scene2场景 SceneManager.LoadScene("Scene2"); 2、使用SceneManager.LoadSceneAsync()方法异步加载场景,异步加载…

Python pandas对表格进行整行整列筛选、删除或修改,对特定值进行修改

Pandas库的使用 Pandas库:从入门到应用(二)–行列数据读写 Python数据处理工具 ——Pandas(数据的预处理) Pandas库有两个数据类型: Series, DataFrame Series 索引 一维数据DataFrame 行列索引 二维数据 DataFrame类型 DataFrame类型…