当前位置: 首页 > news >正文

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

在这里插入图片描述

个人简介: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

在这里插入图片描述


重点问题

在这里插入图片描述





在这里插入图片描述

相关文章:

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

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

浙江启用无人机巡山护林模式,火灾扑救效率高

为了保护天然的森林资源,浙江当地林业部门引入了一种创新技术:林业无人机。这些天空中的守护者正在重新定义森林防火和护林工作的方式。 当下正值天气干燥的季节,这些无人机开始了它们的首次大规模任务。它们在指定的林区内自主巡逻&#xff…...

Starrocks异步物化视图的使用以及注意事项

最近在使用starrocks来进行实时数据项目的开发,尝试使用了一下starrocks的异步物化视图。 使用版本: 3.1.2-4f3a2ee 创建三个测试表, 注意只有test_mv_table1为分区表,其他两个都是非分区表: CREATE TABLE test_mv_table1 (periodday DATE NOT NULL CO…...

SpringBoot整合Sharding-Jdbc实现分库分表和分布式全局id

SpringBoot整合Sharding-Jdbc Sharding-Jdbc sharding-jdbc是客户端代理的数据库中间件;它和MyCat最大的不同是sharding-jdbc支持库内分表。 整合 数据库环境 在两台不同的主机上分别都创建了sharding_order数据库,库中都有t_order_1和t_order_2两张…...

「江鸟中原」有关HarmonyOS-ArkTS的Http通信请求

一、Http简介 HTTP(Hypertext Transfer Protocol)是一种用于在Web应用程序之间进行通信的协议,通过运输层的TCP协议建立连接、传输数据。Http通信数据以报文的形式进行传输。Http的一次事务包括一个请求和一个响应。 Http通信是基于客户端-服…...

vuex的使用笔记

1.安装 npm安装 npm install vuexnext --saveyarn安装 yarn add vuexnext --save2.基本结构 import Vuex from vuexconst store createStore({ //状态:相当于vue中的data() state() {return {name: 0,code:"",todos: [{ id: 1…...

汇编:关于栈的知识

1.入栈和出栈指令 2. SS与SP 3. 入栈与出栈 3.1 执行push ax ↑↑ 3.2 执行pop ax ↓↓ 3.3 栈顶超界的问题 4. 寄存器赋值 基于8086CPU编程时,可以将一段内存当作栈来使用。一个栈段最大可以设为64KB(0-FFFFH)。 1.入栈和出栈指令…...

uniapp使用map标签

在UniApp中,可以使用map标签来显示地图,并通过其属性来自定义地图的样式和行为。以下是一些常用的map标签属性: id:用于给地图组件指定一个唯一的标识符,方便在代码中进行引用和操作。 style:用来设置地图…...

MacOS14 Sonoma 安装 Flutter 开发环境

本文针对 小白用户也包括自己,以前都是将这些写入我的有道云笔记。为了让给多人看见或者说自己更好的浏览,先将其记录如下。 朋友介绍一个项目说要开发一款App,最近也是闲着就答应下来。主要功能是通过蓝牙BLE控制设备的一个 Iot边缘设备&…...

【Web】PHP反序列化刷题记录

目录 ①[NISACTF 2022]babyserialize ②[NISACTF 2022]popchains ③[SWPUCTF 2022 新生赛]ez_ez_unserialize ④[GDOUCTF 2023]反方向的钟 再巩固下基础 ①[NISACTF 2022]babyserialize <?php include "waf.php"; class NISA{public $fun"show_me_fla…...

C++标准模板库 STL 简介(standard template library)

在 C 语言中&#xff0c;很多东西都是由我们自己去实现的&#xff0c;例如自定义数组&#xff0c;线程文件操作&#xff0c;排序算法等等&#xff0c;有些复杂的东西实现不好很容易留下不易发现的 bug。而 C为使用者提供了一套标准模板库 STL,其中封装了很多实用的容器&#xf…...

Linux篇:文件系统

一、共识原理&#xff1a; 文件文件内容文件属性 磁盘上存储文件存文件的内容&#xff08;数据块&#xff09;存文件的属性&#xff08;inode&#xff09; Linux的文件在磁盘中存储是将属性和内容分开存储的。 二、硬件简述&#xff1a; 1. 认识硬件 磁盘&#xff1a;唯一的一…...

AI - Crowd Simulation(集群模拟)

类似鱼群&#xff0c;鸟群这种群体运动模拟。 是Microscopic Models 微观模型&#xff0c;定义每一个个体的行为&#xff0c;然后合在一起。 主要是根据一定范围内族群其他对象的运动状态决定自己的运动状态 Cohesion 保证个体不会脱离群体 求物体一定半径范围内的其他临近物…...

<JavaEE> Java中线程有多少种状态(State)?状态之间的关系有什么关系?

目录 一、系统内核中的线程状态 二、Java中的线程状态 一、系统内核中的线程状态 状态说明就绪状态线程已经准备就绪&#xff0c;随时可以接受CPU的调度。阻塞状态线程处于阻塞等待&#xff0c;暂时无法在CPU中执行。 二、Java中的线程状态 相比于系统内核&#xff0c;Java…...

正则表达式 通配符 awk文本处理工具

目录 什么是正则表达式 概念 正则表达式的结构 正则表达式的组成 元字符 元字符点&#xff08;.&#xff09; 代表字符. 点值表示点需要转义 \ r..t 代表r到t之间任意两个字符 过滤出小写 过滤出非小写 space空格 [[:space:]] 表示次数 位置锚定 例&#xff1a…...

三、ts高级笔记,

文章目录 18、d.ts声明文件19、Mixin混入20、Decorator装饰器的使用21、-高级proxy拦截_Reflect元储存22、-高级写法Partial-Pick23、Readonly只读_Record套对象24、高阶写法Infer占位符25、Inter实现提取类型和倒叙递归26、object、Object、{}的区别27、localStorage封装28、协…...

二十一、数组(6)

本章概要 数组排序Arrays.sort的使用并行排序binarySearch二分查找parallelPrefix并行前缀 数组排序 根据对象的实际类型执行比较排序。一种方法是为不同的类型编写对应的排序方法&#xff0c;但是这样的代码不能复用。 编程设计的一个主要目标是“将易变的元素与稳定的元素…...

flask依据现有的库表快速生成flask实体类

flask依据现有的库表快速生成flask实体类 在实际开发过程中&#xff0c;flask的sqlalchemy对应的model类写起来重复性较强&#xff0c;如果表比较多会比较繁琐&#xff0c;这个时候可以使用 flask-sqlacodegen 来快速的生成model程序或者py文件&#xff0c;以下是简单的示例&a…...

.NET6 开发一个检查某些状态持续多长时间的类

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,我们面对的不仅仅是技术还有人心,人心不可测,海水不可量,唯有技术,才是深沉黑夜中的一座闪烁的灯塔 !序言 在代码的世界里,时常碰撞…...

链表K个节点的组内逆序调整问题

链表K个节点的组内逆序调整问题 作者&#xff1a;Grey 原文地址&#xff1a; 博客园&#xff1a;链表K个节点的组内逆序调整问题 CSDN&#xff1a;链表K个节点的组内逆序调整问题 题目描述 LeetCode 25. Reverse Nodes in k-Group 本题的 follow up 是&#xff1a; Fol…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...