Redis 数据类型Streams
目录
1 基本特性
2 主要操作命令
2.1 XADD key ID field value [field value ...]
2.2 XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...]
2.3 XRANGE key start end [COUNT count]
2.4 XREVRANGE key end start [COUNT count]
2.5 XGROUP CREATE key groupname id-or-$ [MKSTREAM]
2.6 XREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds] [NOACK] STREAMS key [key ...] ID [ID ...]
2.7 XACK key group ID [ID ...]
2.8 XPENDING key group [start end count] [IDLE idle]
2.9 XCLAIM key group consumer min-idle-time ID [ID ...] [IDLE idle] [TIME time] [RETries count] [FORCE]
2.10 XINFO
2.11 XDEL key ID [ID ...]
2.12 XTRIM key MAXLEN [~] len
3 使用场景
Redis Streams 是 Redis 5.0 引入的一种新的数据类型,它提供了一种强大的日志结构化数据存储方式。Streams 类型非常适合用于构建消息队列、事件日志以及其他需要持久化和高效处理时间序列数据的应用场景。
1 基本特性
-
持久性:与传统的发布/订阅不同,Streams 中的消息是持久化的,即使客户端断开连接后重新连接,仍然可以访问到之前的消息。
-
多消费者支持:支持多个消费者组(consumer groups),每个组可以独立地消费流中的消息。消费者组允许不同的消费者处理相同的消息,但每个消息在一个组内只能被一个消费者处理一次。
-
消息 ID 和范围查询:每条消息都有一个唯一的 ID,由时间戳和序列号组成。可以通过指定消息 ID 范围来获取特定时间段内的消息。
-
阻塞读取:支持阻塞读取(
XREAD和XREADGROUP命令的BLOCK选项),使得客户端可以在没有新消息时等待一段时间。 -
自动删除:可以设置最大长度(
MAXLEN选项)来限制流的大小,超过长度的消息会自动被删除。 -
灵活的消息格式:每条消息可以包含多个字段-值对,类似于哈希表,这使得消息可以携带丰富的信息。
2 主要操作命令
2.1 XADD key ID field value [field value ...]
向指定的流中添加一条新消息,ID 可以是 *(表示自动生成)或指定的时间戳和序列号。
127.0.0.1:6379> xadd mystream * sensor_id 123 temmperature 22.5
"1729306027171-0"
返回的结构可以分为两部分:
- 时间戳:
1729306027171 (表示条目被添加的时间,单位是毫秒。你可以将这个时间戳转换为可读的日期和时间格式。) - 序列号:
0 (表示在同一毫秒内这是第一个条目。如果在同一毫秒内添加了多个条目,序列号将会递增,例如1729306027171-1、1729306027171-2等。)
2.2 XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...]
- 从一个或多个 Stream 中读取数据。
COUNT指定返回的最大条目数。BLOCK指定在没有新消息时阻塞的时间(毫秒)。STREAMS指定要读取的 Stream 和起始 ID。
127.0.0.1:6379> xread count 2 streams mystream 0-0
1) 1) "mystream"2) 1) 1) "1729306027171-0"2) 1) "sensor_id"2) "123"3) "temmperature"4) "22.5"
2.3 XRANGE key start end [COUNT count]
- 返回指定 ID 范围内的条目。
start和end是 ID,可以使用-表示最小 ID,+表示最大 ID。
127.0.0.1:6379> xrange mystream - +
1) 1) "1729306027171-0"2) 1) "sensor_id"2) "123"3) "temmperature"4) "22.5"
2.4 XREVRANGE key end start [COUNT count]
返回指定 ID 范围内的条目,但按逆序排列。
127.0.0.1:6379> xadd mystream * sensor_id 234 temmperature 23.5
"1729329067777-0"
127.0.0.1:6379> xadd mystream * sensor_id 345
"1729329079135-0"
127.0.0.1:6379> xrevrange mystream + - count 2
1) 1) "1729329079135-0"2) 1) "sensor_id"2) "345"
2) 1) "1729329067777-0"2) 1) "sensor_id"2) "234"3) "temmperature"4) "23.5"
2.5 XGROUP CREATE key groupname id-or-$ [MKSTREAM]
- 创建一个新的消费者组。
id-or-$是起始位置,可以是具体的 ID 或$表示只消费新的条目。MKSTREAM如果 Stream 不存在则创建它。
127.0.0.1:6379> xgroup create mystream mygroup 0
OK
2.6 XREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds] [NOACK] STREAMS key [key ...] ID [ID ...]
- 从消费者组中读取数据。
- GROUP:指定消费者组的名称。
- consumer:指定消费者的名称。
- COUNT count:可选参数,指定一次最多读取的消息数量。
- BLOCK milliseconds:可选参数,如果当前没有可用的消息,命令将阻塞指定的时间(以毫秒为单位),等待新消息的到来。
- NOACK: 表示不确认消息,通常用于快速消费。
- STREAMS:指定要读取的流及其对应的 ID。ID 通常是一个特殊值
>,表示只读取新的消息;也可以是具体的 ID,表示从该 ID 开始读取。
127.0.0.1:6379> xreadgroup group mygroup consumer1 count 2 streams mystream >
1) 1) "mystream"2) 1) 1) "1729306027171-0"2) 1) "sensor_id"2) "123"3) "temmperature"4) "22.5"2) 1) "1729329067777-0"2) 1) "sensor_id"2) "234"3) "temmperature"4) "23.5"
2.7 XACK key group ID [ID ...]
确认已处理的消息。XACK 命令用于确认消费者组中的消息已经被成功处理。当你使用 XACK 命令时,Redis 会将指定的消息从“待处理”状态转换为“已确认”状态,并从消费者的待处理列表中移除。
127.0.0.1:6379> xack mystream mygroup 1729329067777-0
(integer) 1
127.0.0.1:6379> xack mystream mygroup 1729329079135-0
(integer) 0
当 XACK 命令成功确认一条消息时,返回值为 1,表示该消息已经被确认并且从待处理列表中移除。例如,如果消息 1729329067777-0 是由 consumer1 处理的,并且现在调用 XACK 确认它,那么这条消息将不再出现在 consumer1 的待处理列表中。
2.8 XPENDING key group [start end count] [IDLE idle]
查看待处理的消息。
127.0.0.1:6379> xpending mystream mygroup
1) (integer) 1
2) "1729306027171-0"
3) "1729306027171-0"
4) 1) 1) "consumer1"2) "1"
127.0.0.1:6379> xack mystream mygroup 1729306027171-0
(integer) 1
127.0.0.1:6379> xpending mystream mygroup
1) (integer) 0
2) (nil)
3) (nil)
4) (nil)
2.9 XCLAIM key group consumer min-idle-time ID [ID ...] [IDLE idle] [TIME time] [RETries count] [FORCE]
用于将一个或多个消息从一个消费者转移到另一个消费者。这个命令通常用于处理消息超时或重新分配消息的情况。XCLAIM 允许你手动将消息从一个消费者的待处理列表移动到另一个消费者的待处理列表。
127.0.0.1:6379> xreadgroup group mygroup consumer1 count 2 streams mystream >
1) 1) "mystream"2) 1) 1) "1729329079135-0"2) 1) "sensor_id"2) "345"
127.0.0.1:6379> xclaim mystream mygroup consumer2 10000 1729329079135-0
1) 1) "1729329079135-0"2) 1) "sensor_id"2) "345"
- mystream:流的名称。
- mygroup:消费者组的名称。
- consumer2:目标消费者的名称,即消息将被转移给这个消费者。
- 10000:消息的空闲时间(以毫秒为单位)。只有那些空闲时间超过这个值的消息才会被转移。
- 1729329079135-0:要转移的消息 ID。
2.10 XINFO
获取 Stream 或消费者组的信息。
127.0.0.1:6379> xinfo stream mystream1) "length"2) (integer) 33) "radix-tree-keys"4) (integer) 15) "radix-tree-nodes"6) (integer) 27) "groups"8) (integer) 19) "last-generated-id"
10) "1729329079135-0"
11) "first-entry"
12) 1) "1729306027171-0"2) 1) "sensor_id"2) "123"3) "temmperature"4) "22.5"
13) "last-entry"
14) 1) "1729329079135-0"2) 1) "sensor_id"2) "345"
127.0.0.1:6379> xinfo groups mystream
1) 1) "name"2) "mygroup"3) "consumers"4) (integer) 25) "pending"6) (integer) 17) "last-delivered-id"8) "1729329079135-0"
127.0.0.1:6379> xinfo consumers mystream mygroup
1) 1) "name"2) "consumer1"3) "pending"4) (integer) 05) "idle"6) (integer) 255317
2) 1) "name"2) "consumer2"3) "pending"4) (integer) 15) "idle"6) (integer) 191940
XINFO STREAM mystream
-
length:- 流中的消息总数:3 条。
-
radix-tree-keys:- 用于存储流数据的 radix tree 中的键的数量:1 个。
-
radix-tree-nodes:- 用于存储流数据的 radix tree 中的节点数量:2 个。
-
groups:- 与该流关联的消费者组数量:1 个。
-
last-generated-id:- 流中最后生成的消息 ID:
1729329079135-0。
- 流中最后生成的消息 ID:
-
first-entry:- 流中的第一条消息:
- 消息 ID:
1729306027171-0 - 消息内容:
sensor_id:123temmperature:22.5
- 消息 ID:
- 流中的第一条消息:
-
last-entry:- 流中的最后一条消息:
- 消息 ID:
1729329079135-0 - 消息内容:
sensor_id:345
- 消息 ID:
- 流中的最后一条消息:
XINFO GROUPS mystream
-
name:- 消费者组的名称:
mygroup。
- 消费者组的名称:
-
consumers:- 该组中的消费者数量:2 个。
-
pending:- 该组中待处理的消息数量:1 条。
-
last-delivered-id:- 该组中最后一个被交付的消息 ID:
1729329079135-0。
- 该组中最后一个被交付的消息 ID:
XINFO CONSUMERS mystream mygroup
-
第一个消费者:
name:consumer1pending: 待处理的消息数量:0 条idle: 空闲时间(以毫秒为单位):255,317 毫秒(约 4 分钟 15 秒)
-
第二个消费者:
name:consumer2pending: 待处理的消息数量:1 条idle: 空闲时间(以毫秒为单位):191,940 毫秒(约 3 分钟 12 秒)
2.11 XDEL key ID [ID ...]
从 Stream 中删除一个或多个条目。
127.0.0.1:6379> xdel mystream 1729306027171-0
(integer) 1
127.0.0.1:6379> xrange mystrea - +
(empty list or set)
127.0.0.1:6379> xrange mystream - +
1) 1) "1729329067777-0"2) 1) "sensor_id"2) "234"3) "temmperature"4) "23.5"
2) 1) "1729329079135-0"2) 1) "sensor_id"2) "345"
2.12 XTRIM key MAXLEN [~] len
修剪 Stream,保留最多 len 个条目,~ 表示近似长度。
127.0.0.1:6379> xrange mystream - +
1) 1) "1729329067777-0"2) 1) "sensor_id"2) "234"3) "temmperature"4) "23.5"
2) 1) "1729329079135-0"2) 1) "sensor_id"2) "345"
127.0.0.1:6379> xtrim mystream maxlen 1
(integer) 1
127.0.0.1:6379> xrange mystream - +
1) 1) "1729329079135-0"2) 1) "sensor_id"2) "345"
3 使用场景
- 日志记录:可以用来存储系统的日志信息,方便后续分析和处理。
- 事件流:处理实时事件,如传感器数据、用户行为等。
- 消息队列:实现可靠的消息传递系统,支持多个消费者组。
- 任务队列:管理后台任务,确保任务被正确处理。
更多命令请参考:Commands | Docs
相关文章:
Redis 数据类型Streams
目录 1 基本特性 2 主要操作命令 2.1 XADD key ID field value [field value ...] 2.2 XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...] 2.3 XRANGE key start end [COUNT count] 2.4 XREVRANGE key end start [COUNT count] 2.5 XGROUP …...
基智科技CEO张文战:探索火山引擎数据飞轮模式下的大模型应用新机会
9月下旬,火山引擎数据飞轮研讨会在北京举办,北京基智科技有限公司(以下简称“基智科技”)CEO张文战作为积极探索大模型应用领域的企业代表,围绕“数据飞轮如何转进企业业务流”展开主题分享,并介绍基智科技…...
【AUTOSAR标准文档】AotuSar结构横向分层详解(RTE、BSW)
Top view The AUTOSAR Architecture distinguishes on the highest abstraction level between three software layers: Application, Runtime Environment and Basic Software which run on a Microcontroller. 译文:AUTOSAR架构在最高抽象层次上将软件分为三层&…...
新 Chrome 插件可检测 AI 伪造声音;Canary Speech 推出用于临床对话的语音分析技术丨 RTE 开发者日报
开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…...
1. 路由定义
1. 通过配置文件形式 配置方式与laravel的配置方式相似 <?php use Hyperf\HttpServer\Router\Router;Router::get(/hello-hyperf, function () {return Hello Hyperf.; });// 设置一个 GET 请求的路由,绑定访问地址 /get 到 App\Controller\IndexController 的 …...
我们可以用微服务创建状态机吗?
大家好,我是锋哥。今天分享关于【我们可以用微服务创建状态机吗?】面试题?希望对大家有帮助; 我们可以用微服务创建状态机吗? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 是的,微服务架构可…...
邦芒贴士:职场新人需远离的7种坏习惯
咱们每一个人都会有这样那样的毛病,而试用期就是试毛病的大小。对于职场新人来说,第一份工作很容易暴露这样那样的职业毛病。职业习惯直接决定了我们以后的职业发展,职业能力。对于职场新人来说,在试用期内,一些职场坏…...
面向医院的统一支付平台产品经验分享
我们面向医院的统一支付平台其实应该属于四方平台的范畴,依托于微信、支付宝等第三方支付平台和银联、银行等渠道生存。 二、医院常见系统说明: 先普及一下医院的系统情况: HIS(医院信息系统Hospital Information System):医院内的核心系统,为医院所属各部门提供病人诊…...
http作业
配置nginx服务通过ip访问多网站 1、前提配置 2、安装nginx服务 3、配置多IP 在linux主机上查看ip地址 4、定义nginx文件 5、在主机创建文件,重启nginx服务 6、测试...
AlDente Pro for Mac电脑 充电限制保护工具 安装教程【简单,轻松上手】
Mac分享吧 文章目录 AlDente Pro for Mac 充电限制保护工具 安装完成,软件打开效果一、AlDente Pro for Mac 充电限制保护工具 Mac电脑版——v1.28.41️⃣:下载软件2️⃣:安装软件,将安装包从左侧拖入右侧文件夹中,等…...
C语言数据结构之算法复杂度
目录 一、数据结构是什么 二、算法是什么 三、算法的效率 3.1 复杂度的概念 四、时间复杂度 4.1 大O渐进表示法 4.2 算法题分析 五、空间复杂度 5.1 复杂度对比 5.2 算法题题分析 正文开始 一、数据结构是什么 每个计算机专业的同学在大学都会接触到一门计算机必修课《数…...
HDU RSA
翻译成中文后: 思路:由题易得,d * e y * f ( n ) 1 ,且gcd ( e , f ( n ) ) 1,所以用扩展欧几里得求出 d ,但要保证 d 是非负的,最有用快速幂求出每个字符即可。 #include<bits/stdc.h> using namespace std;…...
数据仓库建设 : 主题域简介
在数据仓库建设中,主题域是数据模型的一个重要概念,它帮助构建逻辑清晰、层次分明的数据结构。主题域的设计基于企业的业务结构,将业务中的关键部分提炼出来,划分为若干个主题域。每个主题域对应一个特定的业务领域,便…...
开源表单生成器OpnForm
什么是 OpnForm ? OpnForm 是一个开源的表单构建工具,旨在简化创建自定义表单的过程,特别适合无编码知识的用户。它通过人工智能优化表单创建流程,支持多种用途,如联系人表单、调查表等。OpnForm 提供了一个直观的拖放…...
Zookeeper面试整理-Zookeeper的基础概念
Zookeeper的基础概念是理解其作为分布式协调服务的核心要素。以下是一些关键的基础概念: 1. Zookeeper是什么? Zookeeper 是一个开源的分布式协调服务,用于分布式应用中的配置管理、命名服务、分布式锁、集群管理等任务。它提供了一组简单的原语,帮助开发人员构建健壮的分布…...
验证archive_command配置是否正确
要验证 archive_command 配置是否正确,你可以按照以下步骤进行: 检查配置文件: 确保 postgresql.conf(或你的 PostgreSQL 实例使用的任何自定义配置文件)中的 archive_command 已经设置为你想要的命令。 重启 …...
2024.10.19小米笔试题解
第一题数独计数 考虑dfs遍历所有情况 n = int(input())def check(grid, x, y, v):dx = [1, 0, -1, 0]dy = [0, 1, 0, -1]for i in range(4):nx, ny = x + dx[i], y + dy[i]if 0 <= nx < 3 and 0 <= ny < 3:if grid[nx][ny] == 0:continueif abs(grid[nx][ny] - v…...
SQL-SERVER导入excel表格
首先先找到数据源,如上图。我们用的是excel表格。 这里你需要选择excel版本,反正你随便选,应该没什么问题的。 再导入数据 我们需要导入最后那个,也就是OLE DB Provider for SQL SERVER 只有这个才能导入到当前的数据库中 接下来…...
Vue学习笔记(三、v-cloak、v-text、v-html指令)
一、 v-cloak v-cloak 是 Vue.js 提供的一个特殊指令,用于在 Vue 实例准备完毕并开始进行 DOM 编译之前隐藏未编译的模板。它通常用于防止页面闪烁或者展示未编译的 Vue 模板语法。 你可以简单地在 HTML 元素上添加 v-cloak 指令,然后在确保 Vue…...
Java | Leetcode Java题解之第496题下一个更大元素I
题目: 题解: class Solution {public int[] nextGreaterElement(int[] nums1, int[] nums2) {Map<Integer, Integer> map new HashMap<Integer, Integer>();Deque<Integer> stack new ArrayDeque<Integer>();for (int i num…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
