redis数据结构学习——stream
概念Redis Stream 是 Redis 5.0 引入的持久化消息队列数据结构。你可以把它想象成一个只能追加的日志文件每条消息都有一个自动生成的、按时间排序的唯一 ID格式如 1633000000000-0前半是毫秒时间戳后半是序列号它的核心特性有序消息按加入顺序严格排列持久化消息写入后会落到 Redis 的数据文件中重启不丢失消费者组Consumer Group多个消费者可以组成一个组分工消费消息每条消息只被一个消费者处理ACK 机制消费者处理完消息后需要发送 ACK 确认未确认的消息可以被重新消费阻塞读取消费者可以阻塞等待新消息到来使用场景拍卖行竞拍一个拍卖品一个Stream。性能拍卖品有数百个创建上百个 Stream 完全没问题Redis 轻松应对。但如果是几万、几十万个商品就需要优化了。原因Redis 本身非常轻量每个 Stream 的底层是一个基数树Radix Tree结构即使有上万个 StreamRedis 的内存开销和管理成本也很低。具体来说内存开销每个空的 Stream 约占几百字节到 1KB 的内存100 个就是 100KB 左右微不足道。连接开销消费者通过 XREADGROUP 阻塞读取100 个 Stream 意味着 100 个阻塞连接。Redis 单机支持数万连接100 个完全没压力。CPU 开销每个阻塞读取在有消息到达时才会唤醒空闲时几乎零 CPU。什么时候会有问题如果拍卖行有 10 万个活跃商品每个商品一个 Stream就会出现连接数爆炸10 万个阻塞连接虽然 Redis 能扛但网络和系统资源浪费严重。消费者线程爆炸如果每个 Stream 单开一个线程消费10 万个线程直接打垮服务器。Stream 元数据内存10 万个 Stream 的元数据可能占用数百 MB 内存。运维复杂监控、排查问题困难。优化方案分片 合并消费对于大规模场景我们不会一个商品一个 Stream而是采用分片策略方案 1哈希分片推荐将商品 ID 哈希到固定数量的 Stream 中例如 1024 个 Streamimporthashlibdefget_stream_key(auction_id,shard_count1024): 将 auction_id 映射到 1024 个 Stream 中的一个 同一个 auction_id 永远映射到同一个 Stream保证顺序 shardauction_id%shard_countreturnfbid_stream_shard:{shard}# 使用示例stream_keyget_stream_key(12345)# 总是返回 bid_stream_shard:xxx优点Stream 数量固定1024 个无论商品多少都不会膨胀同一个商品的出价永远进入同一个 Stream顺序得到保证消费者数量可控1024 个或更少可以多个 Stream 共用一个消费者方案 2动态消费者池classConsumerPool:管理固定数量的消费者每个消费者负责多个 Streamdef__init__(self,shard_count1024,consumer_per_shard1):self.shard_countshard_count self.consumers[]defstart(self):# 启动 1024 个消费者协程每个负责一个分片forshard_idinrange(self.shard_count):stream_keyfbid_stream_shard:{shard_id}consumerShardConsumer(shard_id,stream_key)self.consumers.append(consumer)asyncio.create_task(consumer.run())方案 3批量读取进一步优化如果某些分片流量很低可以让一个消费者负责多个分片使用 XREADGROUP 同时读取多个 Stream# 一个消费者同时监听多个 StreamRedis 支持多 Stream 读取streams{bid_stream_shard:0:,bid_stream_shard:1:,bid_stream_shard:2:,# ... 最多 1024 个}resultawaitredis.xreadgroup(group_namebid_group,consumer_nameconsumer_0,streamsstreams,count10,block1000)这样我们可以用少量消费者如 32 个处理全部 1024 个分片大幅降低资源消耗。

相关新闻

5分钟终极指南:免费解锁Adobe全家桶的完整解决方案

5分钟终极指南:免费解锁Adobe全家桶的完整解决方案

