Redis 8.8发布,一定要更新

Redis 8.8 可以简单理解为:少写拼装逻辑,多用 Redis 原生命令直接完成新结构建模、限流、消息回收、增量通知和聚合查询。 下面这些"更新前 / 更新后"对比,尽量只保留最小命令差异,但 key 和 id 仍保留业务意图,方便一眼看懂。先看 8.8 里最值得先理解的新结构:Array。

新增原生 Array:固定下标和稀疏槽位更直接

Redis 8.8 新增了原生 Array。GitHub 发布说明里只写了 New data structure: Array,更具体的语义要结合 8.8 命令总表和命令文档来看:目前已经有 ARSETARGETARLENARCOUNTARINFO 等一组命令;官方也明确标注了这还是 preview 能力,而且元素类型是字符串。

更新前

redis 复制代码
JSON.SET seatmap:bus:1001 $ '["A1","A2","A3"]'
JSON.SET seatmap:bus:1001 $[1] '"A2-sold"'
JSON.GET seatmap:bus:1001 $[1]

更新后

redis 复制代码
ARSET seatmap:bus:1001 0 A1 A2 A3
ARSET seatmap:bus:1001 5 A6
ARGET seatmap:bus:1001 1
ARLEN seatmap:bus:1001
ARCOUNT seatmap:bus:1001

变化

  • 更新前:要么借 JSON 数组,要么自己拆成多个 key。
  • 更新后:固定下标读写可以直接走原生 Array 命令。
  • ARLEN 看的是数组总长度,也就是最大下标 + 1;ARCOUNT 看的是实际有值的槽位数量,所以稀疏下标也能直接表示。
  • 如果你存的是字符串槽位表、位置表、轻量索引,Array 会比 JSON 更直;如果你要存对象结构,JSON 仍然更合适。

这一组命令说明了什么

  • ARSET:从某个下标开始连续写入一个或多个字符串。
  • ARGET:按下标读取,key 或下标不存在时返回 nil。
  • ARLEN:返回总长度,不是已占用数量。
  • ARCOUNT:返回非空元素数量。
  • ARINFO:查看 Array 元数据,必要时还能加 FULL 看更细的 slice 统计。

现实场景

  • 客运和影院选座:一排座位本来就是固定位置,哪个座位已售、锁座、空闲,按下标更新最符合业务直觉。
  • 仓库货位和快递柜:哪个格子空着、哪个格子被占用,位置本身就是主语,不必再把每个格子拆成独立 key。
  • 停车位或充电桩状态:一整排车位里哪些可用、哪些维修中、哪些已预约,用稀疏槽位表示会很自然。
  • 固定编号映射:像编号到短码、编号到状态这种简单映射,直接按位置读写会比包一层 JSON 更省。

限流更简单:INCREX

Redis 8.8 新增 INCREX,把"自增 + 上下界 + 过期时间"合并进一个原子命令。

更新前

redis 复制代码
INCR login:fail:user:1001
EXPIRE login:fail:user:1001 60

如果还要限制最大值,通常还得继续补判断。

更新后

redis 复制代码
INCREX login:fail:user:1001 BYINT 1 UBOUND 5 EX 60 SATURATE

变化

  • 更新前:至少两条命令,想加上限还得继续拼。
  • 更新后:一个命令原子完成,达到上限后也不会继续涨。

现实场景

  • 防爆破登录:同一账号连续输错密码达到上限后,先临时锁住,减少撞库和试错。
  • 防短信轰炸:同一手机号在短时间内只能申请有限次验证码,避免被恶意反复触发。
  • 防活动刷取:领券、报名、抽奖这类动作可以限制"1 分钟内最多点几次",保护活动成本。

Stream 失败处理更主动:XNACK

Redis 8.8 新增 XNACK。它不是简单的"标记失败",而是把 pending 消息显式释放成 unowned 状态,随后可以立即被重新 claim。

更新前

假设订单 1001 对应的消息 1-0 已经进入 pending:

redis 复制代码
XCLAIM order_stream order_group retry-worker 60000 1-0

失败后通常只能等消息 idle 足够久,再由其他消费者接管。

更新后

redis 复制代码
XNACK order_stream order_group FAIL IDS 1 1-0 RETRYCOUNT 3
XCLAIM order_stream order_group retry-worker 0 1-0

变化

  • 更新前:恢复依赖超时窗口,重试链路慢半拍。
  • 更新后:worker 能主动释放消息,其他消费者可以立刻 claim。
  • 仓库测试还验证了 XNACK 释放后的消息可以被 XCLAIMXAUTOCLAIMXREADGROUP CLAIM 立即重新领取。

