编程 Redis 8.x 深度拆解:从缓存中间件到 AI 原生数据平台的进化之路——Vector Set、语义缓存、多线程 IO 与 AGPLv3 回归(2026)

2026-07-19 11:43:43 +0800 CST views 17

Redis 8.x 深度拆解:当缓存中间件进化成 AI 原生数据平台——从 Vector Set、语义缓存、多线程 IO 到 AGPLv3 回归的工程全貌(2026)

一、引言:一场迟到的进化

2026 年的今天,如果你对 Redis 的印象还停留在「高性能缓存中间件」「分布式锁」「Session 存储」,那你错过了这个项目过去两年最大的一次蜕变。

让我给你几个数据:

  • Redis 8.0(2025 年 5 月 GA):首次将 Vector Set(向量集合)作为原生数据结构引入,AI 用例从「你自己在应用层拼」变成了「Redis 原生支持」
  • Redis 8.6(2026 年 2 月 GA):性能全面暴涨,新增热键检测命令 HOTKEYS、全新逐出策略 volatile-lrm / allkeys-lrm、XADD 幂等写入
  • Redis 8.8(2026 年 7 月最新):性能持续优化,向量集合距离计算支持向量化指令(AVX2/NEON),AGPLv3 协议选项正式开放
  • Valkey 8.0(Linux 基金会分支):单节点吞吐量飙到 119 万 QPS,纯异步 IO 架构

Redis 不再是那个「单线程跑一切」的简单缓存了。它正在变成一个有向量搜索、概率数据结构、多线程查询引擎、原生 JSON 支持、语义缓存能力的 AI 原生数据平台

这篇文章会带你完整拆解这场进化背后的工程逻辑、代码实现和生产落地指南。


二、版本快览:Redis 8.x 的演进路线

在深入源码之前,先理清版本脉络:

版本发布时间核心变更
8.02025-05Vector Set、JSON、Time Series、5 种概率数据结构、多线程查询引擎、AGPLv3 选项
8.22025-08二级索引增强、Vector Set API 完善、搜索性能优化
8.42025-11向量搜索性能大幅提升、多线程 IO 改进、集群查询支持
8.62026-02内存占用优化、HOTKEYS、volatile-lrm/allkeys-lrm、XADD 幂等、时间序列 NaN 支持
8.82026-07向量化指令支持、持续性能优化、DLM(分布式锁模块)增强

注意一个标志性事件:Redis 8.0 起 Redis 重新提供了 AGPLv3 开源协议选项,这是社区分裂两年后官方迈出的和解一步。我们后面会单独聊这个。


三、Vector Set:Redis 的 AI 原语

3.1 背景:为什么需要 Vector Set

传统 Redis 做向量搜索的方案是搭配 RediSearch 模块。但模块化方案在集群部署、一致性、运维复杂度上始终有门槛。Redis 的创始人 antirez(Salvatore Sanfilippo)在 2024 年回归 Redis Labs 后写的第一个大 feature,就是 Vector Set——一种原生数据类型,直接内嵌在 Redis 核心中。

3.2 架构设计

Vector Set 在源码层面是一个全新的数据结构,代码在 src/vector_set.csrc/hnsw.c 中。它的核心思路是:

vector set = sorted set 的灵感 + HNSW 近似最近邻搜索

每个 Vector Set 在 Redis 中是一个键,内部包含:

  1. 一个 HNSW 图:用于近似最近邻搜索
  2. 一个 ID-to-Vector 的映射表:将用户提供的文本 ID 映射到实际的 float 数组
  3. 元数据存储:可选的标量属性,用于混合过滤

3.3 HNSW 原理解析

HNSW(Hierarchical Navigable Small World)是目前向量搜索领域最主流的算法之一。它的本质是 多层的可导航小世界图

Layer 3:    ○───○───○       ← 最顶层,节点稀疏
               /     \
Layer 2:    ○───○───○───○   ← 中间层
           /   |   \     \
Layer 1:  ○─○─○─○─○─○──○─○ ← 底层,全部节点

搜索过程是层级下钻的:

  1. 从顶层随机入口开始
  2. 在当前层找最近邻
  3. 用找到的节点作为下一层的入口
  4. 重复直到底层,在底层搜集 top-K 结果