5分钟终极指南:免费解锁Adobe全家桶的完整解决方案 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP 你是否曾为Adobe Creative Cloud的高昂订阅费而苦恼&…

2026/10/12 13:23:31 阅读更多 →
TMS320C6748 eHRPWM与GPIO配置实战:从架构到代码实现

TMS320C6748 eHRPWM与GPIO配置实战:从架构到代码实现

1. 项目概述与核心价值在工业自动化、数字电源和电机驱动的嵌入式开发领域,精准的脉冲宽度调制(PWM)控制是系统的核心。很多开发者初次接触德州仪器(TI)的TMS320C6748这类高性能DSP时,面对其功能强大的增强…

2026/10/9 23:17:44 阅读更多 →
我不是大富翁【牛客tracker  每日一题】

我不是大富翁【牛客tracker 每日一题】

我不是大富翁 时间限制:2秒 空间限制:128M 网页链接 牛客tracker 牛客tracker & 每日一题,完成每日打卡,即可获得牛币。获得相应数量的牛币,能在【牛币兑换中心】,换取相应奖品!助力每日…

2026/9/24 15:47:15 阅读更多 →

最新新闻

C语言经典题61-70精讲:数组、递归、指针、结构体与链表实战

C语言经典题61-70精讲:数组、递归、指针、结构体与链表实战

手上一套一百道的C语言经典题库,不少朋友刷到61到70这个区间就卡住了。前面六十题基本属于“语法热身”,分支、循环、数组的读写占了一大半,到了61到70这批题,局面忽然变了:递归、指针、结构体、链表开始轮番上阵。这个…

2026/10/12 13:23:36 阅读更多 →
国产AI算力地基开源:驱动、运行时与编译器全栈解析

国产AI算力地基开源:驱动、运行时与编译器全栈解析

1. 这不是模型发布,而是一次算力基建的“静默升级”最近刷到“致敬,DeepSeek 最新开源的不是模型,是国产算力的地基”这个标题,不少朋友第一反应是:又一个大模型开源了?点进去才发现——没有模型权重&#…

2026/10/12 13:23:36 阅读更多 →
特征值与特征向量详解:从概念、计算到PCA与振动分析

特征值与特征向量详解:从概念、计算到PCA与振动分析

1. 特征值与特征向量到底是什么1.1 从一个向量被“拉伸”说起想象你手里有一个向量,比如二维平面里的箭头(2,1)。现在你用某个矩阵去乘它,相当于对这个箭头做了一次线性变换。大部分情况下,箭头会既改变方向…

2026/10/12 13:23:36 阅读更多 →
字节跳动2020秘密通信题:字符级纠错编码建模实战

字节跳动2020秘密通信题:字符级纠错编码建模实战

1. 项目概述:一道被反复提起的“秘密通信”题,到底在考什么?“字节跳动 2020年笔试题-秘密通信”——这个标题在技术社区、求职论坛和算法练习平台上出现频率极高,但奇怪的是,几乎找不到官方题面原文,也没有…

2026/10/12 13:23:36 阅读更多 →
C语言编译预处理深度解析:从宏替换到工程化实践

C语言编译预处理深度解析:从宏替换到工程化实践

1. 被低估的编译预处理:从"宏替换"到工程化利器的认知升级很多人学C语言的时候,对编译预处理这一块的态度基本就是"考试考几分算几分",#define会写、#include会用、#ifdef知道是条件编译,然后就翻篇了。我带过…

2026/10/12 13:23:36 阅读更多 →
小程序自定义导航栏全攻略:从高度计算到组件封装

小程序自定义导航栏全攻略:从高度计算到组件封装

自定义导航栏,是小程序开发里绕不过去的一道坎。把navigationStyle设置为custom只需要一行配置,但背后要处理状态栏高度、胶囊按钮测量、标题居中、真机适配这一堆事情。这篇笔记是实际项目里反复调试后整理的,横向对比了几种实现思路&#x…

2026/10/12 13:22:35 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →