Loading...

文章背景图

Valkey:高性能开源键值服务器的编译与部署指南

2026-10-28
0
- 字
- 分钟
|

官方信息表

项目 说明
项目名称 Valkey
一句话定位 高性能数据结构服务器,主要服务键值类负载
代码仓库 valkey-io/valkey
实现语言 C
官方网站 valkey.io
项目归属 LF Projects, LLC 旗下开源社区项目
开源协议 BSD 三条款
历史渊源 在 Redis 转向新源码可用协议之前,从开源 Redis 项目 fork 而来

配图

Valkey 项目标识

项目背景

Valkey 是一个高性能数据结构服务器,README 在“What is Valkey?”一节里写明:它“primarily serves key/value workloads”,主要服务键值类工作负载,同时支持广泛的原生数据结构,以及一个可扩展的插件系统,用来添加新的数据结构和访问模式。README 开头特别交代了它的来历:这个项目是在 Redis 转向新的“源码可用(source available)”许可证之前一刻,从开源 Redis 项目 fork 出来的。

这个背景决定了 Valkey 的身份:它和经典的 Redis 协议、数据结构、命令高度兼容,你可以把它理解为“社区维护的、完全开源自由的 Redis 分支”。对于那些因为许可证变化而希望留在完全 BSD 开源生态里的用户和云厂商,Valkey 是一个平滑的选择——大量原有基于 Redis 的客户端、运维脚本、配置文件都可以继续使用。

从服务器运维的角度看,Valkey 提供了一整套生产级能力:持久化、主从复制、Sentinel 哨兵高可用、Cluster 分片集群、可选的 TLS、RDMA、systemd 通知。它既可以当作一个轻量的缓存/会话存储跑在单机上,也可以组成多节点集群扛住高并发。README 本身只做快速上手,更完整的运维文档、性能仪表盘、命令参考都在 valkey.io。

在实际使用中,Valkey 的典型用法是:用 ./valkey-server 起一个默认监听 6379 端口的实例,然后用自带的 valkey-cli 连进去执行 SET、GET、HSET、LPUSH、ZADD 等命令。它支持 RDB 快照和 AOF 两种持久化方式,宕机重启后可以把数据恢复回来;主从复制让你把读流量分摊到多个副本,Sentinel 负责在主节点挂掉时自动把某个副本提升为新主,Cluster 则把数据分片到多个节点上突破单机内存上限。这些机制和 Redis 几乎一一对应,所以运维经验可以直接迁移。

跑起来后,常用的 valkey-cli 操作包括:PING 测连通性会返回 PONG;SET mykey hello 写入字符串;GET mykey 读回;HSET user:1 name zhangsan age 30 写一个哈希;LPUSH queue task1、RPOP queue 做简单队列;INFO 看服务器状态(内存、连接数、命中率);CONFIG GET maxmemory 看最大内存配置。生产上一般会先用 CONFIG SET maxmemory 限住内存上限,再配 maxmemory-policy 决定满了之后淘汰哪些 key,避免 Valkey 把系统内存吃光。

对运维来说,valkey-cli --stat 可以实时看 QPS、命中率、内存曲线;valkey-cli --latency 测客户端到服务器的延迟;valkey-cli --bigkeys 扫描找出占用内存最大的 key,做热点分析。这些内置工具省去了自己写监控脚本的麻烦。

整体上,Valkey 的定位就是一个“能直接当 Redis 用、但完全 BSD 开源”的高性能键值服务器:从单机缓存到主从、哨兵、分片集群,从明文到 TLS,从 jemalloc 到 RDMA,生产需要的能力它都具备。如果你或团队在意开源许可证的纯洁性,又不想放弃 Redis 那套熟悉的命令和运维习惯,Valkey 是当下最平滑的选择。

部署上最简单的方式就是编译后 ./valkey-server 直接起服务,它默认监听 6379;想要后台运行、开机自启,就用 utils/install_server.sh 配成守护进程。配合 valkey-cli 就能立刻开始读写数据,整条上手链路非常短。

从 README 给出的构建开关看,它在企业级选项上做得很细:BUILD_TLS 决定 TLS 是内置还是模块、USE_SYSTEMD 接入系统通知、USE_LIBBACKTRACE 让崩溃栈带文件名和行号、MALLOC 选择 jemalloc 还是 libc。这些开关面向的是真实生产环境,而不只是本地跑通。

在缓存、会话存储、消息队列、排行榜这些经典场景里,Valkey 都能直接上手:字符串做缓存、哈希存对象、列表做队列、有序集合做排行榜。它的命令和 Redis 完全一致,客户端也通用。

README 本身只是一份“快速上手”文档,更完整的资料都在 valkey.io。它支持在 Linux、macOS、OpenBSD、NetBSD、FreeBSD 上编译使用,支持大端和小端架构、32 位和 64 位系统;对 Solaris 系系统(如 SmartOS)是“尽力而为”支持,不保证和 Linux、macOS、*BSD 一样好用。

核心特性逐条翻译