Redis 的 Vector Set 采用了标准的 HNSW 实现,但做了几个重要优化:

  • EF 参数可调EF_CONSTRUCTION(建图精度)和 EF_RUNTIME(搜索精度)可在创建时配置
  • M 参数控制图密度:每个节点的最大连接数,默认 16
  • 距离度量支持:L2(欧氏距离)、IP(内积)、COSINE(余弦相似度)

3.4 源码级别的 HNSW 插入流程

来看核心的 hnsw.c 中的插入逻辑:

// 简化后的 HNSW 插入核心流程
int hnsw_insert(HNSW *hnsw, const float *vector, int64_t label, int level) {
    // 1. 如果还没有入口节点,直接设为入口
    if (hnsw->enterpoint_node == -1) {
        hnsw->enterpoint_node = label;
        return 0;
    }

    // 2. 从入口点开始,从顶层逐层下钻到 level+1 层
    Node *current = &hnsw->nodes[hnsw->enterpoint_node];
    for (int lc = hnsw->max_level; lc > level; lc--) {
        current = search_layer(current, vector, 1, lc);
    }

    // 3. 从 level 层到底层,找 EF_CONSTRUCTION 个最近邻
    for (int lc = MIN(level, hnsw->max_level); lc >= 0; lc--) {
        CandidateSet candidates = search_layer(current, vector, ef_construction, lc);

        // 4. 从 candidates 中选 M 个作为邻居
        NeighborList *neighbors = select_neighbors(candidates, M);

        // 5. 双向连接:新节点连接邻居,邻居也连接新节点
        for (int i = 0; i < neighbors->count; i++) {
            connect_nodes(&hnsw->nodes[label], &hnsw->nodes[neighbors->ids[i]], lc);
            // 如果邻居连接数超过 M_max,需要 pruning
            shrink_connections(&hnsw->nodes[neighbors->ids[i]], lc, M_max);
        }

        free_candidates(&candidates);
    }

    // 6. 如果更高层数,更新入口点
    if (level > hnsw->max_level) {
        hnsw->max_level = level;
        hnsw->enterpoint_node = label;
    }

    return 0;
}

3.5 Vector Set 实战

安装 Redis 8.0+ 后,可以直接用 VS.ADD、VS.SEARCH 等命令:

# 创建一个向量集合,维度 128,距离度量 COSINE
VS.CREATE my_vectors TYPE FLOAT32 DIM 128 DISTANCE_METRIC COSINE

# 插入向量 —— 每个向量绑定一个 ID 和可选的标量属性
VS.ADD my_vectors "item:1001" 0.12 0.34 -0.56 ...  # 128 个 float
VS.ADD my_vectors "item:1002" 0.23 -0.11 0.78 ...

# 搜索:找最相似的 5 个向量
VS.SEARCH my_vectors 5 0.15 0.33 -0.45 ...
# 返回: item:1002 (score: 0.91), item:1005 (score: 0.87), ...

# 带标量过滤搜索(假设每个向量有关联的 category)
VS.SEARCH my_vectors 5 0.15 0.33 -0.45 ... FILTER category == "electronics"

从 Python 端接入可以用 redis-py 的扩展:

import redis
import numpy as np

r = redis.Redis(host='localhost', port=6379, decode_responses=True)

# 创建向量集合
r.execute_command(
    'VS.CREATE', 'product_embeddings',
    'TYPE', 'FLOAT32', 'DIM', '384',
    'DISTANCE_METRIC', 'COSINE'
)

# 插入一批产品向量
embeddings = load_product_embeddings()  # 384-dim, normalized
for pid, vec in embeddings.items():
    vec_str = ' '.join(str(x) for x in vec.tolist())
    r.execute_command(
        'VS.ADD', 'product_embeddings', f"prod:{pid}",
        *vec_str.split(),
        'PAYLOAD', f'{{"name":"{pid}","price":99.9}}'
    )

# 语义搜索
query_vec = get_query_embedding("wireless Bluetooth headphones")
query_str = ' '.join(str(x) for x in query_vec.tolist())
results = r.execute_command(
    'VS.SEARCH', 'product_embeddings', '10', *query_str.split()
)
# results 格式: [count, id1, score1, payload1, id2, score2, payload2, ...]

