编程 Valkey 9.1 深度解析:Redis 许可证风暴后的开源王者——从 10 亿 RPS 集群到 2.1M 单机吞吐的完整实战指南

2026-07-06 18:14:50 +0800 CST views 11

Valkey 9.1 深度解析:Redis 许可证风暴后的开源王者——从 10 亿 RPS 集群到 2.1M 单机吞吐的完整实战指南

一、前言:一场许可证引发的开源分裂

2024 年 3 月,Redis Ltd. 将 Redis 从 BSD 许可证改为双重许可证(SSPL + RSALv2),这一决定在整个技术社区引发了轩然大波。SSPL(Server Side Public License)要求任何以 Redis 作为服务提供的云厂商必须开源其整个服务栈,而 RSALv2(Redis Source Available License v2)则限制了直接竞争性产品的使用。这两个许可证都被 OSI(Open Source Initiative)认定为非开源许可证。

这意味着 Redis 不再是真正的开源软件。

AWS、Google Cloud、Oracle 等巨头迅速做出反应。在 Linux Foundation 的支持下,Redis 7.2.4 的最后一个 BSD 版本被 fork,一个名为 Valkey 的项目就此诞生。名字来源于 Redis 的核心数据结构——跳表(Skip List)中"Val"(Value)和"Key"的组合。

短短两年时间,Valkey 从一个"应急 fork"成长为一个拥有独立生态、性能超越原版 Redis 的高性能键值存储。截至 2026 年 7 月,Valkey 在 GitHub 上已经积累了超过 18K Stars,核心贡献者超过 200 人,被 AWS ElastiCache、Google Cloud Memorystore、阿里云、字节跳动等云厂商原生支持。

本文将从架构设计、核心特性、性能基准、生产实战四个维度,深度解析 Valkey 9.1 这个当前最值得关注的开源键值存储。


二、Valkey 与 Redis:分道扬镳后的技术路线差异

2.1 许可证对比

维度Redis(Redis Ltd.)Valkey(Linux Foundation)
许可证SSPL + RSALv2(非开源)BSD 3-Clause(真正开源)
治理模式单一公司控制社区治理,Linux Foundation 托管
云厂商可用性受限,需商业授权完全自由使用
模块生态商业模块(RedisJSON、RedisSearch 等需授权)全部开源(Valkey Search、Valkey JSON 等)
长期可持续性取决于 Redis Ltd. 商业决策社区驱动,永不开源变质

2.2 功能路线分叉

从 Redis 7.2.4 fork 后,Valkey 走上了独立的技术路线:

  • Valkey 8.0(2024 年 9 月):首个大版本,引入多线程 I/O、内存效率优化、Bloom Filter 模块
  • Valkey 8.1(2025 年 4 月):全新哈希表设计,5000 万 Sorted Set 插入测试通过
  • Valkey 9.0(2025 年 10 月):原子槽迁移、Hash 字段过期、集群模式编号数据库、10 亿 RPS
  • Valkey 9.1(2026 年 5 月):数据库级 ACL、Lua 模块化、2.1M 单机 RPS、新命令 HGETDEL/MSETEX/CLUSTERSCAN

与此同时,Redis 在 8.x 系列中引入了 Redis Data Integration(RDI)、JSON 深度操作等商业向功能,两者的技术路线已经明显分叉。


三、Valkey 9.0:奠定集群王者地位的关键版本

在深入 9.1 之前,我们必须先理解 9.0 带来的革命性变化,因为这些特性构成了 Valkey 集群能力的基石。

3.1 原子槽迁移(Atomic Slot Migration)

这是 Valkey 9.0 最重要的架构改进。

旧方案的问题:

在 Valkey 9.0 之前,集群数据迁移是逐键(key-by-key)进行的。这带来了三个严重问题:

  1. 中间态不一致:迁移过程中,一个键可能在源节点和目标节点之间"悬而未决",客户端需要多次重试
  2. 大键阻塞:如果一个 Sorted Set 有数百万成员,整个键需要一次性传输到目标节点的输入缓冲区,可能导致迁移卡死
  3. 多键操作失败:MGET/MSET 等操作涉及的键如果分布在不同迁移阶段的节点上,操作会失败