模式区别

  • SILENT:把 delivery count 减 1,最低降到 0。
  • FAIL:保留当前 delivery count。
  • FATAL:把 delivery count 置为最大值,适合不可恢复失败标记。

现实场景

  • 订单自动发货失败:仓储或物流接口出错时,消息可以立刻交给其他消费者继续处理,用户少等一轮超时。
  • 售后退款和发票开具:异步任务失败后马上重派,避免因为 idle 超时把处理时间拖长。
  • 大促高峰兜底:某台消费者机器异常时,挂起的消息能尽快转给正常机器,减少订单积压。

Hash 变更通知更细:字段级通知

Redis 8.8 新增 subkey notifications。对 Hash 来说,以前只能知道"这个 key 变了",现在可以直接知道"哪些 field 变了"。

更新前

redis 复制代码
CONFIG SET notify-keyspace-events KEA
PSUBSCRIBE __key*__:*
HSET user:1001 score 98

订阅端看到的通常是这种粒度:

text 复制代码
"pmessage","__key*__:*","__keyspace@0__:user:1001","hset"
"pmessage","__key*__:*","__keyevent@0__:hset","user:1001"

更新后

redis 复制代码
CONFIG SET notify-keyspace-events ST
PSUBSCRIBE __subkey*
HSET user:1001 score 98

订阅端会直接拿到变更字段:

text 复制代码
"pmessage","__subkey*","__subkeyspace@0__:user:1001","hset|5:score"
"pmessage","__subkey*","__subkeyevent@0__:hset","9:user:1001|5:score"

变化

  • 更新前:下游只能知道 user:1001 变了,往往还得整条重拉。
  • 更新后:消息里直接带 field 名,更适合增量同步。
  • 当前官方文档里已落地的是 Hash 字段级通知。

现实场景

  • 会员资料同步:昵称、等级、积分等字段更新后,只把变动部分同步给下游系统,减少重复刷新。
  • 商品状态联动:库存、价格、上下架状态变化后,前台页面、导购屏、活动页只更新对应字段。
  • 审核和风控联动:某个用户标签或审核状态改变时,相关系统能第一时间收到具体变更项。

混合检索调优更直接:FT.HYBRID

FT.HYBRID 本身不是 8.8 新命令,但 8.8 给 KNN 子句加了 SHARD_K_RATIO,能直接控制每个 shard 拉取的候选量。

更新前

redis 复制代码
FT.HYBRID product_idx
  SEARCH "@category:{book}"
  VSIM @embedding $query_vec
  KNN 2 K 10
  PARAMS 2 query_vec <vec>

更新后

redis 复制代码
FT.HYBRID product_idx
  SEARCH "@category:{book}"
  VSIM @embedding $query_vec
  KNN 4 K 10 SHARD_K_RATIO 2
  PARAMS 2 query_vec <vec>

变化

  • 更新前:Hybrid 查询能跑,但分片候选规模不好控。
  • 更新后:可以直接限制每个 shard 拉多少候选,集群下更容易平衡召回和开销。
  • 8.8 还补了 FT.PROFILE 对 Hybrid 查询的分析支持,排查慢点更顺手。

现实场景

  • 电商搜商品:用户搜"黑色跑鞋"时,既要限制类目、价格、库存,又希望找出意思相近的商品。
  • 内容平台找相似内容:先限定频道、作者权限或发布时间,再做相似文章、相似视频检索,更贴近真实分发需求。
  • 企业知识库问答:只在当前部门、当前项目资料里找"语义接近"的答案,避免把无关资料混进结果。

时序查询更省请求:单命令多聚合

Redis 8.8 支持 Time Series 范围查询一次返回多个聚合结果。

更新前

redis 复制代码
TS.RANGE metrics:cpu:api-1 - + AGGREGATION min 60000
TS.RANGE metrics:cpu:api-1 - + AGGREGATION avg 60000
TS.RANGE metrics:cpu:api-1 - + AGGREGATION max 60000

更新后

redis 复制代码
TS.RANGE metrics:cpu:api-1 - + AGGREGATION min,avg,max 60000

变化

  • 更新前:一个面板想拿 min / avg / max,要发三次。
  • 更新后:一个命令直接拿齐,接口更紧凑。

现实场景

  • 连锁门店经营看板:同一小时内既看最低客流、平均客流,也看最高峰值,不用拆三次查询。
  • 配送和出行波动分析:看某段时间的订单量、等待时长、取消率时,往往要同时看平均值和峰值。
  • 设备运营监控:像充电桩、自助柜、门店设备的运行数据,做日报或告警时常常要一起看多种聚合结果。

JSON 数值数组终于能指定浮点类型:JSON.SET FPHA

Redis 8.8 给 JSON.SET 增加了 FPHA,可以显式指定齐次浮点数组的内部类型。