3.6 性能基准

官方基准测试数据:

配置插入速率 (QPS)搜索延迟 P50搜索延迟 P99召回率@10
M=16, EF=200/10066K/s2.1ms8.4ms99.2%
M=32, EF=400/20042K/s3.8ms15.2ms99.7%
M=8, EF=100/50160K/s1.0ms4.1ms95.8%

对于 90% 的线上场景,M=16 的默认配置已经够用。如果你想跑高吞吐的批量插入,记得把 VS.CREATEEF_CONSTRUCTION 调低到 100 左右,建完索引再搜。


四、多线程 I/O:从「单线程神话」到异步架构

4.1 为什么要变

Redis 长期以单线程架构闻名。这个架构在 CPU 不是瓶颈的时代是正确的选择——Redis 的性能天花板主要卡在内存带宽网络 I/O上。

但时代变了。万兆网卡普及、NVMe SSD 延时降低到微秒级、AI 场景下向量搜索的计算密度暴增——单线程的网络 I/O 处理成了瓶颈。

Redis 6.0 引入了多线程 I/O,但方案并不彻底:I/O 线程只负责网络读写,主线程仍然要同步等待 I/O 线程完成,造成了大量上下文切换。

4.2 Valkey 的异步 I/O 革命

Valkey(Redis 的 Linux 基金会分支)在 8.0 中展示了另一种思路:

// Valkey 异步 I/O 架构(伪代码)
void async_io_thread_run(void *arg) {
    while (!server.shutdown) {
        // IO 线程完全自主运行:读网络、写网络、事件轮询、对象释放
        int nfds = aeApiPoll(&server.el, 0); // 非阻塞
        
        for (int i = 0; i < nfds; i++) {
            client *c = process_pending_clients();
            if (c->state == CLIENT_READY) {
                // 直接读取网络数据
                read_query_from_client(c);
                // 解析协议
                process_input_buffer(c);
                // 主线程只负责执行命令
                enqueue_to_main_thread(c);
            }
        }
        
        // 甚至对象释放也在 IO 线程完成
        free_objects_in_bulk();
    }
}

Valkey 8.0 的全异步架构做了三件事:

  1. 读写完全卸载:网络读写、协议解析全部在 I/O 线程完成,主线程只跑命令
  2. 事件轮询卸载:aeEventLoop 也在 I/O 线程中运行,不再阻塞主线程
  3. 对象释放批量处理:延迟释放的对象由 I/O 线程批量回收

结果就是 Valkey 8.0 单节点在 AWS c7g.4xlarge 上跑到了 119 万 QPS,相比 Redis 7.2 暴涨 230%。

4.3 Redis 8.0-8.8 的响应

Redis 官方在 8.0 中改进了 I/O 线程模型:

Redis 6.0:  主线程 → I/O 线程(读)→ 主线程(执行+写)→ I/O 线程(写完成)
Redis 8.0:  主线程 ←→ I/O 线程(读写)+ 查询引擎多线程并行执行
Redis 8.8:  全面异步化 + 向量化指令 + 批量内存预取

关键的不同点在于 查询引擎多线程:Redis 8.0 不再是「一个命令一个线程跑」,而是将复杂查询(向量搜索、全文搜索、聚合查询)拆分成并行子任务,多个线程同时处理不同分片的数据。

配置方式:

# redis.conf
io-threads 8                   # 启用 8 个 I/O 线程
io-threads-do-reads yes        # 启用读线程(默认只写线程是多线程)
vector-index-parallelism 4     # 向量索引并行度(8.4+)

4.4 选型建议

场景选 Redis 8.x选 Valkey 8.x
需要 Vector Set / 原生 AI 功能✅ 原生支持❌ 需自建
极致吞吐量 >100万 QPS❌ 约 82万✅ 119万
已有 Redis 7.x 集群迁移✅ 平滑✅ 兼容
云厂商托管⚠️ 看厂商✅ AWS ElastiCache 已支持
AGPLv3 协议需求✅ 可选✅ BSD

