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

Redis Stream基本使用及应用场景

一、概念

Redis Streams是Redis5.0提供的一种消息队列机制,支持多播的可持久化的消息队列,用户实现发布订阅的功能,借鉴了kafka设计。

二、常用命令

命令名称描述
XADD key ID field value [field value ...]添加一条消息
  • key:Stream 的名称;
  • ID:消息的唯一标识符,可以使用 * 自动生成;
  • field value:消息的内容,以键值对的形式存储。
XREAD [COUNT count] STREAMS key [ID]

从一个或多个 Stream 中读取消息。

  • COUNT:限制返回的消息数量(可选);
  • STREAMS:指定要读取的 Stream 键;
  • ID:指定从哪个消息 ID 开始读取($ 表示只读取新消息,0 表示从头开始读取)。
XREADGROUP GROUP group consumer [COUNT count] STREAMS key [ID]

从消费者组中读取消息。

  • GROUP:指定消费者组名称;
  • consumer:指定消费者名称;
  • ID:通常使用 > 表示只读取未消费的消息。
XGROUP CREATE key groupname ID

创建一个新的消费者组。

  • key:Stream 的名称;
  • groupname:消费者组名称;
  • ID:指定消费者组从哪个消息 ID 开始消费($ 表示从最新消息开始)。
XGROUP DESTROY key groupname删除一个消费者组
XGROUP SETID key groupname ID修改消费者组的起始消费位置
XACK key groupname ID [ID ...]

确认消息已被成功处理。

  • key:Stream 的名称。
  • groupname:消费者组名称。
  • ID:需要确认的消息 ID。
XPENDING key groupname查看消费者组中未确认的消息统计信息
XPENDING key groupname start end count [consumer]查看具体的未确认消息列表
XDEL key ID [ID ...]

删除指定的消息。

  • key:Stream 的名称。
  • ID:需要删除的消息 ID。
XTRIM key MAXLEN [=|~] threshold

控制 Stream 的长度,删除旧消息。

  • MAXLEN:设置最大长度。
  • =:严格模式,保留指定数量的消息。
  • ~:近似模式,可能保留比指定数量稍多的消息。
XINFO STREAM key获取 Stream 的基本信息
XINFO GROUPS key获取 Stream 的所有消费者组信息
XINFO CONSUMERS key groupname获取消费者组中的所有消费者信息
XLEN sms_stream查看Stream长度

三、应用场景

采用Redis Streams 实现短信发送队列的异步处理,替代传统List列表无数据轮询模式,降低系统资源消耗。

角色定义

  • 生产者:短信网关服务,将待发送短信封装为消息写入Redis Stream。

  • 消费者组:多个短信处理节点(Consumer Group),每个节点负责消费部分消息。

  • 消息格式:使用Protobuf序列化消息体,包含手机号、内容、模板ID等字段。

1.Redis命令实现

生产者通过XADD命令写入Stream

XADD sms_stream * mobile "13800138000" content "您的验证码是1234" template_id "T1001"

消费者通过XREADGROUP阻塞读取消息

XREADGROUP GROUP sms_group consumer1 COUNT 1 BLOCK 5000 STREAMS sms_stream >

消息处理成功后发送XACK确认

XACK sms_stream sms_group "1678905140000-0"

消费者组初始化

XGROUP CREATE sms_stream sms_group $ MKSTREAM

消息重试机制,Pending List处理:定时扫描未ACK的消息(超过30秒未确认),重新投递

local pending = XPENDING sms_stream sms_group - + 10
for each message in pending doXCLAIM sms_stream sms_group consumer2 30000 <message-id>
end

限制Stream最大长度(避免内存溢出)

 四、与传统轮询模式对比
维度传统轮询(List/LPOP)Redis Streams
资源消耗高频空轮询消耗CPU/网络阻塞读取,无消息时挂起,降低30% CPU
消息可靠性无ACK机制,消息可能丢失支持ACK+Pending List,确保至少一次投递
吞吐量单消费者约5万条/秒消费者组多节点并行,可达20万条/秒
功能扩展仅基础队列支持多消费者组、消息回溯、阻塞读取

