北京时间2025年4月15日——Redis 官方正式发布 8.8 版本,这是自 8.0 大版本更新后的又一次重要迭代。新版本重点引入了原生数组数据结构、内置速率限制器(Rate Limiter)以及多项底层性能改进,旨在进一步降低内存开销、提升高并发场景下的吞吐能力,并为开发者提供更开箱即用的流量控制手段。

全新数组数据结构:内存更省,访问更快

长久以来,Redis 主要依靠 LIST 和 SET 来存储有序或无序的集合数据,但 LIST 底层采用双向链表或压缩列表,在随机访问与内存效率上存在固有短板。8.8 版本新增的 ARRAY 类型是一个定长、紧凑的线性结构,内部以连续内存块存储元素,支持 O(1) 时间复杂度的随机读写。

  • 内存压缩:相比同数据量的 LIST(尤其是元素为整数或短字符串时),ARRAY 可节省 30%~50% 的内存。其底层采用类似于“快速数组”(quickarray)的编码方式,当数组长度小于阈值时直接使用紧凑数组,超过阈值则自动分片,避免单一大块内存分配。
  • 原子操作扩展:新增 ARRAY.SETARRAY.GETARRAY.INSERT(仅限在头部或尾部插入,以维持定长特征)等命令,并支持批量读取/写入,减少网络往返。
  • 适用场景:时间序列数据的固定窗口缓存、排行榜定长列表、传感器值记录等需要频繁随机访问且元素数量可控的场景。

官方基准测试显示,在 1 万个元素的随机访问中,ARRAY 的延迟比 LIST 降低约 40%,且碎片率几乎为零。

内置速率限制器:告别外部组件

高并发下,限流是保护缓存和下游服务的核心防线。过去开发者要么依赖外部库(如令牌桶算法),要么借助 Redis 模块或 Lua 脚本自行实现。Redis 8.8 将此能力原生内置,推出 RATE.LIMIT 命令,支持滑动窗口与令牌桶两种算法。

  • 滑动窗口模式RATE.LIMIT key 100/60s 表示在 60 秒窗口内最多允许 100 次访问。窗口按秒级切片,过期检查由内核线程自动完成,不会阻塞其他命令。
  • 令牌桶模式RATE.LIMIT key rate=10 burst=20 则按每秒 10 个令牌填充,桶容量 20。超出时返回 DENIED 及等待时间建议(毫秒),便于客户端实现优雅降级。
  • 分布式一致性:该命令在集群模式下支持跨分片协调,通过轻量级租约机制保证多个实例限流逻辑的一致性,避免计数漂移。

此外,限速器还提供了 RATE.LIMIT.INFO 查看当前状态,以及 RATE.LIMIT.RESET 重置计数器。官方表示,该特性可替代大部分第三方限流中间件,降低系统复杂度。

性能的三重引擎:IO、内存与执行路径

Redis 8.8 在性能优化上下了“笨功夫”——没有引入惊世骇俗的新架构,而是对已有瓶颈逐点击破。

  1. IO 多线程重构:将主线程的写请求处理进一步剥离到独立 I/O 线程池(默认 4 线程),与 8.0 版本只对读操作多线程不同,8.8 允许写入操作在串行化保证下并行处理。官方实测,在 64 核服务器上,混合读写吞吐量提升 2.3 倍。
  2. 内存分配器升级:默认内存分配器从 Jemalloc 5.3 升级至 6.0,对碎片整理和 NUMA 感知做了深度优化。大键(如哈希表、大字符串)的分配延迟降低约 15%,特别是在高负载下的 OOM 风险显著降低。
  3. 指令预执行:对于常见的复合操作(如 GET 后接 EXPIRE),引擎会尝试将两条命令合并为一条内部指令执行,避免两次上下文切换。这在秒杀、验证码等场景中可将延迟压缩至微秒级。

升级建议与生态兼容性

Redis 8.8 完全向后兼容 8.x 版本,老版本数据可直接加载。但需注意,新 ARRAY 类型无法在集群模式下跨 slot 使用(与 LIST 相同)。限速器功能默认启用,但建议对高流量业务先进行压测,避免低版本客户端命令解析异常。

目前,Redis 8.8 的二进制包已可在官方仓库下载,Docker 镜像也已同步推送。对于已经使用 Redis 8.0 以上的用户,可通过滚动升级的方式平滑迁移;对于仍在使用 6.x 或 7.x 的用户,官方建议先在测试环境验证后再进行大版本跃迁。

结语:Redis 8.8 没有追逐“大而全”,而是用最务实的数组数据结构、内置限速器和系统级性能优化,回应了开发者多年来的痛点。当缓存不仅是缓存,而更像是一个微服务中间件时,这种“小而锐”的迭代或许正是生态所需要的。