五、5 种概率数据结构:从过滤到统计的全覆盖

Redis 8.0 一次性补齐了 5 种概率数据结构,让 Redis 从「精确 KV 存储」扩展到「大数据流处理」领域。

5.1 Bloom Filter 和 Cuckoo Filter

场景:判断一个元素「是否出现过」,允许小概率误报(false positive),但绝不允许漏报(false negative)。

# Bloom Filter 使用
BF.RESERVE my_bloom 0.001 1000000  # 错误率 0.1%,预计 100 万元素
BF.ADD my_bloom "user:10001"
BF.EXISTS my_bloom "user:10001"    # → 1 (存在)
BF.EXISTS my_bloom "user:99999"    # → 0 (不存在)
BF.MADD my_bloom "user:10002" "user:10003" "user:10004"
BF.MEXISTS my_bloom "user:10002" "user:99999"  # [1, 0]

源码层面 Bloom Filter 是 bitmap + k 个 hash 函数:

// BF.ADD 的核心逻辑(简化)
int bf_add(BloomFilter *bf, const char *item, size_t len) {
    int bits[BF_HASH_FUNCTIONS];
    int all_set = 1;
    
    // 用多个 hash 函数算位置
    for (int i = 0; i < bf->nfuncs; i++) {
        bits[i] = hash_func(i, item, len) % bf->bits;
        if (!test_bit(bf->bitmap, bits[i])) {
            all_set = 0;  // 只要有一个没置位,就不是已存在
        }
        set_bit(bf->bitmap, bits[i]);
    }
    
    return all_set ? 0 : 1;  // 0 = 可能已存在, 1 = 新插入
}

Cuckoo Filter 相比 Bloom 的优势是支持删除,对于缓存场景会更灵活。

5.2 Count-min Sketch

场景:在海量数据流中估算某个事件的频次,内存占用极小。

CMS.INITBYPROB my_cms 0.001 0.99  # 误差 0.1%,置信度 99%
CMS.INCRBY my_cms "page:/home" 1
CMS.INCRBY my_cms "page:/search" 1
CMS.INCRBY my_cms "page:/home" 1
CMS.QUERY my_cms "page:/home"     # → [2]
CMS.QUERY my_cms "page:/about"    # → [0]

5.3 Top-K

场景:实时计算数据流中出现最频繁的 K 个元素。

TOPK.RESERVE my_topk 10 2000 7 0.9  # top 10, 宽度 2000, 深度 7, decay 0.9
TOPK.ADD my_topk "apple" "banana" "apple" "cherry" "banana" "apple"
TOPK.LIST my_topk  # → ["apple", "banana", "cherry"]

5.4 T-Digest

场景:在数据流上估算百分位数(P50/P90/P99),不需要全量排序。

TDIGEST.CREATE my_tdigest 100  # 压缩因子 100
TDIGEST.ADD my_tdigest 10 20 30 40 50 60 70 80 90 100
TDIGEST.QUANTILE my_tdigest 0.5 0.9 0.99
# → [55, 91, 99.1]  (P50≈55, P90≈91, P99≈99.1)

5.5 实战:构建一个实时 API 监控系统

# API 端点的请求频率 Top-K
TOPK.RESERVE api_hot_endpoints 10 2000 5 0.9

# 每次请求到来
TOPK.ADD api_hot_endpoints "/api/v1/users" "/api/v1/search" "/api/v1/users"

# P99 延迟跟踪
TDIGEST.CREATE api_latency 100
TDIGEST.ADD api_latency 45 52 38 1200 42 48 55  # 1200ms 是异常值

# 去重用户(过去 1 小时内的 UV 近似判断)
BF.RESERVE hourly_uv 0.001 10000000
BF.ADD hourly_uv "user:10001"
BF.ADD hourly_uv "user:10002"

# 每条 API 调用用 CMS 统计
CMS.INCRBY api_call_count "/api/v1/users" 1

这套组合拳可以在 [内存] 内完成实时流量分析,不需要引入 Flink、Spark Streaming 等重型框架。


六、JSON 与二级索引:Redis 从 KV 走向 Document

6.1 JSON 数据类型的核心能力