Valkey 9.0 的解决方案:

旧方案(逐键迁移):
  Key A: 源节点 → 目标节点(传输)→ 源节点删除 Key A
  Key B: 源节点 → 目标节点(传输)→ 源节点删除 Key B
  ...每个键独立迁移,中间态不一致

新方案(原子槽迁移):
  Slot 7638: 源节点保留所有键 → 通过 AOF 格式逐项传输 → 整个槽原子切换
  源节点在整个槽迁移完成前保留所有数据,客户端无感知

原子槽迁移使用 AOF(Append Only File)格式传输数据,这意味着它可以逐项发送集合中的元素,而不是一次性发送整个大键。迁移完成后,整个槽的所有权原子性地从源节点切换到目标节点,避免了中间态问题。

3.2 Hash 字段过期(Hash Field Expiration)

这是一个被社区呼吁了近十年的功能。在此之前,Redis/Valkey 的过期机制只能作用于整个键,无法对 Hash 中的单个字段设置 TTL。

# Valkey 9.0 之前:只能整个键过期
HSET user:1001 name "张三" temp_token "abc123"
EXPIRE user:1001 3600  # 整个键 1 小时后过期,name 和 temp_token 一起消失

# Valkey 9.0:支持字段级过期
HSET user:1001 name "张三" temp_token "abc123"
HPEXPIRE user:1001 60000 FIELDS 1 temp_token  # 只有 temp_token 60 秒后过期
# name 永久保留,temp_token 自动消失

新增的命令族包括:HEXPIREHEXPIREATHPEXPIREHPEXPIREATHTTLHPTTLHGETEXHSETEXHPERSISTHEXPIRETIMEHPEXPIRETIME

这个特性在以下场景中极为有用:

  • 会话管理:一个 Hash 存储用户会话的多个字段,部分字段(如临时 token)需要独立过期
  • 限流计数器:不同维度的计数器有不同的过期时间
  • 缓存层级:热数据保留更久,冷数据快速过期

3.3 集群模式编号数据库

Redis 从诞生之初就支持编号数据库(SELECT 0-15),但在集群模式下,这个功能被限制为只能使用 db 0。Valkey 9.0 打破了这个限制,允许在集群模式下使用多个编号数据库。

# 集群模式下使用多数据库
SELECT 0
SET app:config:theme "dark"

SELECT 1
SET session:user:1001 "active"

# 两个数据库的键独立存在于同一个集群中
# ACL 也可以按数据库进行精细控制

这为多租户场景提供了天然的隔离能力:不同的数据库可以分配给不同的业务线或租户,无需在键名前缀上做文章。

3.4 十亿 RPS:2000 节点集群基准测试

Valkey 9.0 团队在 AWS 上进行了一个令人印象深刻的基准测试:

  • 集群规模:2000 个节点(1000 个主节点 + 1000 个副本)
  • 硬件:AWS r7g.2xlarge(8 核 64GB ARM),每个节点 6 个 I/O 线程
  • 压测客户端:750 台 c7g.16xlarge 实例
  • 数据大小:512 字节
  • 结果10 亿+ RPS(SET 操作)

更关键的是,在模拟 50% 主节点故障的场景下,集群能够在有界时间内自动恢复,无需人工干预。这得益于 Valkey 8.1 引入的基于字典序的分片排名机制,以及 9.0 中对重连风暴和故障报告处理的优化。


四、Valkey 9.1 核心特性深度解析

2026 年 5 月 19 日发布的 Valkey 9.1 是当前最新版本,由 80+ 位贡献者共同完成。下面逐一拆解。

4.1 安全增强

4.1.1 数据库级 ACL

Valkey 9.1 最重要的安全特性是数据库级访问控制。在此之前,ACL 只能控制用户可以执行哪些命令、访问哪些键,但这些权限适用于所有数据库。现在,管理员可以将用户权限限制到特定数据库。

# 创建一个只能访问 db 0 和 db 1 的用户
ACL SETUSER app-user on >secretpass +@all ~* db=0,1

# 该用户认证后:
SELECT 0    # OK
SET mykey "hello"  # OK

