Redis 8.8 新特性实操笔记:原生数组、INCREX 限流、XNACK 流处理
Redis 8.8 发布与落地 —— 新结构 / 限流 / 流处理 / 上线踩坑先说结论省得滑到底如果你现在正用Lua 脚本做限流、用List 模拟滑动窗口、或对流消息的失败处理有实时性要求这版能直接少写代码。其余是性能和小增强按需取。生产环境请用8.8.1——8.8.0 有多个 RESTORE 相关的远程代码执行漏洞已在 8.8.1 修掉。背景从 2009 到 8.8Redis 从 2009 年发布起就用五大基础类型String、List、Hash、Set、Sorted Set。这么多年一直有一类需求没被原生覆盖——按数字下标快速存取一串字符串。想要这个能力以前只能三选一用 List 模拟、把数据塞进 JSON、或者自己写 Lua。三种都用着别扭。2025 年的 8.0 是个节点开源协议改回AGPLv3JSON、时序、向量这些模块能力并进核心。之后从 8.0 到 8.8 迭代明显加快——8.2 简化 Stream 多消费组、8.4 让消费者更易读新增与空闲消息、8.6 加幂等生产。8.8 干的事比较实在把几个最常用的模式做成了原生命令不用再靠 Lua 和客户端逻辑拼。下面按新结构、限流、流消息、周边增强、性能与落地几块讲命令都给可直接在 redis-cli 里敲的版本文末附一份上线前 checklist。目录原生数组 ArrayINCREX 限流XNACK 流消息一批小增强Hash / TS / JSON / ZSet性能与落地PART 01 原生数组 Array终于能按下标存了8.8 新增了 Array 类型由 antirez 提交。它是一个按数字下标存取的字符串集合动态扩容、稀疏下标友好并且支持服务端聚合SUMMINMAX 直接在 Redis 内算不用把数据拉回客户端。常用命令可直接抄# 从下标 0 连续写入ARSET seats:A10free1sold2lockARGET seats:A11# 读单个下标 → soldARLEN seats:A1# 总长度最大下标1ARCOUNT seats:A1# 实际有值的槽位数稀疏友好ARINFO seats:A1 FULL# 看元数据 / slice 统计滑动窗口ARRING 比 RPUSHLTRIM 快一倍维护「最近 N 条」这类窗口经典写法是RPUSH 追加 LTRIM 截断。8.8 提供了ARRING命令专门把数组当定长环缓冲用官方在同机基准下吞吐比 RPUSHLTRIM 高约 2 倍且和环大小无关。读窗口用ARLASTITEMS。# 行情滑窗新报价写入尾部ARRING prices:6005191820.501821.101822.30# 取最近 300 条展示ARLASTITEMS prices:600519300# 服务端聚合不拉数据回客户端AROPSUM prices:600519# 求和ARGREP prices:600519182*# 类 grep 检索CASE 01选座 / 货位 / 充电桩位置本身就是下标一排座位、一排充电桩、一排快递柜哪个位置空闲占用维修按下标读写最贴合业务直觉不必把每个格子拆成独立 key。稀疏数组直接用 ARCOUNT 就能知道实际占用多少不用遍历。⚠️什么时候别用Array 不是 ListHashZSet 的替代品。需要 pushpop 或中间插入用 List需要字段名访问用 Hash。另外官方实测 Array 比 List 多占用约 18% 内存——初版大数组上线前先用MEMORY USAGE看一眼。PART 02 INCREX限流不用再写 Lua限流是 Redis 最高频的用途之一。过去要实现「每分钟 100 次」这种窗口计数基本人手一段Lua 脚本或者用 MULTIEXEC 包 INCREXPIRE。8.8 把这事做成了一条原子命令 INCREX递增、上下界、过期一次搞定少一次网络往返。真实语法注意不是三个位置参数INCREX key[BYFLOAT f|BYINT i][LBOUND lo][UBOUND hi][OVERFLOW WRAP|SAT|FAIL][EX s|PX ms|...|PERSIST][ENX]# 每用户每分钟≤100次上限10060s窗口INCREX api:user:42:req BYINT1UBOUND100EX60# → 返回 [当前计数, 实际增量]如 [3,1]放行 / [100,0]拒绝# 防爆破错误上限5到顶截断不报错INCREX login:fail:u1001 BYINT1UBOUND5EX60SATURATE几个关键点返回值同时给出新计数和实际增量调用方据此判断放行还是拒绝UBOUND是上限超了直接拒绝SATURATE则「部分接受」计数器截到上限、返回实际接受的增量适合防爆破锁账号ENX只在 key 首次创建时设过期避免每次请求都把窗口 TTL 重置。迁移对照原来怎么写8.8 之前最常见的固定窗口限流用的是这段 LuaINCR边界判断EXPIRE 包在一起保证原子-- ratelimit.lua经典写法localcurredis.call(incr,KEYS[1])ifcur1thenredis.call(expire,KEYS[1],ARGV[1])endifcurtonumber(ARGV[2])thenreturn0endreturn1现在上面这一段可以直接删掉换成一条 INCREX。少维护一份脚本、少一次往返边界语义还更全SATURATE、ENX 都是原来要自己写的。CASE 02中后台 API 限流 防爆破登录 防短信轰炸三类都是「计数限时可能要上限」的窗口场景API 每用户每分钟 100 次同一账号连续输错密码 5 次临时锁 60 秒同一手机号 60 秒内最多发 1 条验证码。用 INCREX 一把梭返回的实际增量就是「这次放行没」的判断依据。⚠️上手提示INCREX 的语法在 RC1→GA 之间改过修复 #15237。如果你在 RC 阶段就写过相关逻辑上线前务必按 8.8.1 文档重测一遍别直接搬 RC 的参数顺序。PART 03 XNACK流消息能主动「甩锅」了Stream 多消费者协作时消费者 XREADGROUP 读到消息、还没 XACK 就崩溃或处理失败消息会卡在PEL待处理列表里。以前只能等别的消费者靠 XAUTOCLAIMXCLAIM 超时回收——消息要闲置一阵才能被接手对实时系统不友好。8.8 加了XNACK处理失败的消费者可以显式把这条消息释放回 PEL立刻可被其他消费者认领重投不用干等回收周期。它和 XACK 的区别很直接XACK 是「成功了删掉」XNACK 是「我没处理好放回给别的人」。三种模式对应三种失败SILENT失败和消息本身无关服务重启、瞬时错误递减送达计数消息排回 PEL 头部重试。FAIL本消费者没资源处理CPU内存计数不变优先分给其他消费者。FATAL毒消息格式错、恶意送达计数设为 LLONG_MAX等人工介入不再自动重投。XREADGROUP GROUP order-g c1 COUNT1STREAMS orders# 处理失败主动释放这条消息XNACK orders order-g FAIL IDS1123-0# 其他消费者立刻能认领仍需主动来 claimXAUTOCLAIM orders order-g c200-0CASE 03订单流水线消费者崩溃同伴秒级接手消费者 C1 处理订单时宕机C2 不必等默认回收周期可能数分钟而是 C1 在退出前主动XNACK FAILC2 马上XAUTOCLAIM认领。体验差别就是「卡单」和「秒级恢复」。注意XNACK 之后消息仍在 PEL需要别的消费者来 claim 才会真正重投别指望它自动飞走。PART 04 一批小增强单独不大合起来省往返Hash 字段级通知7.4 的 Hash 字段过期HEXPIRE很实用但原来只能收到 key 级事件。8.8 加了subkey 通知——能订阅字段级的过期删除事件里带 key、字段名和类型。缓存失效、审计类场景不用再轮询或全 key 监听。时序多聚合单命令蜡烛图这类要同时算 MINMAXFIRSTLAST 的图表以前要发多条命令。8.8 让TS.RANGE 等一次返回多种聚合TS.RANGE sensor:temp - AGGREGATION avg60000\AGGREGATION max60000JSON 浮点精度可控JSON.SET新增FPHA参数可显式指定BF16FP16FP32FP64。存向量嵌入或传感器读数时按源数据精度在内存和精度之间权衡不用一刀切。ZSet 新增 COUNT 聚合器ZUNIONZINTER等集合运算支持COUNT 聚合每个元素的 score 反映它出现在几个输入集合里。标签重合度、去重统计这类需求多一个原生玩法ZUNION2zset1 zset2 AGGREGATE COUNT WITHSCORESFT.HYBRID KNN 增强向量混合检索FT.HYBRID支持 KNN 子句里每分片更少候选并新增FT.PROFILE HYBRID做性能剖析。大规模向量检索时这是个「用召回换延迟」的旋钮——先用FT.PROFILE量一遍再调生产。PART 05 性能数字 上线前清单8.8 在多处端到端吞吐做了优化。下面是官方给的一组数字——但先泼盆冷水这是 Redis 官方在 Intel Sapphire Rapids m7i.metal-24xl 单实例上的基准你的机器、数据分布、客户端链路不一样别直接当承诺。真要信自己跑一遍redis-benchmark-tset,get,mset-n1000000-q数据类型操作官方基准提升幅度Strings · MGETIO 线程最高 68%Streams · XREADGROUPCOUNT 100最高 83%Sorted Set · ZADDZINCRBY最高 74%扫描类 SCANHSCANSSCANZSCAN最高 40%Hash · HGETALL1K 字段最高 25%Bitmap 操作x86最高 28%HyperLogLog · PFCOUNTx86最高 18%持久化与全量复制最高快 60%底层还有几处通用优化x86 版默认开 LTO 链接时优化、部分代码迁到 Rust 降低 FFI 开销、ARM64 专项优化以及 batched prefetch 批量预取。另外别忘了 Array 比 List 多约 18% 内存——不是纯赚量级评估时算进去。上线前 checklist照着过一遍版本生产直接上 8.8.1。8.8.0 有多个 RESTORE 相关 RCE含 RedisBloomTimeSeries 模块公网暴露或处理不可信数据的实例尤其要升。升级顺序8.x 之间 RDBAOF 向后兼容可滚动重启。但 ArrayINCREXXNACK 是新类型和命令老版本从节点认不出——按「先升从、再切主、最后升老主」的标准滚动流程走。客户端 SDKgo-redis 9.20.0 才带 AR*INCREXXNACK 封装老版本用 EVAL裸命令字符串发也行但没有类型安全。INCREX 语法变了RC1→GA 改过参数顺序RC 阶段写的脚本上线前重测。大数组先看内存初版 Array 上线前用MEMORY USAGE看一眼稀疏数组靠ARCOUNT算实际占用。别硬上Array 不等于 ListHashXNACK 之后消息仍在 PEL记得配XAUTOCLAIM兜底别只靠它。写在最后要不要升判断标准很朴实你现在是不是正被三件事烦——用 Lua 做限流、用 List 维护滑动窗口、流消息只能等超时回收是的话8.8 能直接减代码量升。不是的话这版对你就是「性能小幅提升 几个用不上的命令」可以等下次大版本再动。版本上别纠结8.8.0 于 2026 年 5 月 GA8.8.12026 年 7 月修了一批安全漏洞生产直接用 8.8.1即可。命令细节以官方文档为准本文命令已在 8.8.1 上核对过语法。⚠️安全提醒8.8.0 修复了多起 RESTORE 相关的远程代码执行漏洞CVE-2026-25243 等含 RedisBloomTimeSeries 模块。涉及公网暴露或处理不可信数据的实例请优先升级到 8.8.1。如果这篇对你有参考价值欢迎关注[ 笑笑笑技术圈 ]后续会带来更多后端结构/Redis 与中间件的落地笔记。觉得有用就点个赞、在看、转发让更多被 Lua 限流折磨过的同学看到。