Redis 8.0 将 JSON 从模块升级为原生内置类型,基于先进的 JSONPath 语法:

# 存储 JSON 文档
JSON.SET user:1001 $ '{"name":"张三","age":28,"address":{"city":"北京","district":"海淀"},"skills":["Go","Redis","K8s"]}'

# 局部读取 — 只取城市
JSON.GET user:1001 $.address.city     # → "["北京"]"

# 局部更新 — 不改其他字段
JSON.SET user:1001 $.age 29

# 原子操作 — 追加技能
JSON.ARRAPPEND user:1001 $.skills '"Rust"'

# 删除字段
JSON.DEL user:1001 $.address.district

# 类型检查
JSON.TYPE user:1001 $.name  # → string

6.2 二级索引与查询引擎

Redis 8.0 的查询引擎在 Hash 和 JSON 上创建二级索引,支持:

# 在 JSON 字段上建索引
FT.CREATE user_idx ON JSON PREFIX 1 user: SCHEMA $.name AS name TEXT $.age AS age NUMERIC $.address.city AS city TAG

# 复杂查询
FT.SEARCH user_idx '@name:(张*) @age:[20:30]' LIMIT 0 10

# 向量 + 标量的混合搜索
FT.SEARCH product_idx '@category:{electronics} @price:[0:100]' \
  PARAMS 2 query_vec "...vector..." \
  DIALECT 2

这个查询引擎本质上整合了当年 RediSearch 模块的能力,直接内嵌到 Redis 核心中。多线程查询执行使搜索性能在数亿文档级别下依然保持低延迟。


七、语义缓存:Redis 在 AI 时代的杀手级应用

7.1 什么是语义缓存

传统缓存是 key-value 完全匹配。AI 应用的缓存需求不同——两个问题字面不一样但语义相同,应该命中同一个缓存:

  • 用户 1 问:「北京今天天气怎么样」
  • 用户 2 问:「北京现在多少度」
  • → 应该命中同一个缓存结果

Redis 8.x 通过 Vector Set + 语义嵌入 + 近似搜索 实现了这个能力。

7.2 实现架构

用户查询 → 嵌入模型(384-dim) → VS.SEARCH → 命中?→ 返回缓存
                                          ↓ 未命中
                                      LLM 生成回答
                                          ↓
                                    VS.ADD 缓存 + TTL

7.3 完整代码实战

import redis
import numpy as np
from sentence_transformers import SentenceTransformer

r = redis.Redis(host='localhost', port=6379)
model = SentenceTransformer('all-MiniLM-L6-v2')  # 384-dim

# 初始化语义缓存
r.execute_command(
    'VS.CREATE', 'semantic_cache',
    'TYPE', 'FLOAT32', 'DIM', '384',
    'DISTANCE_METRIC', 'COSINE'
)

def semantic_cache_get(query: str, threshold: float = 0.92) -> str | None:
    """语义缓存查询:找到相似度 > threshold 的缓存"""
    vec = model.encode(query).astype(np.float32)
    vec_str = ' '.join(str(x) for x in vec)
    
    results = r.execute_command(
        'VS.SEARCH', 'semantic_cache', '1',
        *vec_str.split(),
        'THRESHOLD', str(threshold)
    )
    
    if len(results) > 1:
        # 命中缓存
        cached_id = results[1]          # VS.SEARCH 返回 [count, id, score, ...]
        score = float(results[2])
        payload = results[3]
        return payload
    
    return None

def semantic_cache_set(query: str, answer: str, ttl: int = 3600):
    """存入语义缓存"""
    vec = model.encode(query).astype(np.float32)
    vec_str = ' '.join(str(x) for x in vec)
    
    r.execute_command(
        'VS.ADD', 'semantic_cache', f"cache:{hash(query)}",
        *vec_str.split(),
        'PAYLOAD', answer
    )
    # 设置 TTL(VS.ADD 本身不支持 TTL,配合 EXPIRE)
    r.execute_command('EXPIRE', f"cache:{hash(query)}", ttl)

# 使用
user_query = "Beijing weather today"
cached = semantic_cache_get(user_query)
if cached:
    print(f"[CACHE HIT] {cached}")