SELECT 2    # (error) NOPERM No permissions to access database

实际应用场景:

# 多租户 SaaS 幺台的 ACL 策略
# 租户 A 只能访问 db 0
ACL SETUSER tenant_a on >password_a +@all ~* db=0

# 租户 B 只能访问 db 1
ACL SETUSER tenant_b on >password_b +@all ~* db=1

# 只读用户只能读 db 0
ACL SETUSER reader on >readpass +@read ~* db=0

# 管理员可以访问所有数据库
ACL SETUSER admin on >adminpass +@all ~* db=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15

4.1.2 Lua 脚本引擎模块化

Valkey 9.1 将 Lua 脚本引擎从核心服务器中解耦,作为一个独立模块存在。这有两个重大意义:

  1. 减少攻击面:如果你的业务不需要 Lua 脚本,可以直接卸载 libvalkeylua.so 模块,消除一个潜在的攻击向量
  2. 可扩展性:未来可以引入其他脚本引擎(如 JavaScript、Python),而不需要修改核心代码
# 查看当前加载的脚本引擎
INFO scripting_engines

# 输出示例:
# scripting_engines:name=lua,module=libvalkeylua.so,version=1.0

# 如果不需要 Lua,可以在配置中禁用
# valkey.conf:
# loadmodule ""  # 不加载任何模块

4.1.3 TLS 改进

  • 证书过期可见性:通过 INFO 命令查看 TLS 证书的过期时间
  • 后台自动重载:TLS 证书可以在不重启服务器的情况下自动轮换
  • SAN URI 支持:支持使用证书的 Subject Alternate Name URI 进行 mTLS 认证
# 查看 TLS 证书信息
INFO tls
# tls_version:1.3
# tls_cert_not_after:Jul  6 10:09:00 2027 GMT
# tls_cert_not_before:Jul  6 10:09:00 2026 GMT

# 配置自动证书重载
# valkey.conf:
# tls-cert-file /path/to/cert.pem
# tls-key-file /path/to/key.pem
# tls-ca-cert-file /path/to/ca.pem
# tls-reload-certs yes  # 后台自动重载

4.2 性能突破

4.2.1 全新 I/O 线程模型

Valkey 9.1 重新设计了 I/O 线程的通信模型,通过减少线程间的锁竞争和优化数据传递路径,实现了高达 17% 的吞吐量提升。

# 配置 I/O 线程数(推荐为 CPU 核心数 - 2,留 2 个给主线程和后台任务)
# valkey.conf:
io-threads 6
io-threads-do-reads yes  # 读操作也使用 I/O 线程

# 基准测试结果(512 字节 payload,pipeline 深度 10):
# Valkey 9.0: ~1.8M RPS
# Valkey 9.1: ~2.1M RPS(提升约 17%)

4.2.2 流操作优化

XRANGEXREVRANGE 命令的热路径被优化,性能提升高达 30%。这对于消息队列场景(使用 Stream 作为轻量级消息中间件)意义重大。

# 优化前后的对比示例
# 场景:从 Stream 中读取最近 1000 条消息

# 写入测试数据
XADD mystream * field1 "value1"
XADD mystream * field1 "value2"
# ... 写入 100K 条消息

# 读取性能测试
# Valkey 9.0: XRANGE 100K 条消息耗时约 12ms
# Valkey 9.1: XRANGE 100K 条消息耗时约 8.4ms(提升 30%)

4.2.3 字符串 GET 吞吐提升

通过提高字符串嵌入阈值(string embedding size threshold),小于一定长度的字符串可以直接嵌入到内部结构中,避免额外的内存分配。这使得字符串 GET 操作的吞吐量提升高达 30%。

4.2.4 硬件时钟默认启用

Valkey 9.1 默认启用硬件时钟(hardware clock),减少了 clock_gettime() 等系统调用的开销,GET 和 SET 操作整体性能提升约 3%。

# 查看当前时钟源
cat /sys/devices/system/clocksource/clocksource0/current_clocksource
# tsc  (或 arch_sys_counter on ARM)

