Redis、Valkey 和 DragonflyDB:内存数据库现代指南
内存数据库现在几乎是每个后端架构的标配:缓存、轻量级队列、会话存储、时序数据、甚至向量搜索都在用。
2024 年 Redis 改了许可证,一下把两个替代方案推到了台前:Valkey 和 DragonflyDB。两者都兼容 Redis 协议,但在性能、许可证和硬件利用上走了不同的路。
这篇聊聊它们的核心区别,以及怎么在 Spring Boot 项目里用它们。代码层面几乎不用改。
Redis:行业标准
十几年了,Redis 一直是内存数据库的事实标准。从个人小项目到高流量平台,到处都有它。
核心数据处理引擎仍然是单线程的,保证操作简单和原子性。不过最近几个版本引入了后台线程和 I/O 线程来处理阻塞型工作。
Redis 8.0 把以前 "Redis Stack" 里的东西内置了:JSON 支持、时序、向量搜索(Vector Sets)。许可证改成了三选一模型(RSALv2、SSPLv1 或 AGPLv3),不再是 OSI 认可的开源软件了。在商业产品或托管服务里用它,你得仔细审许可证。
Redis 依然是最稳的选择当你需要:一个非常成熟的生态系统(几乎所有语言都有像样的客户端)、官方企业支持、广泛的高级模块(AI、搜索、JSON 等)。
Valkey:社区继承者,真正的开源
Valkey 从最后一个 BSD 许可的 Redis 版本(7.2.4)分叉出来,由 Linux Foundation 托管,AWS 和 Google 都在背后支持。
目标很直接:提供一个完全开源的 Redis 兼容引擎,命令和协议保持兼容,同时改进内部数据结构。
它保持 BSD 风格许可证,符合 OSI 开源定义。内部哈希表重新设计过,对 CPU 缓存更友好,每个键值对大约省 20 字节内存。Valkey 9.0 引入了原子槽迁移,集群 rebalance 比以前快 9 倍,客户端不会看到错误。
Valkey 特别值得考虑的场景:你从 Redis 迁过来想要近乎无缝的兼容性、组织要求 100% 开源软件、你想通过省内存来降低云成本。
DragonflyDB:为云时代重写
DragonflyDB 不是 Redis 的分叉。它从零开始写,目标只有一个:充分利用现代多核硬件。
它用无共享(share-nothing)设计,每个线程拥有自己的数据分片。没有全局锁,没有瓶颈,单机上做激进的垂直扩展成为可能。内部数据结构叫 "Dashtable",根据你的键模式可以比传统 Redis 省 30% 到 60% 内存。在不少场景下性能报告比经典 Redis 快 25 倍,尤其是高读写负载。许可证是 BSL(Business Source License),很多场景可以免费用,但不是 OSI 认可的开源,对竞争性服务有限制。
DragonflyDB 适合的场面:你在管 TB 级的内存数据、单节点需要每秒数百万次操作、想减少处理峰值负载所需的实例数量。
实用比较
| 功能 | Redis 8.0 | Valkey 9.0 | DragonflyDB |
|---|---|---|---|
| 生态系统 | 最成熟的生态系统,许多客户端和工具 | 快速增长,与 Redis 工具高度兼容 | 较年轻,专注于高性能用例 |
| 许可证 | RSALv2、SSPLv1 或 AGPLv3(非 OSI) | BSD,真正的开源 | BSL,有限制的免费 |
| 线程模型 | 单线程核心 + 多线程 I/O | 改进的异步 I/O 的单线程核心 | 真正的多线程,无共享设计 |
| 典型用例 | 需要企业支持和高级模块的关键应用 | 开源和成本优化重要的 Redis 迁移 | 单节点上的大规模工作负载(TB 数据,每秒数百万次操作) |
| 内存使用 | 高效但受原始设计限制 | 每键值对节省约 20 字节 | 许多场景下比 Redis 节省 30–60% |
Spring Boot 集成
三个引擎都用 Redis 协议,所以从 Spring Boot 的角度看,集成方式几乎一模一样。
pom.xml 里加标准依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>application.properties(或 application.yml)指向正确的主机就行:
# Redis、Valkey 和 DragonflyDB 都同样适用
spring.data.redis.host=localhost
spring.data.redis.port=6379一个简单的缓存服务,三个引擎跑起来代码完全一样:
@Service
public class CacheService {
@Autowired
private StringRedisTemplate redisTemplate;
public void saveData(String key, String value) {
// Redis、Valkey 和 DragonflyDB 中的原子操作
redisTemplate.opsForValue().set(key, value);
}
}只要你的客户端说 Redis 协议,从 Redis 切到 Valkey 或 DragonflyDB 基本就是改个 URL,再调调部署参数(内存、CPU、持久化之类的)。
如何为你的项目选择
实用的决策方式是沿几个轴来想。
许可证方面,如果组织要求 OSI 认可的开源,Valkey 是自然选择。如果你已经跟 Redis 有商业协议或支持合同,继续用 Redis 更省事。如果你要极致性能且能接受 BSL,DragonflyDB 很有吸引力。
负载方面,中等负载下 Redis 绰绰有余。如果内存每 GB 成本是关键指标,Valkey 和 DragonflyDB 都能帮你压账单。单节点上的极端负载,DragonflyDB 往往是首选。
云策略方面,看看你的云厂商对每个引擎提供什么托管服务,算算总成本:实例、支持、存储和流量。