相关文章:

Redis Stream基本使用及应用场景

一、概念 Redis Streams是Redis5.0提供的一种消息队列机制&#xff0c;支持多播的可持久化的消息队列&#xff0c;用户实现发布订阅的功能&#xff0c;借鉴了kafka设计。 二、常用命令 命令名称描述XADD key ID field value [field value ...]添加一条消息 key&#xff1a;St…...

amcl :odometry 到global frame 的转换

amcl - ROS Wiki amcl - ROS Wiki...

Ollama下载安装+本地部署DeepSeek+UI可视化+搭建个人知识库——详解!(Windows版本)

目录 1️⃣下载和安装Ollama 1. &#x1f947;官网下载安装包 2. &#x1f948;安装Ollama 3.&#x1f949;配置Ollama环境变量 4、&#x1f389;验证Ollama 2️⃣本地部署DeepSeek 1. 选择模型并下载 2. 验证和使用DeepSeek 3️⃣使用可视化工具 1. Chrome插件-Page …...

解决Value of type ‘AVCodecContext‘ has no member ‘channels‘ 的问题

在 FFmpeg 7.1 中,AVCodecContext 的 channels 和 channel_layout 字段已经被移除,取而代之的是 AVChannelLayout 结构。因此,代码需要进行调整以适应新的 API。 以下是如何正确设置 AVCodecContext 和 AVCodecParameters 的方法。 1. 问题分析 在 FFmpeg 7.1 中: AVCode…...

STM32内存五区及堆栈空间大小设置(启动文件浅析)

前言 嘿&#xff0c;朋友们&#xff01;今天咱们来聊聊STM32的内存五区和堆栈空间大小设置。这可是嵌入式开发里的“必修课”&#xff0c;要是没整明白&#xff0c;程序说不定就“翻车”了。别担心&#xff0c;我这就带你一步步搞懂这事儿&#xff0c;让你轻松上手&#xff0c…...

定义数组存储3部汽车对象(class2:类在class1中请看上一篇博客)