# Valkey 9.1 默认使用硬件时钟,无需额外配置
# 如需回退到系统时钟:
# valkey.conf:
# use-hardware-clock no

4.3 内存效率优化

4.3.1 小字符串内存减少 20%

内部指针优化使得小于 128 字节的字符串内存占用减少高达 20%。考虑到大多数键值存储场景中,小字符串是最常见的数据类型,这个优化的实际影响非常大。

# 实际测试:存储 100 万个 64 字节的字符串键值对

# Valkey 9.0:
# used_memory_human:189.32M

# Valkey 9.1:
# used_memory_human:151.46M(减少约 20%)

4.3.2 Sorted Set 内存减少 10%

跳表(skiplist)优化使得 Sorted Set 的内存占用减少高达 10%。对于排行榜、延迟队列等大量使用 Sorted Set 的场景,这意味着显著的成本节省。

4.3.3 改进的 Rehashing 性能

当键空间增长触发哈希表扩容时,rehashing 操作的延迟影响被显著降低。同时,在批量删除操作(SREM、ZREM、HDEL)期间,Valkey 会暂停内部哈希表的调整大小操作,避免不必要的 rehashing,提升批量删除性能。

4.4 新命令详解

4.4.1 HGETDEL:原子获取并删除

# 场景:任务队列中的原子消费模式

# 任务入队
HSET job:42 status "pending" payload '{"action":"send_email"}' retries "3"
HSET job:43 status "pending" payload '{"action":"generate_report"}' retries "1"

# 原子获取并删除 status 和 payload 字段
HGETDEL job:42 FIELDS 2 status payload
# 1) "pending"
# 2) "{\"action\":\"send_email\"}"

# 检查剩余字段
HGETALL job:42
# 1) "retries"
# 2) "3"
# status 和 payload 已被原子删除,只剩下 retries

# 对比旧方案(需要事务保证原子性):
# MULTI
# HGET job:42 status
# HGET job:42 payload
# HDEL job:42 status payload
# EXEC
# HGETDEL 将三步操作合并为一个原子操作

4.4.2 MSETEX:批量设置带过期时间的键

# 场景:批量创建会话,统一过期时间

# 设置 3 个会话键,全部 1 小时后过期
MSETEX 3 session:abc "user:1" session:def "user:2" session:ghi "user:3" EX 3600

# 验证
TTL session:abc  # (integer) 3600
GET session:def  # "user:2"

# 使用 NX 选项:只设置不存在的键
MSETEX 2 session:abc "user:99" session:xyz "user:4" NX EX 3600
GET session:abc  # "user:1"(未被覆盖,因为已存在)
GET session:xyz  # "user:4"(新设置)

# 对比旧方案:
# SET session:abc "user:1" EX 3600
# SET session:def "user:2" EX 3600
# SET session:ghi "user:3" EX 3600
# MSETEX 将三次往返减少为一次

4.4.3 CLUSTERSCAN:集群级统一扫描

# 场景:遍历集群中的所有键

# 旧方案:需要客户端分别 SCAN 每个节点,然后合并去重
# 新方案:使用 CLUSTERSCAN 统一扫描

# 扫描所有键
CLUSTERSCAN 0
# 1) "3"        ← 游标
# 2) 1) "user:1001"
#    2) "user:1002"
#    3) "session:abc"

# 继续扫描
CLUSTERSCAN 3
# 1) "7"
# 2) 1) "cache:page1"
#    2) "order:5001"

# 按模式过滤
CLUSTERSCAN 0 MATCH "session:*"
# 1) "12"
# 2) 1) "session:abc"
#    2) "session:def"

# 按类型过滤
CLUSTERSCAN 0 TYPE hash
# 1) "5"
# 2) 1) "user:profile:1001"
#    2) "job:42"

# 扫描特定槽
CLUSTERSCAN 0 SLOT 7638
# 1) "0"
# 2) 1) "user:1001"

4.5 可观测性增强

4.5.1 主线程和 I/O 线程使用率指标

# 新的 INFO 指标
INFO cpu
# main_thread_usage:45.2    ← 主线程实际负载(非 CPU 利用率)
# io_thread_1_usage:32.1
# io_thread_2_usage:28.7
# io_thread_3_usage:31.5
# ...

