编程 Valkey 深度实战:Redis 分叉两年后,这个「社区所有」的内存数据库到底强在哪

2026-07-27 04:14:57 +0800 CST views 9

Valkey 深度实战:Redis 分叉两年后,这个「社区所有」的内存数据库到底强在哪

一句话总结:2024 年 Redis 改协议引爆社区,Linux 基金会带着 AWS、Google、Oracle 把 Redis 7.2.4 分叉成 Valkey。两年过去,它没有停留在「政治正确的平替」层面,而是靠异步 I/O 线程重写、双通道复制、Slot 级迁移、Hash 字段级过期这些硬核工程改进,把单机吞吐干到了百万 RPS 级别。本文从许可证风暴讲起,一路挖到线程模型源码层,配完整命令示例、配置调优和迁移踩坑清单。


一、先说清楚:Valkey 不是「又一个 Redis 换皮」

很多人第一次听到 Valkey 的反应是:「不就是 Redis 改个名字继续用 BSD 协议吗?」

如果时间停在 2024 年 4 月,这话没错。但如果你还这么想,说明你已经落后社区两年了。

我先把结论摆在这:截至 2026 年,Valkey 在 I/O 线程模型、复制机制、集群迁移这三块,已经和它分叉时的 Redis 7.2 拉开了实质性差距。 它不是一个「保守维护」的 fork,而是一个「激进演进」的独立项目。

要理解这件事的分量,得先回到那场让整个开源圈失眠的许可证变更。

1.1 许可证风暴:一次单方面改规则引发的雪崩

2024 年 3 月 20 日,Redis Labs(现在叫 Redis Inc.)宣布:从 Redis 7.4 开始,放弃使用了十多年的 BSD-3-Clause 宽松协议,改用双许可 —— RSALv2 + SSPLv1

这两个协议的杀伤力在哪?

  • RSALv2(Redis Source Available License):禁止把 Redis「作为托管服务」提供给第三方。翻译成人话:AWS、Google、阿里云这些卖 Redis 托管服务的云厂商,直接被点名了。
  • SSPLv1(Server Side Public License):如果你提供「程序即服务」,就得公开整个服务端栈的源码 —— 不只是 Redis 本身,连你的运维脚本、编排代码都得开源。这基本等于商业自杀条款。

对企业用户来说,这意味着两个悬在头上的达摩克利斯之剑:法律合规风险单一供应商锁定。你今天基于 Redis 建的架构,明天可能就因为一纸协议变更而进退两难。

1.2 Valkey 的诞生:巨头罕见地站到了同一边

许可证变更公告发出后不到一个月,2024 年 4 月,Linux 基金会牵头,联合 AWS、Google Cloud、Oracle、Snap、Ericsson 等一票巨头,从 Redis 7.2.4(最后一个 BSD 版本) 分叉出了 Valkey。

名字取自北欧神话的女武神 Valkyrie,社区口号很直接:

"保留一个社区所有、采用宽松 BSD 许可的真正开源替代方案,杜绝任何单一厂商单方面改变规则的可能。"

关键词是社区所有(community-owned)。Valkey 由 Linux 基金会托管,采用厂商中立的技术指导委员会(TSC)治理,没有任何一家公司能像当年 Redis Labs 那样「一句话改协议」。

两年后的数据能说明问题:

  • GitHub Stars 突破 25k+,Fork 数上千
  • 2025 年底社区调查显示,约 42% 的用户已迁移或计划迁移到 Valkey
  • 主流 Linux 发行版(Fedora、Debian、Ubuntu)默认仓库把 redis 包替换成了 valkey
  • 云厂商全面跟进:AWS ElastiCache、Google Memorystore、腾讯云都上线了 Valkey 托管版

有意思的是国内的参与度。腾讯云数据库团队在 Redis 和 Valkey 社区累计贡献了 360 多个 PR,代码贡献量一度位居全球第一,并在 2025 年底率先在国内支持 Valkey 8.0。这说明 Valkey 已经不是「西方开源圈的自娱自乐」,而是真正进入了生产级采用阶段。


二、架构总览:在完全兼容中做减法与做加法

Valkey 的设计哲学可以概括成一句话:对上层兼容做减法(几乎零迁移成本),对底层性能做加法(激进重写)。

2.1 协议与数据结构:100% 兼容 Redis

先给吃下定心丸的部分。Valkey 完整继承了 Redis 的:

  • RESP 协议(RESP2 / RESP3),客户端不用改一行代码
  • 全部数据结构:String、Hash、List、Set、Sorted Set、Bitmap、HyperLogLog、Stream、Geo
  • 持久化机制:RDB 快照 + AOF 日志 + 混合模式
  • 命令集GET/SET/HSET/ZADD/XADD 等你熟悉的一切
  • Cluster 协议主从复制Sentinel(Valkey 里也保留)

这意味着你现有的 redis-clijedisgo-redisredis-py 全都能直连 Valkey,连 RDB/AOF 文件都是二进制兼容的。迁移在很多场景下就是「换个二进制、换个端口」这么简单。

# Valkey 自带 valkey-cli,但 redis-cli 也能直连
$ valkey-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> INFO server
# Server
valkey_version:8.1.0          # 注意这里是 valkey_version
redis_version:7.4.0           # 同时保留 redis_version 做兼容探测
server_name:valkey
...
127.0.0.1:6379> SET foo bar
OK
127.0.0.1:6379> OBJECT ENCODING foo
"embstr"                      # 编码策略与 Redis 完全一致

注意上面那个细节:Valkey 在 INFO同时暴露 valkey_versionredis_version。前者是真实版本,后者是「兼容性谎报」—— 很多客户端库会根据 redis_version 做特性开关判断,Valkey 为了不破坏这些库,谎报一个对应的 Redis 版本号。这个设计很务实,但也提醒你:做监控和特性探测时,认准 valkey_version

2.2 三大底层升级:Valkey 真正的护城河

兼容是基础,差异化在底层。Valkey 8.x 相对分叉时的 Redis 7.2,做了三项关键架构升级:

  1. 异步 I/O 线程彻底重写 —— 单机吞吐翻数倍
  2. 双通道复制(Dual-Channel Replication) —— 主从全量同步不再阻塞主库
  3. Slot 级原子迁移 + 内存效率优化 —— 集群扩缩容更平滑

下面逐个拆开讲。


三、核心突破一:异步 I/O 线程模型的重写

这是 Valkey 最能打的一块,也是最容易被误解的一块。很多人以为「Valkey 变成多线程了,所以快」—— 这是错的。Valkey 的命令执行仍然是单线程的。 理解这一点是理解整个模型的关键。

3.1 回顾:Redis 单线程模型为什么快,又为什么慢

Redis 经典的单线程事件循环(基于 epoll 的 I/O 多路复用)好处很明确:

  • 命令执行天然原子,无需加锁
  • 没有多线程上下文切换开销
  • 没有锁竞争

但瓶颈也很明确:当连接数和网络包量上来后,主线程要花大量时间在 read()/write() 系统调用和协议解析上,真正执行命令的时间反而被挤占。你会看到 CPU 单核打满,但吞吐上不去。

Redis 6.0 引入了 I/O 多线程试图缓解,但它的实现有个致命设计问题:主线程和 I/O 线程之间是「同步阻塞式」协作 —— 主线程分发任务后要停下来等所有 I/O 线程干完活才能继续,本质上是「批处理 + 屏障同步」,多核利用率上不去,还引入了额外的同步开销。

3.2 Valkey 的方案:把 epoll 轮询从主线程彻底卸载

Valkey 8.0 重写了这一层,核心思路是:

命令执行留在主线程(保持单线程原子性),但把昂贵的 socket I/O(读取、协议解析、回包)异步地卸载到独立的 I/O 工作线程,主线程和 I/O 线程之间用无阻塞的方式协作。

关键改动有三点:

  • epoll_wait 卸载:把套接字事件的等待和读写从主线程搬到 I/O 线程池
  • 命令执行隔离:无论多少 I/O 线程,命令的实际执行永远在主线程串行完成,原子性和无锁优势原样保留
  • 智能负载调度:根据实时负载动态把 I/O 任务分配到多核,而不是 Redis 那种固定批次分发

配置起来很简单:

# valkey.conf
# 开启 I/O 线程,数量建议设为 物理核数 - 1,给主线程留一个核
io-threads 8

# Valkey 8.0 默认读写都走 I/O 线程;Redis 6.0 需要额外开 io-threads-do-reads
# 在 Valkey 里这个已经是默认行为,无需手动配

3.3 性能实测:这不是 PPT 数据

在 AWS c7g.4xlarge(16 vCPU,Graviton3)上的官方对比数据:

指标Valkey 7.2Valkey 8.0提升幅度
吞吐量360K RPS1.19M RPS+230%
平均延迟1.792 ms0.542 ms-69.8%
P99 延迟0.927 ms亚毫秒级显著改善

三倍多的吞吐提升,延迟还降了近 70%,而且是在同一套硬件上、纯软件层面的改进。对于缓存这种「越快越省钱」的场景,这直接意味着集群规模可以砍掉一大半。

你可以自己用 valkey-benchmark(就是原来的 redis-benchmark)复现:

# 单机压测 SET/GET,100 连接,每命令 100 字节 value
$ valkey-benchmark -h 127.0.0.1 -p 6379 \
    -t set,get \
    -n 5000000 \
    -c 100 \
    -d 100 \
    --threads 8

# 关注输出里的 "requests per second" 和延迟分布
# 对比开启前后 io-threads 的差异,同一台机器就能看到明显区别

3.4 一个容易踩的坑:I/O 线程不是越多越好

我见过不少人把 io-threads 直接拉满到核数,结果性能反而下降。原因是:

  • I/O 线程和主线程会争抢 CPU、L2/L3 缓存
  • 当 value 很小、命令很简单时,I/O 开销占比低,多线程收益不明显,反而被调度开销拖累
  • 主线程仍是命令执行的瓶颈,I/O 线程再多也救不了「执行慢」的命令(比如大 key 的 HGETALL

经验法则:先测你的真实 workload。如果 value 普遍偏大、连接数多、网络吞吐是瓶颈 —— 开 I/O 线程收益大;如果是海量小命令、CPU 卡在命令执行 —— 优先优化数据模型,别指望 I/O 线程。


四、核心突破二:双通道复制(Dual-Channel Replication)

第二个硬核改进,解决的是老 Redis 用户都被坑过的痛点:主从全量同步(full sync)会拖垮主库。

4.1 老 Redis 的复制之痛

传统 Redis 全量复制流程是这样的:

  1. 从库连上主库,请求全量同步
  2. 主库 fork 一个子进程生成 RDB 快照
  3. 在生成 RDB 的整个期间,主库把所有新写入命令缓存到「复制缓冲区(replication buffer)」里
  4. RDB 生成完,通过主线程发给从库
  5. 从库加载完 RDB,主库再把缓冲区里积压的命令补发过去

问题出在第 3、4 步:

  • 复制缓冲区在主库内存里,如果 RDB 生成慢(数据量大)+ 写入高,缓冲区会暴涨,可能触发 client-output-buffer-limit 直接断开从库,然后重来,陷入死循环
  • RDB 数据通过主线程传输,占用主线程的宝贵时间片,影响正常请求

4.2 Valkey 的解法:把 RDB 快照和增量命令拆到两条独立通道

Valkey 8.0 引入的 Dual-Channel Replication 思路很巧妙:

开两条 TCP 连接。一条专门传 RDB 快照,由子进程直接发送,不经过主线程;另一条并行传输同步期间产生的增量命令流。从库两边同时收,本地做合并。

好处是实打实的:

  • 主线程不再背负 RDB 传输负担 —— RDB 由 fork 出的子进程直接走独立通道发出,主线程该干嘛干嘛
  • 主库复制缓冲区压力大幅下降 —— 增量命令实时流式发送给从库,不用在主库内存里死等 RDB 传完再补发,减少了 OOM 和缓冲区溢出风险
  • 全量同步期间主库延迟更稳 —— 官方数据显示,大数据集全量同步场景下,主库的延迟抖动显著降低

开启方式:

# valkey.conf(主库和从库都要开)
dual-channel-replication-enabled yes
# 运行时也能动态开启
127.0.0.1:6379> CONFIG SET dual-channel-replication-enabled yes
OK
127.0.0.1:6379> CONFIG GET dual-channel-replication-enabled
1) "dual-channel-replication-enabled"
2) "yes"

4.3 什么时候该开?

  • 大数据集(几十 GB 以上)+ 高写入 的主库:强烈建议开,这是它的主战场
  • 小数据集、低写入:收益不明显,开不开都行
  • 注意:这是 Valkey 8.0+ 特性,主从两端版本都要够。混合版本集群(部分老 Redis 从库)时它会自动降级到传统复制

五、核心突破三:集群迁移与内存效率

5.1 Slot 级原子迁移:扩缩容不再提心吊胆

Redis Cluster 的 16384 个 slot 迁移,历史上一直是运维的噩梦 —— 迁移过程中如果出问题,slot 可能处于「半迁移」的不一致状态。Valkey 在集群管理上做了增量改进,让 slot 迁移更原子、更可观测,配合 valkey-cli --cluster 工具链,扩缩容平滑度明显提升。

# 查看集群 slot 分布
$ valkey-cli --cluster check 127.0.0.1:7000

# 给集群加一个新节点并重新分片
$ valkey-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000
$ valkey-cli --cluster reshard 127.0.0.1:7000 \
    --cluster-from <source-node-id> \
    --cluster-to <target-node-id> \
    --cluster-slots 1000 \
    --cluster-yes

5.2 内存效率:省内存就是省钱

Valkey 社区在内存布局上做了持续优化,典型的比如:

  • 优化了 dict(哈希表)的元数据开销,每个 key 的内存占用有所下降
  • embedded key 优化:小 key 直接内联存储,减少指针跳转和内存碎片
  • 延续并改进了 Redis 的 listpack/quicklist/intset 等紧凑编码

对于动辄存几亿个 key 的缓存集群,单 key 省下几十字节,整体就是几个 GB 甚至几十 GB 的内存节省。

你可以用 MEMORY USAGEOBJECT ENCODING 观察编码策略:

127.0.0.1:6379> RPUSH mylist a b c d e
(integer) 5
127.0.0.1:6379> OBJECT ENCODING mylist
"listpack"                    # 小 list 用紧凑的 listpack
127.0.0.1:6379> MEMORY USAGE mylist
(integer) 89

# 塞入大量元素后自动转 quicklist
127.0.0.1:6379> DEBUG OBJECT mylist
Value at:0x... encoding:listpack ql_nodes:1 ...

5.3 Hash 字段级过期(Hash Field TTL)

这是很多人盼了十年的功能。以前 Redis 的 TTL 只能作用在整个 key 上,Hash 里的单个 field 想过期?对不起,做不到,只能自己在业务层维护。

Valkey(对齐 Redis 7.4 的能力)支持了 Hash 字段级 TTL

127.0.0.1:6379> HSET session:u1001 token abc123 device ios
(integer) 2

# 给 token 字段单独设置 300 秒过期,device 字段不受影响
127.0.0.1:6379> HEXPIRE session:u1001 300 FIELDS 1 token
1) (integer) 1

# 查看某个字段剩余 TTL
127.0.0.1:6379> HTTL session:u1001 FIELDS 1 token
1) (integer) 300

# 查看字段的绝对过期时间戳
127.0.0.1:6379> HPEXPIRETIME session:u1001 FIELDS 1 token
1) (integer) 1769491200000

# 移除某字段的过期时间(变回永久)
127.0.0.1:6379> HPERSIST session:u1001 FIELDS 1 token
1) (integer) 1

这个能力对「一个 Hash 存一批有不同生命周期的字段」的场景(会话管理、限流窗口、临时元数据)极其实用,直接省掉了业务层一大坨手动清理逻辑。


六、代码实战:从零跑通一套 Valkey

光讲原理不落地就是耍流氓。下面给一套能直接抄的实战。

6.1 编译安装

# 从源码编译(推荐生产用固定 tag)
$ git clone https://github.com/valkey-io/valkey.git
$ cd valkey
$ git checkout 8.1.0
$ make -j$(nproc)

# 二进制在 src/ 下
$ ./src/valkey-server --version
Valkey server v=8.1.0 ...

# 或者直接用包管理器(Debian/Ubuntu 新版仓库已内置)
$ sudo apt install valkey-server valkey-tools

6.2 一份生产可用的基础配置

# valkey.conf —— 生产基线配置示例
bind 0.0.0.0
port 6379
protected-mode yes
requirepass "your-strong-password-here"

# 内存与淘汰
maxmemory 8gb
maxmemory-policy allkeys-lru        # 纯缓存场景推荐 LRU/LFU

# I/O 线程(核数-1)
io-threads 7

# 持久化:混合模式,兼顾速度与安全
appendonly yes
appendfsync everysec
aof-use-rdb-preamble yes            # 4.0+ 混合持久化

# 复制优化
dual-channel-replication-enabled yes
repl-diskless-sync yes              # 无盘复制,RDB 直接走网络不落盘

# 慢查询监控
slowlog-log-slower-than 10000       # 超过 10ms 记入慢日志
slowlog-max-len 256

6.3 Go 客户端接入(go-redis 直连 Valkey)

go-redis 完全兼容 Valkey,无需换库:

package main

import (
	"context"
	"fmt"
	"time"

	"github.com/redis/go-redis/v9"
)

func main() {
	ctx := context.Background()
	rdb := redis.NewClient(&redis.Options{
		Addr:         "127.0.0.1:6379",
		Password:     "your-strong-password-here",
		DB:           0,
		PoolSize:     50,               // 连接池,配合 I/O 线程发挥多核
		MinIdleConns: 10,
		ReadTimeout:  200 * time.Millisecond,
	})

	// 基础读写
	if err := rdb.Set(ctx, "greeting", "hello valkey", time.Hour).Err(); err != nil {
		panic(err)
	}
	val, _ := rdb.Get(ctx, "greeting").Result()
	fmt.Println("GET greeting =>", val)

	// Hash 字段级 TTL(Valkey 8.x)
	rdb.HSet(ctx, "session:u1001", "token", "abc123", "device", "ios")
	// HExpire: 给单个字段设过期
	res, err := rdb.HExpire(ctx, "session:u1001", 300*time.Second, "token").Result()
	if err != nil {
		fmt.Println("HExpire not supported by this client version:", err)
	} else {
		fmt.Println("HExpire result:", res) // [1] 表示设置成功
	}

	// Pipeline 批量操作,减少 RTT
	pipe := rdb.Pipeline()
	for i := 0; i < 1000; i++ {
		pipe.Incr(ctx, fmt.Sprintf("counter:%d", i%10))
	}
	if _, err := pipe.Exec(ctx); err != nil {
		panic(err)
	}
	fmt.Println("pipeline done")
}

6.4 Python 客户端 + 连接池

import redis  # redis-py 直连 Valkey,零改动

pool = redis.ConnectionPool(
    host="127.0.0.1",
    port=6379,
    password="your-strong-password-here",
    max_connections=50,
    socket_timeout=0.2,
    decode_responses=True,
)
r = redis.Redis(connection_pool=pool)

# 基础操作
r.set("greeting", "hello valkey", ex=3600)
print("GET =>", r.get("greeting"))

# Hash 字段级 TTL(需 redis-py 5.x+)
r.hset("session:u1001", mapping={"token": "abc123", "device": "ios"})
try:
    print("HEXPIRE =>", r.hexpire("session:u1001", 300, "token"))
    print("HTTL   =>", r.httl("session:u1001", "token"))
except AttributeError:
    # 老版本客户端可用 execute_command 兜底
    print(r.execute_command("HEXPIRE", "session:u1001", 300, "FIELDS", 1, "token"))

# 用 pipeline 批量写,压测友好
with r.pipeline(transaction=False) as pipe:
    for i in range(1000):
        pipe.incr(f"counter:{i % 10}")
    pipe.execute()
print("pipeline done")

七、性能调优实战清单

跑起来只是第一步,调优才是真本事。下面是我总结的 Valkey 生产调优 checklist。

7.1 系统内核层

# 1. 关闭 THP(透明大页),否则 fork 时延迟抖动严重
$ echo never > /sys/kernel/mm/transparent_hugepage/enabled

# 2. 允许内存过量分配,避免 fork 时因 COW 判断失败而失败
$ sysctl -w vm.overcommit_memory=1

# 3. 提高 backlog,避免高并发连接建立时丢连接
$ sysctl -w net.core.somaxconn=1024
# 同时 valkey.conf 里 tcp-backlog 511 -> 1024

# 4. 关闭 swap 或调低 swappiness,内存数据库最怕换页
$ sysctl -w vm.swappiness=0

THP 这个坑我要单独强调:开着 THP,你的 P99 延迟会莫名其妙地飙高,因为 fork 生成 RDB 时的写时复制(COW)会因为大页而放大内存拷贝量。生产环境务必关掉。

7.2 内存与淘汰策略

  • 纯缓存:allkeys-lruallkeys-lfu(LFU 对热点更友好,抗缓存击穿)
  • 混合场景(部分持久 key 不能淘汰):volatile-lru,只淘汰设了 TTL 的 key
  • 务必设 maxmemory,别裸奔。不设的话 OOM 了直接被系统 kill,比主动淘汰惨得多
  • 监控 evicted_keysmem_fragmentation_ratio,前者暴涨说明内存不够,后者 > 1.5 说明碎片严重,考虑 activedefrag yes

7.3 避免大 key 和热 key

这是所有 Redis/Valkey 系统的通病,I/O 线程也救不了:

# 用内置工具扫大 key
$ valkey-cli --bigkeys
$ valkey-cli --hotkeys      # 需开启 LFU 淘汰策略

# 大 key 的危害:
# - 单命令执行慢,阻塞单线程主线程(I/O 线程帮不上忙)
# - 迁移、删除、序列化时造成延迟尖刺
# 解法:拆分大 Hash/List,用 HSCAN 分批处理,UNLINK 异步删除
127.0.0.1:6379> UNLINK huge_key   # 非阻塞删除,别用 DEL

7.4 关键监控指标

127.0.0.1:6379> INFO stats
# instantaneous_ops_per_sec  -> 实时 QPS
# keyspace_hits / misses     -> 命中率,缓存核心指标
# expired_keys / evicted_keys-> 过期与淘汰
# rejected_connections       -> 连接被拒,说明 maxclients 不够

127.0.0.1:6379> INFO replication
# master_repl_offset vs slave 的 offset 差 -> 复制延迟

127.0.0.1:6379> INFO latencystats
# 各命令的延迟分布(Valkey/Redis 7.x 增强)

命中率是缓存系统的生命线:hits / (hits + misses)。低于 90% 就得反思缓存设计了。


八、从 Redis 迁移到 Valkey:实操路径

迁移是大家最关心的。好消息:大多数场景迁移成本极低,因为二进制兼容。

8.1 方案 A:直接替换二进制(停机窗口最短)

适用于单机或主从架构,能接受秒级切换:

# 1. Valkey 能直接加载 Redis 的 RDB / AOF 文件
$ cp /var/lib/redis/dump.rdb /var/lib/valkey/dump.rdb

# 2. 停 redis,用 valkey-server 加载同一份数据目录启动
$ systemctl stop redis
$ valkey-server /etc/valkey/valkey.conf

# 3. 验证数据完整
$ valkey-cli DBSIZE

8.2 方案 B:主从热迁移(零停机)

让 Valkey 作为 Redis 的从库,同步完成后提升为主:

# 在 Valkey 实例上,把它设为 Redis 主库的从库
127.0.0.1:6379> REPLICAOF <redis-master-host> <redis-master-port>

# 等待同步完成(INFO replication 里 master_link_status:up)
# 数据追平后,断开复制关系,Valkey 独立成主
127.0.0.1:6379> REPLICAOF NO ONE

# 最后把业务流量切到 Valkey

8.3 迁移踩坑清单

  • 版本探测逻辑:如果你的代码/中间件按 redis_version 做特性开关,注意 Valkey 谎报的版本号,必要时改成认 valkey_version
  • 模块(Module)兼容性:RedisJSON、RediSearch 这些是 Redis Inc. 的闭源/改协议模块,Valkey 用不了。Valkey 社区在推自己的模块生态(如 valkey-search、valkey-json、valkey-bloom),迁移前确认你依赖的模块有对应替代
  • 监控告警:Grafana 面板、exporter 的指标名可能需要适配(多数 redis_exporter 直接兼容)
  • 客户端库版本:想用 Hash 字段 TTL 这类新特性,客户端库要够新(go-redis v9+、redis-py 5.x+)
  • 混合集群过渡期:Redis 和 Valkey 节点混跑时,Valkey 的新特性(双通道复制等)会自动降级兼容,别指望半迁移状态能享受全部性能红利

九、选型建议:什么时候该上 Valkey

作为一个务实的程序员,我给几条落地建议:

强烈推荐 Valkey 的场景:

  • 新项目从零选型 —— 没有历史包袱,直接上 Valkey,享受更好的许可证确定性和持续演进
  • 大规模缓存集群 —— I/O 线程重写带来的吞吐提升能实打实砍机器成本
  • 对开源许可证敏感的企业 —— 尤其是要把服务对外提供的,BSD 协议没有法律地雷
  • 用云托管 Redis 且成本敏感 —— 各大云的 Valkey 托管版通常更便宜

需要谨慎评估的场景:

  • 深度依赖 RedisJSON / RediSearch / RedisTimeSeries 等 Redis 官方模块 —— 先确认 Valkey 侧有成熟替代
  • 用了 Redis 8.0+ 独有的新命令 —— Valkey 从 7.2 分叉后走了自己的路线,两边命令集在缓慢分化,用之前查兼容性
  • 团队完全没有运维内存数据库经验 —— Valkey 和 Redis 的运维知识 95% 通用,但要认准官方文档别混

一个反直觉的判断:不要因为「Redis 更有名」就默认选 Redis。在 2026 年的今天,Valkey 的社区活跃度、发行版默认支持、云厂商采用度,已经让它成为「保守稳妥」的那个选择,而不是「激进尝鲜」的那个。风向已经变了。


十、总结与展望

回顾一下 Valkey 这两年的进化路径:

  1. 起点:一场许可证风暴逼出来的社区自救,从 Redis 7.2.4 分叉
  2. 兼容层:100% 协议、数据结构、持久化兼容,迁移几乎零成本
  3. 性能层:异步 I/O 线程重写(吞吐 +230%)、双通道复制(全量同步不拖主库)、Slot 迁移与内存优化
  4. 功能层:Hash 字段级 TTL 等实用能力补齐
  5. 生态层:Linux 基金会治理、巨头共建、发行版默认、云厂商全面托管

Valkey 证明了一件事:当一个开源项目真正「社区所有」时,它的演进速度可以比任何单一厂商主导时都快。 没有了「要不要开源」「怎么商业化」的内耗,工程师可以专注把技术做到极致。

往前看,Valkey 社区已经在探索几个方向:RDMA 网络支持(进一步压榨延迟)、更智能的自动分片向量搜索能力(valkey-search,对接 AI 时代的向量检索需求)、多线程执行的可行性探索(在保证正确性的前提下突破单线程执行瓶颈)。

对于我们做工程的人来说,结论很简单:Valkey 已经过了「值不值得试」的阶段,进入了「什么时候上」的阶段。 如果你还在用 Redis,至少该把 Valkey 放进下一次技术评审的候选清单里了。

技术选型从来不是追新,而是看谁能在正确的方向上跑得更稳、更远。这一次,「社区所有」这四个字,可能就是那个正确的方向。


本文基于 Valkey 8.x 公开文档、社区资料与官方性能数据整理,代码示例可直接在 Valkey 8.1 环境运行。生产落地前请以你所用版本的官方文档为准。

推荐文章

ElasticSearch集群搭建指南
2024-11-19 02:31:21 +0800 CST
程序员茄子在线接单