为什么要考虑 Redis 和 Valkey?
Redis 长期以来几乎是缓存数据库领域的事实标准。无论是缓存、Session 存储、消息队列、分布式锁还是限流组件,大量后端项目都会直接选择 Redis。
但是随着 Redis 许可证变化以及 Valkey 项目的出现,开发者开始面临一个新的问题:
新项目应该继续使用 Redis,还是选择 Valkey?
对于已有项目:
Redis 是否可以无感迁移到 Valkey?
本文主要从实际开发角度,对比两者在:
- 命令兼容;
- 客户端支持;
- Docker 部署;
- 框架生态;
- 数据迁移;
等方面的差异。
Redis 和 Valkey 的关系
简单来说,Valkey 是基于 Redis 7.2.4 版本代码发展而来的社区分叉项目。
因此,Redis 7.2 系列的大部分功能,在 Valkey 中保持了较好的兼容性。
但是 Redis 后续版本新增功能,不一定会同步到 Valkey。
对于大多数基础使用场景:Redis ≈ Valkey,替换成本较低。
但是:
协议兼容,不代表整个生态完全兼容。
这是迁移时最需要注意的地方。
Redis VS Valkey 核心区别
从实际使用角度来看,Redis 和 Valkey 的区别并不大。
两者之间最大的差异并不在:
- 数据结构;
- 网络协议;
- 基础命令;
而在于:
- 生态;
- 商业支持;
- 周边工具兼容等方面。
| 对比项 | Redis | Valkey |
|---|---|---|
| 项目来源 | 原 Redis 项目 | Redis 7.2 分叉项目 |
| 开源协议 | RSALv2 / SSPL(不同版本有所变化) | BSD-3-Clause |
| 通信协议 | RESP | RESP |
| 默认端口 | 6379 | 6379 |
| 数据结构 | String、Hash、List、Set、ZSet 等 | 基本一致 |
| Redis 命令 | 支持 | 高度兼容 |
| Redis 客户端 | 支持 | 大部分支持 |
| Docker 镜像 | redis | valkey/valkey |
| 持久化方式 | RDB / AOF | RDB / AOF |
| 主从复制 | 支持 | 支持 |
| Redis Cluster | 支持 | 支持 |
| ACL 权限控制 | 支持 | 支持 |
| Redis Module | 生态丰富 | 需要单独验证 |
| 云厂商支持 | 更成熟 | 逐渐增加 |
| 社区规模 | 更大 | 较新 |
| 开源路线 | 商业化倾向增强 | 社区驱动 |
Docker 部署区别
Redis 部署
services: redis: image: redis:7-alpine
container_name: redis
ports: - "6379:6379"
volumes: - ./data:/data
command: redis-server --appendonly yesValkey 部署
services: valkey: image: valkey/valkey:8
container_name: valkey
ports: - "6379:6379"
volumes: - ./data:/data
command: valkey-server --appendonly yesRedis & Valkey 部署主要区别
| Redis | Valkey | |
|---|---|---|
| 镜像 | redis | valkey/valkey |
| 默认端口 | 6379 | 6379 |
| 协议 | RESP | RESP |
| 数据结构 | 一致 | 一致 |
| 客户端 | redis client | redis client |
Redis 客户端是否支持 Valkey?
从协议角度来看,大多数 Redis 客户端可以直接连接 Valkey。
因为客户端实际通信使用的是 Redis 协议(RESP),并不会判断服务端到底是 Redis 还是 Valkey。
例如 Python:
uv add redis代码:
from redis.asyncio import Redis
redis = Redis( host="127.0.0.1", port=6379)
await redis.set( "name", "kang")
value = await redis.get( "name")连接:
Redis:
redis://127.0.0.1:6379Valkey:
redis://127.0.0.1:6379无需修改。
但是需要注意:
客户端兼容,不代表依赖 Redis 的框架完全兼容。
例如:
- redis-py;
- redis-cli;
- Celery Redis Backend;
- Flask-Session;
这些组件虽然底层依赖 Redis 协议,但是部分实现会依赖 Redis 包名或者默认行为。
常见客户端兼容情况:
| 客户端/组件 | 是否支持 Valkey | 说明 |
|---|---|---|
| redis-py | ✅ 支持 | 使用 Redis 协议通信 |
| redis-cli | ✅ 支持 | RESP 协议兼容 |
| valkey-py | ✅ 支持 | Valkey 官方 Python 客户端 |
| Flask-Session | ⚠️ 需要调整 | 依赖 Redis 客户端实现 |
| Celery Redis Backend | ⚠️ 需要测试 | 依赖 Kombu Redis Backend |
| Django Redis Cache | ✅/⚠️ | 根据 backend 实现判断 |
| Redis Module | ⚠️ | 需要单独确认 |
Redis 命令是否完全兼容?
基础命令完全一致,例如:
SET user:name kang
GET user:name
LPUSH queue task1常用功能:
| 功能 | 兼容情况 |
|---|---|
| String | 支持 |
| Hash | 支持 |
| List | 支持 |
| Set | 支持 |
| ZSet | 支持 |
| Stream | 支持 |
| Pub/Sub | 支持 |
| 事务 | 支持 |
| Lua Script | 需要测试 |
Redis 可以 100% 平替 Valkey 吗?
对于缓存、Session、队列等基础场景,大部分情况下可以平替。
但是不能简单认为可以 100% 无差别替换/迁移。
Redis Module
例如:
- RedisJSON
- RedisSearch
- RedisTimeSeries
如果项目依赖:
Redis Module需要确认 Valkey 是否支持。
但是,像缓存、Session 存储、队列、锁、限流等场景,一般不存在问题。
Lua Script
Lua Script 大部分情况下兼容。
但是 Redis 7 引入的 Functions、
以及依赖 Redis 内部实现的脚本,需要单独验证。
集群模式
单节点迁移简单,但是,涉及到 Redis Cluster 需要确认:
- Slot 分布;
- 节点迁移;
- 客户端支持等。
ACL 权限
Redis 6 开始支持 ACL,例如:
ACL SETUSER app on >password ~cache:* +get +setRedis 和 Valkey 都支持 ACL。
但是,迁移时需要确认:
- 用户配置是否同步;
- 权限规则是否一致;
- 客户端认证方式是否兼容等。
Redis 和 Valkey 如何选择?
新项目
如果是个人项目,推荐考虑直接使用 Valkey。
原因:
- 开源协议明确;
- 社区维护;
- Redis 协议兼容。
已有 Redis 项目
不建议为了迁移而迁移。因为迁移收益较低,但成本:
- 测试成本;
- 运维成本;
- 生态验证成本等;
较高。
企业生产环境
建议优先考虑:生态成熟度、团队经验、云厂商支持,而不仅仅考虑 Redis VS Valkey。
数据是否可以直接迁移?
RDB 文件
例如,Redis:
dump.rdb通常可以迁移到 Valkey。
流程:
dump.rdb | ↓复制数据文件 | ↓Valkey启动AOF 文件
同理:
AOF 文件或持久化目录可以迁移。
但是生产环境建议:
不要直接覆盖数据目录。
应该:
- 新环境启动 Valkey;
- 导入数据;
- 验证数据;
- 切换流量。
主从复制迁移
对于不能停机的数据,可以考虑:
Redis ↓同步复制 ↓Valkey完成数据同步后,再切换业务连接。这种方式相比直接复制 RDB:
优点:
- 停机时间短;
- 数据一致性更好。
但是需要测试:
- 复制兼容性;
- 网络连通性;
- 数据同步状态。
版本兼容问题
由于 Valkey 基于 Redis 7.2.4 分叉发展,因此,Redis 6.x、Redis 7.0 等版本迁移时, 需要重点确认:
- 数据格式;
- 新特性支持;
- 客户端行为等。
建议迁移前确认 Redis 版本:
redis-server --version不要直接进行迁移。
生态兼容问题
Redis 与 Valkey 最大的区别,并不是命令兼容性,而是第三方生态兼容。
Redis 协议兼容解决的是:
客户端能不能连接。
但是实际项目中,还有大量组件依赖:
- Redis Python 包;
- Redis 默认导入路径;
- Redis 服务名称;
- Redis 类型判断;
- Redis 特定实现。
因此:
Redis 兼容 ≠ Redis 生态完全兼容。
例如:
Flask-Session 本身只需要一个兼容 Redis 协议的客户端对象。因此,
- 使用 redis-py 时,无需修改;
- 使用 valkey 官方客户端时,需要确认 Flask-Session 版本及 backend 支持情况。
传统配置:
SESSION_TYPE = "redis"
SESSION_REDIS = redis.Redis( host="localhost", port=6379)正常情况下依赖于:
import redis但是部分 Python 生态组件默认依赖 redis 包提供的客户端实现。
因此,当切换到 Valkey 官方客户端时, 可能需要额外调整兼容方式。
例如,原代码:
import redis
client = redis.Redis( host="localhost", port=6379)可以通过兼容方式调整为:
import valkey
client = valkey.Valkey( host="localhost", port=6379)项目需要同时安装
valkey和redis库。
uv add redis valkey当然,上述代码示例也可通过别的方法实现,本文旨在强调迁移时需要注意三方库支持问题。
常见问题
Valkey 可以直接替换 Redis 吗?
大部分场景完全可以。但是要考虑项目中使用的三方库是否兼容。
redis-py 可以连接 Valkey 吗?
可以。因为 redis-py 使用 Redis 协议通信。
使用 Valkey 需要更换客户端吗?
不需要。如果是 Python 项目,可以继续使用 redis-py 即可。
Redis 数据可以迁移到 Valkey 吗?
可以。 常见方式有:
- RDB;
- AOF;
- 主从复制迁移等。
但是生产环境需要完整测试。
Valkey 可以直接使用 redis-cli 吗?
可以。
因为 redis-cli 使用 Redis 协议。
Valkey 同样提供 valkey-cli 工具。
不过由于两者协议兼容,redis-cli 仍然可以正常连接 Valkey。
Redis 和 Valkey 可以混用吗?
可以。 例如:
应用 A 使用 Redis,应用 B 使用 Valkey。
两者都使用 Redis 协议通信。
但是不建议长期混合部署。
原因:
- 运维复杂;
- 排查问题困难;
- 版本差异增加。
Redis 数据目录可以直接给 Valkey 使用吗?
大部分情况下可以。
但是生产环境建议:
- 备份;
- 测试启动;
- 验证 key 数量。
总结
Redis 依靠多年生态积累,仍然是目前最成熟的缓存数据库方案。
Valkey 解决的是:
开源缓存数据库长期维护方向的问题,以及开源许可问题。
从技术角度:
Redis ≈ Valkey从生态角度:
Redis > Valkey从开源路线:
Redis < Valkey实际选择:
- 新项目,可以考虑 Valkey;
- 已有 Redis,无需强制迁移;
- 企业项目,应从多角度综合考虑,更应该关注生态和稳定性。
参考资料
- Redis 官方文档:介绍 Redis 数据结构、命令、客户端以及部署方式。
- Valkey 官方文档:介绍 Valkey 项目、安装部署以及兼容性说明。
- Redis Python Client 文档:介绍 Python Redis 客户端使用方式。
- Valkey GitHub Repository:介绍 Valkey 源码、版本发布以及社区维护情况。
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时