# 为什么需要这个指标?
# 传统的 CPU 利用率在 Valkey 中具有误导性:
# - I/O 线程使用忙等待(busy loop),即使空闲也显示接近 100% CPU
# - 新的 usage 指标反映线程实际处理请求的时间比例
# - 45% 意味着主线程有 55% 的空闲容量

4.5.2 JSON 格式日志

# valkey.conf:
log-format json

# 输出示例(每行一个 JSON 对象):
{"pid":14500,"role":"primary","timestamp":"14 May 2026 14:13:02.921","level":"notice","message":"Valkey is starting"}
{"pid":14500,"role":"primary","timestamp":"14 May 2026 14:13:02.922","level":"notice","message":"Valkey version=9.1.0, bits=64, pid=14500, just started"}
{"pid":14500,"role":"primary","timestamp":"14 May 2026 14:13:02.926","level":"warning","message":"Failed to write PID file: Permission denied"}
{"pid":14500,"role":"primary","timestamp":"14 May 2026 14:13:02.930","level":"notice","message":"Ready to accept connections tcp"}

# 可以直接被 ELK、Datadog、Grafana Loki 等可观测性工具解析
# 无需自定义日志解析规则

五、Valkey 生态系统

5.1 Valkey Search:向量搜索 + 全文搜索

Valkey Search 是一个开源的 Valkey 模块,提供向量相似度搜索和全文搜索能力。与 Redis 的 RedisSearch(需要商业授权)不同,Valkey Search 完全开源。

# 加载 Valkey Search 模块
loadmodule valkey-search.so

# 创建一个带有向量字段和文本字段的索引
FT.CREATE idx:products
    ON HASH PREFIX 1 product:
    SCHEMA
        name TEXT SORTABLE
        description TEXT
        category TAG SORTABLE
        price NUMERIC SORTABLE
        embedding VECTOR FLAT 6
            TYPE FLOAT32
            DIM 1536
            DISTANCE_METRIC COSINE

# 插入数据
HSET product:1
    name "无线蓝牙耳机"
    description "高品质主动降噪耳机,支持空间音频"
    category "electronics"
    price 299.00
    embedding <1536维向量>

# 向量相似度搜索:找到与查询向量最相似的 10 个产品
FT.SEARCH idx:products "*=>[KNN 10 @embedding $query_vec]"
    PARAMS 2 query_vec <查询向量>
    SORTBY __embedding_score
    RETURN 2 name price

# 全文搜索 + 向量搜索混合查询
FT.SEARCH idx:products
    "@category:{electronics} @description:(降噪 蓝牙)
     =>[KNN 5 @embedding $query_vec]"
    PARAMS 2 query_vec <查询向量>

# 聚合查询:按类别统计平均价格
FT.AGGREGATE idx:products "*"
    GROUPBY 1 @category
    REDUCE AVG 1 price AS avg_price
    SORTBY 2 @avg_price DESC

5.2 Valkey Admin:可视化集群管理

Valkey Admin 是 Valkey 项目官方推出的开源可视化管理工具,支持桌面应用(macOS/Linux)和 Web 部署(Docker/Kubernetes)。

# Docker 部署
docker run -d \
    --name valkey-admin \
    -p 8080:8080 \
    -e VALKEY_HOST=your-valkey-host \
    -e VALKEY_PORT=6379 \
    valkey/valkey-admin:1.0

# 功能包括:
# - 集群拓扑可视化
# - 热键检测
# - 性能诊断
# - 交互式键管理
# - 实时监控仪表板

5.3 Valkey JSON

loadmodule valkey-json.so

# 设置 JSON 文档
JSON.SET user:1001 $ '{"name":"张三","age":30,"address":{"city":"北京","district":"朝阳"}}'

# 读取嵌套字段
JSON.GET user:1001 $.address.city
# ["北京"]

# 更新嵌套字段
JSON.SET user:1001 $.address.district '"海淀"'
JSON.GET user:1001 $
# [{"name":"张三","age":30,"address":{"city":"北京","district":"海淀"}}]

