⑨【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

在这里插入图片描述


重点问题

在这里插入图片描述





在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

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

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

[架构之路-250]:目标系统 - 设计方法 - 软件工程 - 需求工程 - 需求开发:如何用图形表达需求,面向对象需求分析OOA与UML视图

目录 一、面向对象需求分析 1.1 面向对象的基本概念 1.2 什么是面向对象的需求分析 2.3 什么是UML图 2.4 UML视图 2.4 UML图与UML视图的关系 2.5 UML图与面向对象需求分析的关系 二、需求分析相关的UML图形与视图:14视图 2.1 用例模型与用例图:…

毅速:复杂零件制造首选3D打印

确金属3D打印技术在制造行业的应用日益广泛,为制造业带来了巨大的变革和机遇。这种增材制造技术相较于传统制造工艺具有许多优势,尤其在制造复杂形状零件方面表现出色。 传统制造工艺在制造复杂形状零件时往往面临诸多挑战,如加工难度大、周期…

《大话设计模式》(持续更新中)

《大话设计模式》 序 为什么要学设计模式第0章 面向对象基础什么是对象?什么是类?什么是构造方法?什么是重载?属性与字段有什么区别?什么是封装?什么是继承?什么是多态?抽象类的目的…

深入理解数据结构:链表

文章目录 🌰导语🌰链表的定义及基本结构🌰单链表🥕单链表特点 🌰双向链表🥕双链表特点 🌰循环链表🥕循环链表特点 🌰链表的操作🍆链表的插入🫘链头…

文件批量改名方法:文件自动批量重命名,提升文件管理效率

在日常工作中随着工作时间的推移,在文件数量日益增长的情况下,会在电脑中积累大量的文件。如果文件名混乱无序,查找和识别重要文件将变得非常困难。这不仅会浪费大量的时间和精力,还可能导致重要文件的丢失或混乱。文件批量改名可…

Java的内部类

文章目录 静态内部类(被static修饰的成员内部类)--可以实例化!获取静态内部类对象(把它当成外部类的成员)静态内部类可以声明普通成员变量和方法,而普通内部类不能声明static成员变量和方法静态内部类跟静态方法一样,只能访问静态的成员变量和方法&#…

【计算机网络笔记】多路访问控制(MAC)协议——随机访问MAC协议

系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 计算机网络性能(2)…

[环境配置]vscode免密ssh的设置流程

测试环境: windows 11 ubuntu16.04 vmware 第一步:生成密钥 cmd打开输入:ssh-keygen -t rsa 一路回车后可以在C:\Users\用户名\.ssh路径看到id_rsa.pub,我们打开这个文件,用记事本打开即可,然后复制里…

代码随想录算法训练营第四十六天【动态规划part08】 | 139.单词拆分、背包总结

139.单词拆分 题目链接: 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 求解思路: 单词是物品,字符串s是背包,单词能否组成字符串s,就是问物品能不能把背包装满。 动规五部曲 确定dp数…

VCenter6.7 Web访问提示503 Service Unavailable

PS:本文分享VMware Vcenter在web登录的时候报错:503 Service Unavailable,对于6.7.x版本比较适用,其他版本需自行测试。 简单来讲就是需要重启一下vsphre-client服务,如重启该服务仍无法解决,可以尝试重启一…

从0开始学习JavaScript--JavaScript函数返回值

在JavaScript中,函数是一种强大的工具,不仅能够执行一系列操作,还可以返回值。理解函数返回值的概念对于编写清晰、灵活的代码至关重要。本文将深入探讨JavaScript函数返回值的各种方面,包括基本返回值、多返回值、异步函数的返回…

MySQL MHA高可用架构搭建

快捷查看指令 ctrlf 进行搜索会直接定位到需要的知识点和命令讲解(如有不正确的地方欢迎各位小伙伴在评论区提意见,博主会及时修改) MySQL MHA高可用架构搭建 MHA(Master HA)是一款开源的 MySQL 的高可用程序&#xf…

电磁场信息论及先进MIMO (黄大年茶思屋座谈) 笔记

天线阵的负载动态调控,动态阻抗匹配网络,实时跟着扫描角度的变化而变化,可能突破Hannan极限。 新的天线构架: 周期 —》非周期 每个单元不一样 动态可调,可重构 每个天线多端口或多模式 多层天线 非周期结构天线的增…

#define例题

我们已经学了#define的所有知识,让我们来看这道题,可不要又陷入陷阱 题目要求: #define N 4 #define Y(n) ((N2)*n) int main() {int z 2 * (N Y(5 1));printf("z%d\n", z);return 0; } 求这个z的值是多少? 我们直接…

YOLOv8 训练自己的分割数据集

之前写过一篇 使用YOLOv8训练自己的【目标检测】数据集-【收集数据集】-【标注数据集】-【划分数据集】-【配置训练环境】-【训练模型】-【评估模型】-【导出模型】,里面带大家整个流程走过一遍了, 这篇文章我们来介绍如何使用 YOLOv8 训练分割数据集&a…

旋转框检测项目相关python库知识总结(mmrotate、ppyolo_r、yolov5_obb)

旋转框常用于检测带有角度信息的矩形框,即矩形框的宽和高不再与图像坐标轴平行。相较于水平矩形框,旋转矩形框一般包括更少的背景信息。旋转框检测常用于遥感等场景中,本博文简单的介绍了可应用于旋转框数据训练的开源库,数据结构…

佳易王各行业收银管理系统软件,企业ERP管理软件,企业或个体定制开发软件以及软件教程资源下载总目录,持续更新,可关注收藏查阅

系统简介 1、佳易王软件功能实用、操作简单、软件绿色免安装,解压即可使用,软件已经内置数据库,不需再安装其他数据库文件。 2、佳易王软件,已经形成系列,上百款管理系统软件涵盖多个行业。 3、已为多个企业个体定制…

【c++】——类和对象(下) ——内存管理

作者:chlorine 专栏:c专栏 目录 💻 C/C内存分布 💻C语言中动态内存管理方式:malloc/calloc/realloc/free ​编辑 💻C内存管理方式 👉new/delete操作内置类型 👉new和delete操作自定义类型 &#x1f…

makefile 学习(5)完整的makefile模板

参考自: (1)深度学习部署笔记(二): g, makefile语法,makefile自己的CUDA编程模板(2)https://zhuanlan.zhihu.com/p/396448133(3) 一个挺好的工程模板,(https://github.com/shouxieai/cpp-proj-template) 1. c 编译流…