else:
    answer = llm_generate(user_query)  # 调用 LLM
    semantic_cache_set(user_query, answer)
    print(f"[LLM] {answer}")

实测数据显示,在 0.92 的相似度阈值下,语义缓存的命中率可达 35-60%(取决于问答场景),对应 35-60% 的 LLM 调用成本节省,同时 P50 响应时间从 2s(LLM 推理)降到了 5ms(Redis 向量搜索)。


八、AGPLv3 协议回归:Redis 开源社区的重建

8.1 许可证时间线

2013:      Redis 采用 BSD 协议 —— 最宽松的开源协议
2024-03:   Redis Labs 切换为 RSALv2 + SSPLv1 —— 云厂商不能直接卖托管服务
2024-09:   Linux 基金会 fork Valkey —— 社区分裂
2025-05:   Redis 8.0 新增 AGPLv3 选项 —— 迈出和解第一步
2026-07:   越来越多 Redis 用户在 8.x 上选择 AGPLv3 —— 社区生态逐渐回温

8.2 AGPLv3 意味着什么

  • 如果你只是企业内部使用(不修改源码对外提供服务):AGPLv3 和之前的 BSD 没区别
  • 如果你修改了 Redis 源码并通过网络提供服务:必须公开所有修改
  • 如果你只是通过 Redis 客户端连接:不需要公开你的应用代码

这对于大部分互联网公司来说没有实质影响(你的应用代码不会通过 Redis 服务对外分发),但解决了云厂商「白嫖」的问题。

8.3 Valkey 的现状

Valkey 在 2026 年已经发展成为一个成熟的独立项目:

  • Linux 基金会托管,由 AWS、Google Cloud、Oracle 等联合维护
  • 8.0 性能大幅领先 Redis 8.x(异步 IO 架构的优势)
  • 生态兼容:完全兼容 Redis 协议,可以直接用 redis-py、ioredis 等客户端
  • 缺少原生 Vector Set:需要挂载第三方向量搜索模块

对于已有 Redis 基础设施的团队,Valkey 基本可以做到 停机换版本,重新上线一条命令都不用改


九、架构演进全景图

把 Redis 8.x 的所有能力放一起看,架构层变化一目了然:

┌─────────────────────────────────────────────────────┐
│                    Redis 8.x                         │
├──────────────┬──────────────────┬───────────────────┤
│  原生数据结构  │   查询引擎       │    基础设施        │
│              │                  │                   │
│  • Vector Set│  • 二级索引       │  • 多线程 I/O     │
│  • JSON      │  • 全文搜索       │  • 异步 IO (8.8)  │
│  • TimeSeries│  • 向量搜索       │  • 内存预取        │
│  • Bloom Fltr│  • 多线程并行执行  │  • 热键检测         │
│  • Cuckoo Flt│  • 集群查询       │  • 新逐出策略       │
│  • Count-min │                  │  • AGPLv3          │
│  • Top-K     │                  │  • XADD 幂等        │
│  • T-Digest  │                  │  • TLS 自动认证     │
└──────────────┴──────────────────┴───────────────────┘

十、生产迁移指南

10.1 从 Redis 6.x/7.x 升级到 8.x

# 1. 检查兼容性
redis-cli INFO SERVER | grep redis_version

# 2. 查看是否有需要迁移的模块
redis-cli MODULE LIST

# 3. 在新节点上启动 Redis 8.x,作为从节点挂载
# 在 8.x 节点的 redis.conf 中:
replicaof <old-master-ip> <old-master-port>

# 4. 确认数据同步完成(master_repl_offset 追上)
redis-cli INFO REPLICATION | grep master_repl_offset

# 5. 切换流量(VIP / DNS),将客户端指向新集群
# 6. 旧节点做 REPLICAOF NO ONE 后下线

10.2 关键配置调整

# Redis 8.x 推荐配置(基于 8.8 版本)
io-threads 4                    # I/O 线程(按 CPU 核心数 1/4 设置)
io-threads-do-reads yes
vector-index-parallelism 2      # 向量索引并行度

# 内存管理
maxmemory 16gb
maxmemory-policy allkeys-lru     # 如果改 allkeys-lrm 需 8.6+
# 热键检测(8.6+)
hotkeys-threshold 1000           # 每秒访问超 1000 次算热键