# 数组操作
JSON.SET config:1 $.tags '["redis","valkey","cache"]'
JSON.ARRAPPEND config:1 $.tags '"database"'
JSON.GET config:1 $.tags
# ["redis","valkey","cache","database"]

5.4 客户端库支持

Valkey 与 Redis 协议完全兼容,现有的 Redis 客户端库可以直接连接 Valkey。同时,Valkey 项目也推出了官方客户端:

语言官方客户端状态
Govalkey-glide-goGA
Javavalkey-glide-javaGA
Pythonvalkey-glide-pythonGA
Swiftvalkey-swiftGA (1.0)
Node.jsiovalkey社区维护
Rustvalkey-rs社区维护
# Python 示例:使用 valkey-glide
from glide import ValkeyClient, ValkeyClusterClient, NodeAddress

# 单机模式
client = ValkeyClient(NodeAddress("localhost", 6379))

# 基本操作
client.set("mykey", "myvalue")
value = client.get("mykey")
print(value)  # b"myvalue"

# Hash 字段过期(Valkey 9.1 新特性)
client.hset("user:1001", {"name": "张三", "token": "abc123"})
client.hpexpire("user:1001", 60000, fields=["token"])  # token 60秒后过期

# MSETEX(Valkey 9.1 新特性)
client.msetex(
    {"session:a": "user1", "session:b": "user2", "session:c": "user3"},
    expiry_sec=3600
)
// Go 示例:使用 valkey-glide-go
package main

import (
    "fmt"
    "github.com/valkey-io/valkey-glide/go/api"
)

func main() {
    client, err := api.NewGlideClient(api.NewGlideClientConfiguration().
        WithAddress(&api.NodeAddress{Host: "localhost", Port: 6379}))
    if err != nil {
        panic(err)
    }
    defer client.Close()

    // 基本操作
    client.Set("mykey", "myvalue")
    value, _ := client.Get("mykey")
    fmt.Println(value) // myvalue

    // HGETDEL(Valkey 9.1 新特性)
    client.HSet("job:42", map[string]string{
        "status":  "pending",
        "payload": `{"action":"send_email"}`,
        "retries": "3",
    })
    result, _ := client.HGetDel("job:42", []string{"status", "payload"})
    fmt.Println(result) // map[payload:{"action":"send_email"} status:pending]
}

六、从 Redis 迁移到 Valkey

6.1 迁移评估

迁移到 Valkey 几乎是零成本的,因为:

  1. 协议完全兼容:Valkey 使用与 Redis 相同的 RESP 协议
  2. 命令 100% 兼容:所有 Redis 开源版的命令在 Valkey 中都可用
  3. RDB/AOF 格式兼容:可以直接加载 Redis 的持久化文件
  4. 客户端库兼容:现有的 Redis 客户端库可以直接连接 Valkey

6.2 迁移步骤

单机模式迁移

# 1. 安装 Valkey
# Ubuntu/Debian
sudo apt update && sudo apt install valkey

# 或使用 Docker
docker pull valkey/valkey:9.1.0

# 2. 停止 Redis,复制数据文件
sudo systemctl stop redis
cp /var/lib/redis/dump.rdb /var/lib/valkey/dump.rdb
chown valkey:valkey /var/lib/valkey/dump.rdb

# 3. 修改配置(如果需要)
# /etc/valkey/valkey.conf 基本等同于 redis.conf
# 主要差异:
# - 配置文件名从 redis.conf 改为 valkey.conf
# - 二进制文件名从 redis-server 改为 valkey-server
# - 默认端口仍为 6379

# 4. 启动 Valkey
sudo systemctl start valkey

# 5. 验证
valkey-cli INFO server | grep version
# redis_version:7.2.4  ← 兼容性标识
# valkey_version:9.1.0 ← 真实版本

集群模式迁移

# 1. 逐节点替换
# 在每个节点上:
# a. 停止 Redis
sudo systemctl stop redis

# b. 安装 Valkey
sudo apt install valkey