package test3; import java.util.Scanner; public class carTest {public static void main(String[] args){//创建一个数组car[] arrnew car[3];//2创建汽车对象&#xff0c;来源于输入Scanner sc new Scanner(System.in);for (int i 0; i <arr.length ; i) {car cnew ca…...

Go红队开发—语法补充

文章目录 错误控制使用自定义错误类型错误包装errors.Is 和 errors.Aspanic捕获、recover 、defer错误控制练习 接口结构体实现接口基本类型实现接口切片实现接口 接口练习Embed嵌入文件 之前有师傅问这个系列好像跟红队没啥关系&#xff0c;前几期确实没啥关系&#xff0c;因为…...

IP----访问服务器流程

这只是IP的其中一块内容-访问服务器流程&#xff0c;IP还有更多内容可以查看IP专栏&#xff0c;前一段学习内容为IA内容&#xff0c;还有更多内容可以查看IA专栏&#xff0c;可通过以下路径查看IA-----配置NAT-CSDN博客CSDN,欢迎指正 1.访问服务器流程 1.分层 1.更利于标准化…...

阿里云ack的创建与实战应用案例

阿里云ack的创建与应用案例 创建前开通ack相关服务&#xff1a;开始创建简单的魔方游戏&#xff0c;熟悉sv与clb自动注册创建部署一个nginx 服务示例&#xff1a;走不同域名访问不同svc资源&#xff1a;为什么需要 Ingress &#xff1f;创建第一个域名的 Deployment和Service。…...

git 的 Detached HEAD

在 Git 版本管理中&#xff0c;Detached HEAD 是指你当前的工作状态不再指向任何分支&#xff0c;而是指向一个特定的提交&#xff08;commit&#xff09;。 通常情况下&#xff0c;HEAD 是指向你当前工作分支的指针&#xff0c;例如 main 或 feature-branch。当你切换到一个特…...

【R语言】dplyr包经典函数summarise函数

dplyr包经典函数summarise函数&#xff0c;后面改名乘reframe函数了&#xff0c;但是summarise仍然适用 这个函数的返回结果是一个新的数据框&#xff0c;下面讲一下几种常见用法 示例数据为R自带的数据集mtcars 1.不分组 mtcars %>%summarise(mean mean(disp), n n()…...

C#装箱拆箱机制详解

在C#中&#xff0c;装箱&#xff08;Boxing&#xff09;和拆箱&#xff08;Unboxing&#xff09; 是值类型与引用类型之间转换的核心机制。它们的实现直接影响程序的性能和类型安全。 一、装箱&#xff08;Boxing&#xff09; 定义&#xff1a; 将值类型转换为引用类型&#…...

llama.cpp 一键运行本地大模型 - Windows

文章目录 llama.cpp 一键运行本地大模型 - Windows嘿&#xff0c;咱来唠唠 llama.cpp 这玩意儿&#xff01;gguf 格式是啥&#xff1f;咱得好好说道说道基座模型咋选&#xff1f;所需物料&#xff0c;咱得准备齐全咯核心命令&#xff0c;得记牢啦运行方式咋选&#xff1f;测试应…...

BUU40 [CSCCTF 2019 Qual]FlaskLight1【SSTI】

模板&#xff1a; {{.__class__.__base__.__subclasses__()[80].__init__.__globals__[__builtins__].eval("__import__(os).popen(type flag.txt).read()")}} 是个空字符串&#xff0c;.__class__代表这个空字符串的类是什么&#xff08;这里是单引号双引号都行&a…...

数据同步的中间件

以下是10个支持MySQL、HBase、ClickHouse、HDFS等不同数据库之间数据同步的GitHub项目推荐&#xff1a; 项目名称语言主要特点支持的数据库GitHub链接DataXPython阿里巴巴开源的数据同步工具&#xff0c;支持多种数据库和文件系统。MySQL、ClickHouse、HDFS等GitHub链接Apache…...

C# | GDI+图像测距辅助线的实现思路

C# | GDI图像测距辅助线的实现思路 文章目录 C# | GDI图像测距辅助线的实现思路一、辅助线需求概述二、坐标系与角度计算2.1 笛卡尔坐标系2.2 线长和角度计算方法2.3 文本角度矫正计算方法2.4 坐标变换实现步骤 三、与if判断方式对比四、总结 一、辅助线需求概述 在图像测量工…...

【备份】php项目处理跨域请求踩坑

这都是老生常谈的东西了。我还在踩坑&#xff0c;记录一下。 我在项目入口明明写了如下代码&#xff1a; // 处理预检请求 (OPTIONS) if ($_SERVER[REQUEST_METHOD] OPTIONS) {header("Access-Control-Allow-Origin: https://xxx.vip");header("Access-Cont…...

常见的Linux面试题

以下是一些常见的Linux面试题&#xff1a; 基础操作类 如何远程连接Linux服务器&#xff1a;常用的工具如Xshell、CRT、FinalShell等&#xff0c;通过SSH协议连接&#xff0c;默认端口是22。 如何查看当前目录下的所有文件&#xff08;包括隐藏文件&#xff09;&#xff1a;使…...

MySQL 数据库本地及异地备份:全面指南

文章目录 MySQL 数据库本地及异地备份&#xff1a;全面指南备份脚本概述编写备份脚本脚本内容主要参数解释设置脚本权限 定期执行备份设置crontab任务 安全性建议避免明文密码rsync密码文件安全 进阶功能和优化增量备份备份验证日志轮转 总结附录&#xff1a;脚本依赖 MySQL 数…...

免费使用 DeepSeek API 教程及资源汇总

免费使用 DeepSeek API 教程及资源汇总 一、DeepSeek API 资源汇总1.1 火山引擎1.2 百度千帆1.3 阿里百炼1.4 腾讯云 二、其他平台2.1 华为云2.2 硅基流动 三、总结 DeepSeek-R1 作为 2025 年初发布的推理大模型&#xff0c;凭借其卓越的逻辑推理能力和成本优势&#xff0c;迅速…...

java后端开发day20--面向对象进阶(一)--static继承

&#xff08;以下内容全部来自上述课程&#xff09; 1.static–静态–共享 static表示静态&#xff0c;是java中的一个修饰符&#xff0c;可以修饰成员方法&#xff0c;成员变量。 1.静态变量 被static修饰的成员变量&#xff0c;叫做静态变量。 特点&#xff1a; 被该类…...

统计学中的得分函数(Score Function)是什么?它和Fisher信息矩阵有什么关系?

得分函数&#xff1a;统计学中的“敏感探针” 在统计学和概率论中&#xff0c;得分函数&#xff08;Score Function&#xff09;是一个看似简单却非常重要的概念。它不仅是Fisher信息矩阵的核心组成部分&#xff0c;还在参数估计、模型优化等领域发挥着关键作用。今天&#xf…...

Spring Boot集成MyBatis访问MySQL:从项目搭建到基础数据库查询(基础入门)

Spring Boot集成MyBatis访问MySQL 一、引言 在当今企业级应用开发中&#xff0c;Spring Boot、MyBatis与MySQL的组合凭借其高效性和灵活性&#xff0c;成为构建数据驱动型应用的首选方案。本文将带你从零开始搭建项目&#xff0c;掌握Spring Boot集成MyBatis的基础入门内容。…...

ShenNiusModularity项目源码学习(14:ShenNius.Infrastructure项目分析)

ShenNius.Infrastructure项目用于定义ShenNius.Admin.Mvc项目和ShenNius.Admin.API项目共用的特性类、数据操作接口实现类、上下文类、通讯类&#xff0c;主要文件的用途如下&#xff1a;   Attributes文件夹保存特性类或过滤器类定义&#xff0c;主要包括&#xff1a;   …...

Linux 内核配置机制详细讲解

本文是对 Linux 内核配置机制 make menuconfig 的 超详细分步解析&#xff0c;涵盖其工作原理、界面操作、配置逻辑及底层实现&#xff1a; 一、内核配置系统概述 Linux 内核的配置系统是一个 基于文本的交互式配置工具链&#xff0c;核心目标是通过定义 CONFIG_XXX 宏来控制内…...

【C语言】第八期——指针、二维数组与字符串

目录 1 初始指针 2 获取变量的地址 3 定义指针变量、取地址、取值 3.1 定义指针变量 3.2 取地址、取值 4 对指针变量进行读写操作 5 指针变量作为函数参数 6 数组与指针 6.1 指针元素指向数组 6.2 指针加减运算&#xff08;了解&#xff09; 6.2.1 指针加减具体数字…...

Spring Boot集成Spring Security之HTTP请求授权

一、HTTP请求授权工作原理 ​ 基于Spring Security最新的Http请求授权讲解&#xff0c;不再使用旧版的请求授权 授权过滤器AuthorizationFilter获取认证信息 调用RequestMatcherDelegatingAuthorizationManager的check方法验证该用户是否具有该请求的授权 RequestMatcherDele…...

可以免费无限次下载PPT的网站

前言 最近发现了一个超实用的网站&#xff0c;想分享给大家。 在学习和工作的过程中&#xff0c;想必做PPT是一件让大家都很头疼的一件事。 想下载一些PPT模板减少做PPT的工作量&#xff0c;但网上大多精美的PPT都是需要付费才能下载使用。 即使免费也有次数限制&#xff0…...

DeepSeek 开源周:DeepEP 项目详解,GPU 压榨计划启动!

引言 就在今天&#xff0c;2025年2月25日&#xff0c;DeepSeek 再次为人工智能社区带来了一场技术盛宴——DeepEP 项目的开源。这个旨在优化 GPU 性能的工具一经发布便迅速获得了广泛的关注和赞誉&#xff0c;短短两小时内就斩获了超过1000个 Star。本文将详细介绍 DeepEP 的功…...

GPT1 与 GPT2 的异同

1.什么是GPT1&#xff1a; GPT1介绍了一种通过生成式预训练&#xff08;Generative Pre-Training&#xff09;来提升语言理解能力的方法。这种方法首先在一个大型的未标注文本语料库上进行语言模型的预训练&#xff0c;然后针对具体的任务进行判别式微调&#xff08;discrimin…...