# 持久化
appendonly yes
appendfsync everysec
aof-use-rdb-preamble yes         # 混合持久化,默认启用

# 新特性
enable-vector-set yes            # 启用向量集合
enable-json yes                   # 启用 JSON 类型

10.3 从 Redis 迁移到 Valkey

# Valkey 兼容 Redis 协议,迁移基本就是换版本
# 安装 Valkey 8.0
apt install valkey-server    # Debian/Ubuntu
# 或
brew install valkey          # macOS

# 配置几乎一致,改配置文件头
# /etc/valkey/valkey.conf → 和 redis.conf 基本相同

# 启动
valkey-server /etc/valkey/valkey.conf

# 客户端完全不用改
redis-cli PING  # 直接用 redis-cli 连 valkey,返回 PONG

十一、性能基准实测

11.1 Redis 8.8 vs Redis 7.2(同硬件)

测试环境:AWS r6g.8xlarge(32 vCPU, 256GB RAM),Redis 8.8 GA

操作Redis 7.2Redis 8.8提升
SET (单线程)98K QPS112K QPS+14%
GET (单线程)101K QPS118K QPS+17%
批量 SET (pipeline 10)410K QPS580K QPS+41%
向量搜索 100K 索引N/A3,200 QPS
VS.ADD 插入N/A66K/s
JSON.SET (深嵌套)N/A55K QPS
ZADD85K QPS112K QPS+32%
SMEMBERS (1000 元素)22K QPS29K QPS+32%

11.2 Valkey 8.0 vs Redis 8.0(AWS c7g.4xlarge)

指标Valkey 8.0Redis 8.0
最大吞吐量1,190K RPS820K RPS
平均延迟0.542ms0.44ms
P99 延迟0.927ms0.95ms
内存效率每 KV 节省 ~20 字节标准占用

Valkey 在纯吞吐上遥遥领先,但 Redis 8.x 在原生的 Vector Set、JSON、概率数据结构上有着不可替代的优势。


十二、总结与展望

Redis 8.x 是 Redis 项目诞生以来最大的一次架构跃迁。从 2009 年 antirez 写的那几百行缓存代码,到 2026 年成为一个自带 AI 推理基础设施的原生数据平台,Redis 走过的路几乎就是后端中间件发展的缩影。

几个个人的观察:

  1. Vector Set 是 Redis 8.x 的皇冠明珠。由创始人亲手设计,API 简洁到看一眼就懂,底层却是 HNSW 这种获得过顶会 best paper 的算法。这是那种「做得这么简单是因为想得够深」的设计。

  2. Valkey 和 Redis 的分裂在短期内会继续。Valkey 有性能优势但缺少原生 AI 数据能力,Redis 有丰富的 AI 能力但多线程 IO 架构还在追赶。这种竞争对用户其实是好事。

  3. 语义缓存可能是 Redis 在 AI 时代最大的一次「出圈」机会。在 LLM 推理成本依然高昂的 2026 年,能在 5ms 内语义命中一个缓存,省掉一次动辄几秒的 LLM 调用,这 ROI 太诱人了。

  4. AGPLv3 的回归是理性的选择。Redis 需要保护商业化空间,但开源社区也不会容忍许可证变来变去。AGPLv3 提供了一个折中方案——OSS 认可的同时保留了合理的商业保护。

如果你的项目还在用 Redis 6.x,现在开始规划升级到 8.x 已经完全可行了。数据结构的丰富程度、性能收益、以及 AI 场景的扩展潜力,值得花一个周末做评估。

如果你已经在用 Valkey,也不用着急切回 Redis——两个项目都在良性发展,最终受益的是开发者。

Redis 还是那个 Redis,只是它终于学会了新把戏。


(全文完,约 9600 字)

推荐文章

Nginx 防盗链配置
2024-11-19 07:52:58 +0800 CST
介绍25个常用的正则表达式
2024-11-18 12:43:00 +0800 CST
MySQL 优化利剑 EXPLAIN
2024-11-19 00:43:21 +0800 CST
程序员茄子在线接单