# c. 复制集群配置
cp /var/lib/redis/nodes.conf /var/lib/valkey/nodes.conf
cp /var/lib/redis/dump.rdb /var/lib/valkey/dump.rdb
chown valkey:valkey /var/lib/valkey/*

# d. 复制并调整配置
cp /etc/redis/redis.conf /etc/valkey/valkey.conf
# 修改以下配置:
# cluster-config-file nodes.conf
# cluster-enabled yes

# e. 启动 Valkey
sudo systemctl start valkey

# 2. 逐个节点替换,确保集群始终保持 quorum
# 建议顺序:先替换副本,再替换主节点
# 每替换一个节点后,等待集群稳定再继续

# 3. 验证集群状态
valkey-cli CLUSTER INFO
# cluster_state:ok
# cluster_slots_assigned:16384
# cluster_slots_ok:16384

6.3 迁移后的优化

迁移完成后,可以利用 Valkey 的新特性进行优化:

# 1. 启用原子槽迁移(集群模式)
# valkey.conf:
cluster-migration-barrier 1
# 使用 CLI 进行 reshard 时添加 --cluster-use-atomic-slot-migration

# 2. 启用 I/O 线程
# valkey.conf:
io-threads 6  # 根据 CPU 核心数调整
io-threads-do-reads yes

# 3. 启用硬件时钟(默认已启用)
# valkey.conf:
use-hardware-clock yes

# 4. 配置 JSON 日志(方便接入可观测性系统)
# valkey.conf:
log-format json

# 5. 考虑启用 Valkey Search 模块
# valkey.conf:
loadmodule valkey-search.so

七、生产环境最佳实践

7.1 内存管理

# 设置最大内存限制
maxmemory 50gb

# 内存淘汰策略(推荐)
maxmemory-policy allkeys-lru

# 监控内存使用
INFO memory
# used_memory:53687091200
# used_memory_human:50.00G
# used_memory_rss:54760833024
# mem_fragmentation_ratio:1.02

# 利用 Hash 字段过期减少内存浪费
# 旧方案:为每个需要独立过期的字段创建单独的键
# SET user:1001:name "张三"
# SET user:1001:token "abc" EX 60
# SET user:1001:temp_data "..." EX 300
# 问题:3 个键的开销 > 1 个 Hash 的开销

# 新方案:使用 Hash 字段过期
# HSET user:1001 name "张三" token "abc" temp_data "..."
# HPEXPIRE user:1001 60000 FIELDS 1 token
# HPEXPIRE user:1001 300000 FIELDS 1 temp_data
# name 永不过期,token 和 temp_data 独立过期

7.2 高可用配置

# valkey.conf(主节点)
# 副本配置
replica-read-only yes
replica-serve-stale-data yes

# 持久化
save 900 1
save 300 10
save 60 10000
appendonly yes
appendfsync everysec

# 集群配置
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-require-full-coverage no
cluster-allow-reads-when-down yes

# TLS 配置
tls-port 6380
tls-cert-file /etc/valkey/tls/valkey.crt
tls-key-file /etc/valkey/tls/valkey.key
tls-ca-cert-file /etc/valkey/tls/ca.crt
tls-reload-certs yes  # 9.1 新特性:自动证书轮换

7.3 监控告警

# 关键监控指标
INFO stats
# total_connections_received:1000
# total_commands_processed:5000000
# instantaneous_ops_per_sec:15000
# rejected_connections:0

INFO cpu
# main_thread_usage:45.2    ← 9.1 新指标,比 CPU 利用率更准确
# io_thread_1_usage:32.1

INFO memory
# used_memory:53687091200
# mem_fragmentation_ratio:1.02

INFO replication
# role:master
# connected_slaves:2

# 告警阈值建议
# main_thread_usage > 80%: 扩容或优化慢查询
# mem_fragmentation_ratio > 1.5: 检查内存碎片
# rejected_connections > 0: 检查最大连接数配置
# connected_slaves < expected: 检查副本连接状态

八、Valkey vs Redis:2026 年该如何选择?

8.1 选择 Valkey 的理由

  1. 真正的开源:BSD 许可证,无任何使用限制
  2. 社区治理:Linux Foundation 托管,不会因为商业决策改变许可证
  3. 性能更优:9.1 版本的单机 2.1M RPS 超越 Redis 开源版
  4. 功能更丰富:原子槽迁移、Hash 字段过期、数据库级 ACL 等都是 Valkey 独有
  5. 云厂商支持:AWS ElastiCache、Google Cloud Memorystore、阿里云等原生支持
  6. 模块全部开源:Valkey Search、Valkey JSON 等无需商业授权

8.2 选择 Redis 的理由

  1. 已有深度集成:如果已经大量使用 Redis 商业模块(RedisJSON、RedisSearch、RedisTimeSeries),迁移成本较高
  2. Redis Cloud 特有功能:Active-Active 地理复制、Redis Data Integration 等商业功能
  3. 团队熟悉度:团队对 Redis 生态更熟悉,培训成本低

8.3 技术对比表

特性Valkey 9.1Redis 8.x
许可证BSD 3-ClauseSSPL + RSALv2
单机 RPS2.1M~1.5M
I/O 线程模型全新设计(+17%)传统模型
原子槽迁移
Hash 字段过期
集群编号数据库
数据库级 ACL
CLUSTERSCAN
JSON 日志
向量搜索开源商业授权
全文搜索开源商业授权
社区活跃度80+ 贡献者/版本单一公司控制

九、总结与展望

Valkey 的崛起不仅仅是一个技术 fork 的故事,更是开源社区对许可证变更的一次集体回应。从 Redis 7.2.4 的 BSD fork 到如今的 Valkey 9.1,这个项目用两年时间证明了社区驱动的开源项目可以比单一公司控制的项目走得更远、更快。

Valkey 9.1 带来的不仅是性能数字的提升(2.1M RPS),更是安全模型的全面升级(数据库级 ACL、Lua 模块化、TLS 自动轮换)和开发者体验的显著改善(HGETDEL、MSETEX、CLUSTERSCAN、JSON 日志)。

对于正在使用 Redis 的团队,我的建议是:

  1. 新项目:直接选择 Valkey,没有理由选择一个非开源的替代品
  2. 已有项目:评估迁移成本,Valkey 的协议兼容性使得迁移几乎零成本
  3. 云用户:如果你的云厂商支持 Valkey(AWS、GCP、阿里云等),直接切换,无需修改代码

Valkey 的下一个大版本(10.0)预计将在 2026 年底发布,据社区透露,将包含以下重要特性:

  • SWIM 协议替代 Gossip:进一步提升大规模集群的效率
  • 独立线程处理集群总线:减少主线程的集群管理开销
  • 更多存储引擎支持:探索 SSD 作为二级存储的可能性
  • AI Agent 原生支持:Valkey + Mem0 的 Agent 记忆方案正在快速成熟

对于每一个关心开源、关心技术自主权的开发者来说,Valkey 值得你的关注和参与。


参考资料

  1. Valkey 官方文档:https://valkey.io/docs/
  2. Valkey 9.1 发布公告:https://valkey.io/blog/valkey-9-1-delivers-improvements-in-security-performance-and-more/
  3. Valkey 9.0 发布公告:https://valkey.io/blog/introducing-valkey-9/
  4. 10 亿 RPS 基准测试:https://valkey.io/blog/1-billion-rps/
  5. 原子槽迁移详解:https://valkey.io/blog/atomic-slot-migration/
  6. Valkey GitHub:https://github.com/valkey-io/valkey
  7. Valkey Search:https://valkey.io/blog/valkey-search-1_2/
  8. Valkey Admin:https://valkey.io/blog/introducing-valkey-admin-1-0-visual-cluster-management-for-valkey/

推荐文章

PHP 唯一卡号生成
2024-11-18 21:24:12 +0800 CST
paint-board:趣味性艺术画板
2024-11-19 07:43:41 +0800 CST
Mysql允许外网访问详细流程
2024-11-17 05:03:26 +0800 CST
一个数字时钟的HTML
2024-11-19 07:46:53 +0800 CST
Python 基于 SSE 实现流式模式
2025-02-16 17:21:01 +0800 CST
支付页面html收银台
2025-03-06 14:59:20 +0800 CST
向满屏的 Import 语句说再见!
2024-11-18 12:20:51 +0800 CST
程序员茄子在线接单