mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
2457 字
7 分钟
Redis VS Valkey:区别、兼容性、迁移方案与生产选型实践

为什么要考虑 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 的区别并不大。

两者之间最大的差异并不在:

  • 数据结构;
  • 网络协议;
  • 基础命令;

而在于:

  • 生态;
  • 商业支持;
  • 周边工具兼容等方面。
对比项RedisValkey
项目来源原 Redis 项目Redis 7.2 分叉项目
开源协议RSALv2 / SSPL(不同版本有所变化)BSD-3-Clause
通信协议RESPRESP
默认端口63796379
数据结构String、Hash、List、Set、ZSet 等基本一致
Redis 命令支持高度兼容
Redis 客户端支持大部分支持
Docker 镜像redisvalkey/valkey
持久化方式RDB / AOFRDB / 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 yes

Valkey 部署#

services:
valkey:
image: valkey/valkey:8
container_name: valkey
ports:
- "6379:6379"
volumes:
- ./data:/data
command: valkey-server --appendonly yes

Redis & Valkey 部署主要区别#

RedisValkey
镜像redisvalkey/valkey
默认端口63796379
协议RESPRESP
数据结构一致一致
客户端redis clientredis 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:6379

Valkey:

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 +set

Redis 和 Valkey 都支持 ACL。

但是,迁移时需要确认:

  • 用户配置是否同步;
  • 权限规则是否一致;
  • 客户端认证方式是否兼容等。

Redis 和 Valkey 如何选择?#

新项目#

如果是个人项目,推荐考虑直接使用 Valkey。

原因:

  • 开源协议明确;
  • 社区维护;
  • Redis 协议兼容。

已有 Redis 项目#

不建议为了迁移而迁移。因为迁移收益较低,但成本:

  • 测试成本;
  • 运维成本;
  • 生态验证成本等;

较高。

企业生产环境#

建议优先考虑:生态成熟度、团队经验、云厂商支持,而不仅仅考虑 Redis VS Valkey。

数据是否可以直接迁移?#

RDB 文件#

例如,Redis:

dump.rdb

通常可以迁移到 Valkey。

流程:

dump.rdb
|
复制数据文件
|
Valkey启动

AOF 文件#

同理:

AOF 文件或持久化目录

可以迁移。

但是生产环境建议:

不要直接覆盖数据目录。

应该:

  1. 新环境启动 Valkey;
  2. 导入数据;
  3. 验证数据;
  4. 切换流量。

主从复制迁移#

对于不能停机的数据,可以考虑:

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
)

项目需要同时安装 valkeyredis 库。

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,无需强制迁移;
  • 企业项目,应从多角度综合考虑,更应该关注生态和稳定性。

参考资料#

  1. Redis 官方文档:介绍 Redis 数据结构、命令、客户端以及部署方式。
  2. Valkey 官方文档:介绍 Valkey 项目、安装部署以及兼容性说明。
  3. Redis Python Client 文档:介绍 Python Redis 客户端使用方式。
  4. Valkey GitHub Repository:介绍 Valkey 源码、版本发布以及社区维护情况。
分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Redis VS Valkey:区别、兼容性、迁移方案与生产选型实践
https://www.pyart.cn/posts/redis-vs-valkey/
作者
kang
发布于
2026-08-03
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录