README 把重点放在构建和运行上,下面把其中体现的能力逐条翻译并展开。

高性能键值服务器与丰富数据结构。 作为 Redis 的开源 fork,Valkey 继承了字符串、哈希、列表、集合、有序集合等原生数据结构,以及持久化、主从复制、Sentinel、Cluster 等一整套服务器能力。README 里的构建选项和运行命令,都是围绕“如何把这台服务器跑起来”展开的。

可扩展的插件系统。 README 在定位里强调 Valkey 有一个可扩展的插件系统,用来添加新的数据结构和访问模式;构建选项里也有 BUILD_LUA=no(不编译 Lua 引擎)、BUILD_ZSTD=yes(用 Zstandard 压缩流式 RDB 和复制)这类开关,体现出它的模块化取向。

TLS、RDMA、systemd 等企业级选项。 README 给出了丰富的构建开关:BUILD_TLS=yes 把 TLS 编进内置,BUILD_TLS=module 把 TLS 做成模块;BUILD_RDMA=yes/module 提供实验性 RDMA 支持;USE_SYSTEMD=yes 接入 systemd 通知;USE_LIBBACKTRACE=yes 让崩溃栈带文件名和行号。这些选项面向的是真实生产环境。

多种分配器与性能调优。 README 说明默认在 Linux 上用 jemalloc(因为它比 libc malloc 更少碎片问题),其他系统用 libc malloc;你也可以用 MALLOC=libc 或 MALLOC=jemalloc 强制指定。README 还介绍了默认使用处理器内部指令时钟(x86 上的 TSC、ARM 上的 CNTVCT)做单调计时,比 clock_gettime 快约 3 倍。

环境要求与部署

README 的构建方式非常直接:在仓库根目录执行 make 就能编译。下面把常用构建和部署方式翻译出来。

方式一:用 Makefile 编译(最常用)

make

要加 TLS 支持,需要 OpenSSL 开发库(Debian/Ubuntu 上是 libssl-dev),然后:

make BUILD_TLS=yes        # TLS 内置
make BUILD_TLS=module     # TLS 作为模块(注意 Sentinel 模式不支持 TLS 模块)

其他常用开关:BUILD_RDMA=yes 启用实验性 RDMA(需 librdmacm-dev、libibverbs-dev);USE_SYSTEMD=yes 接入 systemd;BUILD_LUA=no 不编译 Lua 引擎;make 32bit 编译 32 位二进制。编译完成后建议跑测试:

make test          # 主集成测试
make test-unit     # 单元测试
make test-cluster  # Cluster 集成测试

README 还提供了 Sentinel 和模块的测试入口(make test-sentinel、make test-modules),以及 Zstandard 流式压缩(BUILD_ZSTD=yes,需要 Zstandard 1.4.7 以上)。这些开关让你可以按生产环境的实际需要裁剪:需要 TLS 就开 TLS,需要 systemd 通知就接 systemd,不需要 Lua 脚本引擎就关掉以减小体积。

如果改了源码或依赖,README 提醒要先 make distclean 清理 jemalloc、lua、libvalkey、linenoise 等依赖,否则缓存的构建选项会一直生效。

方式二:安装到系统并以后台服务运行

README 说明 make install 会把二进制装进 /usr/local/bin(也可以用 make PREFIX=/some/dir install 指定目录),并为了和 Redis 兼容,会创建从 redis-server、redis-cli 等名字到 Valkey 二进制的符号链接。如果要在 Ubuntu/Debian 上把它配置成开机自启的后台守护进程,README 提供了脚本:

cd utils
./install_server.sh

这个脚本会问你几个问题,然后把 Valkey 配成后台守护进程,重启后自动拉起;之后你可以用 /etc/init.d/valkey_<端口号>(例如 /etc/init.d/valkey_6379)来停止和启动它。README 提醒这个脚本只在 Linux 上工作,macOS 上不行。

方式三:用 CMake(实验性)

除了传统 Makefile,Valkey 还提供实验性的 CMake 构建:

mkdir build-release && cd build-release
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/opt/valkey
sudo make install

支持的选项包括 -DBUILD_TLS、-DBUILD_RDMA、-DBUILD_ZSTD、-DBUILD_MALLOC(libc/jemalloc/tcmalloc)等,详见 README 的 CMake 章节。

使用方法

编译完成后,用默认配置直接启动服务器:

cd src
./valkey-server

要指定配置文件,把路径作为参数传进去:

./valkey-server /path/to/valkey.conf

也可以直接在命令行覆盖配置项,例如:

./valkey-server --port 9999 --replicaof 127.0.0.1 6379
./valkey-server /etc/valkey/6379.conf --loglevel debug

README 说明 valkey.conf 里的所有选项都能以同名命令行参数传递。启动后另开一个终端,用 valkey-cli 连上去玩:

cd src
./valkey-cli
valkey> ping
PONG
valkey> set foo bar
OK
valkey> get foo
"bar"
valkey> incr mycounter
(integer) 1
valkey> incr mycounter
(integer) 2

这个 ping 返回 PONG、set/get 存取字符串、incr 做计数的小流程,是任何键值服务器最经典的冒烟测试:它能跑通,就说明服务器起来了、客户端能连、读写正常。对于从 Redis 迁移过来的用户,这些命令几乎是肌肉记忆,零学习成本。

如果你用 TLS 启动,README 给出了配套的 valkey-cli --tls 连接方式,并说明可以用 --tls-replication yes 让副本连接主节点、用 --tls-cluster yes 让 Cluster 节点之间走 TLS。

对于要做高可用的生产环境,README 还提供了 Sentinel 集成测试(make test-sentinel)和 Cluster 集成测试(make test-cluster),以及 RDMA 实验性支持(BUILD_RDMA=yes,目前只支持 Linux)。这些能力意味着 Valkey 不只是一个单机缓存,而是可以组成主从、哨兵、分片集群的完整数据服务器。

从“为什么用 Valkey”的角度看,它最大的价值是:在 Redis 许可证变化之后,给社区和云厂商提供了一个完全 BSD、协议兼容的延续。如果你现有的系统是围绕 Redis 客户端、命令、配置构建的,迁移到 Valkey 的成本非常低——README 甚至在 make install 时主动创建 redis-server、redis-cli 的符号链接,就是为了让旧脚本无需修改就能继续工作。

对于服务器运维人员,Valkey 的定位很清晰:它是一个可以直接替换 Redis 的开源数据服务器,构建、运行、高可用、TLS、集群一应俱全。你可以从单机 ./valkey-server 开始试水,再逐步用 Sentinel 或 Cluster 扩展到生产规模,整个过程和你熟悉的 Redis 运维几乎一致。

日常运维中,你最常做的就是:编译、用 ./utils/install_server.sh 把它装成开机自启服务、然后用 valkey-cli 连上去看数据、调配置。README 强调 valkey.conf 里的所有配置项都能在命令行同名覆盖,这让临时调试非常方便——你不需要改配置文件再重启,直接 ./valkey-server --port 9999 --loglevel debug 就能起一个临时实例。

对于生产部署,README 还提到 make install 只会把二进制装进系统,不会自动配 init 脚本和配置文件;如果你只是本地玩一玩,这无所谓,但要在生产环境把它当后台服务跑,就该用 utils/install_server.sh 把它配成随系统启动的守护进程,再用 /etc/init.d/valkey_<端口> 管理启停。

README 还提醒,make install 创建的 Redis 风格符号链接在 make uninstall 时会被移除;如果你不想创建这些兼容符号链接,可以用 make PREFIX=/some/directory install 或设置 USE_REDIS_SYMLINKS=no。这种细节说明它在设计时认真考虑了从 Redis 迁移过来的运维习惯。

常见问题(FAQ)

问:Valkey 和 Redis 是什么关系?能直接替换吗? README 说明它是在 Redis 转向新许可证之前从开源 Redis fork 出来的,和经典 Redis 协议、数据结构、命令高度兼容;make install 还会创建 redis-server、redis-cli 等符号链接以兼容现有部署。

问:怎么编译 Valkey? README 最直接的方式就是在仓库根目录执行 make;要 TLS 就先装 OpenSSL 开发库再 make BUILD_TLS=yes;编译完用 make test 跑测试;make install 装到 /usr/local/bin。

问:怎么把它配成开机自启的服务? README 提供了 utils/install_server.sh,在 Ubuntu/Debian 上运行它会把 Valkey 配成后台守护进程,之后用 /etc/init.d/valkey_<端口> 启停;注意这个脚本只支持 Linux。

问:修改源码后重新编译为什么不生效? README 提醒 make 不会自动重建依赖,如果 git pull 或改了依赖目录,必须先 make distclean 清理 jemalloc、lua、linenoise 等,再重新 make;强制的构建选项也会被缓存,直到 make distclean。

问:Valkey 默认用什么内存分配器? README 说明在 Linux 上默认用 jemalloc(碎片更少),其他系统用 libc malloc;可以用 make MALLOC=libc 强制用 libc,或在 macOS 上用 make MALLOC=jemalloc 强制用 jemalloc。

问:Valkey 是什么许可证? Valkey 是 LF Projects, LLC 旗下的开源社区项目,采用 BSD 三条款许可证,完全自由开源,适合对许可证友好性有要求的生产环境。

问:Valkey 支持 TLS 吗?怎么开? README 说明需要先装 OpenSSL 开发库(Debian/Ubuntu 是 libssl-dev),然后 make BUILD_TLS=yes 内置或 make BUILD_TLS=module 做成模块;运行时用 --tls-port、--tls-cert-file 等参数指定证书,用 valkey-cli --tls 连接。注意 Sentinel 模式不支持 TLS 模块。

问:Valkey 的性能怎么观察? README 提供了 性能仪表盘,可以跨版本对比吞吐量趋势,还有一个 unstable 分支的实时仪表盘,帮贡献者快速发现性能回退。

跳转链接

评论交流

文章目录