更新前

redis 复制代码
JSON.SET user:1001:embedding $ '[1.0,2.0,3.0]'

以前只能把数字数组写进去,但没法明确告诉 Redis 这是一组应该按哪种浮点类型存储的数值数组。

更新后

redis 复制代码
JSON.SET user:1001:embedding $ '[1.0,2.0,3.0]' FPHA FP16

变化

  • 更新前:向量、embedding、数值数组的精度 / 内存策略不够显式。
  • 更新后:可以直接在写入时指定 FP16BF16FP32FP64

现实场景

  • 个性化推荐:给每个用户保存兴趣向量时,可以按成本和精度选择更合适的浮点类型。
  • 相似商品和相似内容:给商品、文章、视频存语义向量后,后续做"猜你喜欢""相关内容"会更方便。
  • AI 问答和搜索:知识库里的文档向量可以明确类型,便于控制内存占用和检索成本。

有序集合合并可以直接按"出现次数"算:ZUNION / ZINTER + COUNT

Redis 8.8 给 ZUNIONZINTER 及其 STORE 版本加了 AGGREGATE COUNT

更新前

redis 复制代码
ZSCORE recall:hot sku:1001
ZSCORE recall:cf sku:1001

如果你想统计某个商品出现在几个召回池里,通常要在客户端自己数。

更新后

redis 复制代码
ZUNION 2 recall:hot recall:cf AGGREGATE COUNT WITHSCORES

如果只想保留交集成员,也可以直接:

redis 复制代码
ZINTER 2 recall:hot recall:cf AGGREGATE COUNT WITHSCORES

变化

  • 更新前:原始分数和"出现次数"是两回事,频次统计得自己补。
  • 更新后:ZUNION 可以直接把成员命中的集合次数当 score 用,ZINTER 也支持同样的 COUNT 聚合。

现实场景

  • 商品推荐排位:同一商品如果同时出现在热销、活动、猜你喜欢几个池子里,就更值得排前面。
  • 内容分发判断热度:一篇内容同时命中热门榜、编辑推荐、活动专区,通常说明值得加曝光。
  • 用户分群营销:同一用户同时落在多个高意向人群里时,可以把触达优先级提上去。

高频命令性能更好,但调用方式不用改

Redis 8.8 还优化了 MGETMSETHGETALL、HyperLogLog,以及 Search / Vector 路径。这个部分的重点不是"新写法",而是"同样写法,升级直接吃收益"。

更新前

redis 复制代码
MGET session:1 session:2 session:3 session:4
HGETALL product:1001
PFCOUNT uv:2025-10-15

更新后

redis 复制代码
MGET session:1 session:2 session:3 session:4
HGETALL product:1001
PFCOUNT uv:2025-10-15

变化

  • 更新前:想提速,经常得改数据模型或拆请求。
  • 更新后:这类高频路径可以先直接吃一波版本红利。

现实场景

  • 首页和详情页:一次要读很多会话、配置、商品信息时,升级后可能直接缩短响应时间。
  • 大促和高峰时段:不改现有调用方式,也能先吃到批量读取和 Hash 读取的性能收益。
  • 统计和检索业务:流量越大,底层优化带来的收益越容易在 UV 统计、搜索、向量查询里体现。

Redis 8.8 的实用价值,不在于"功能很多",而在于把过去靠多命令、Lua、超时回收、全量刷新实现的东西,变成了可以直接复制的原生命令。 如果你现在正好在做限流、Stream 重试、实时同步、RAG 检索、监控聚合,这一版会比看起来更值得升。

相关推荐
GetcharZp10 小时前
玩转 Linux 机器视觉:手把手带你搞定 Ubuntu 下海康工业相机 C++ SDK
后端
橙子家11 小时前
浏览器缓存之【基础键值存储】:Local storage 和 Session storage
前端
星星在线13 小时前
MusicFree:一个「All in One」的个人音乐服务器,让听歌回归简单
前端·后端
IT_陈寒14 小时前
Redis的SETNX并发问题让我加了三天班
前端·人工智能·后端
demo007x14 小时前
Docling 文档转换以及技术架构分析
前端·后端·程序员
京东云开发者15 小时前
京东市民服务又“上新”!这次是黑龙江“龙易办”
前端
保持当下15 小时前
分享一些程序员很棘手但是却又简单的工具
程序员·免费·js·工具
袋鱼不重16 小时前
我的神奇同事,AI 用多了居然写了个 Open In Codex
前端·后端·ai编程
用户83562907805116 小时前
使用 Python 操作 Word 内容控件
后端·python
像我这样帅的人丶你还16 小时前
啥? 前端也要会干Java?🛵🛵🛵
后端