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)。这意味着 Redis 不再是OSI 批准的开源软件,你必须仔细审查在商业产品或托管服务中的使用。
Redis 在你需要以下情况时仍然是绝佳选择:
- 一个非常成熟的生态系统,几乎所有语言都有客户端;
- 官方企业支持;
- 广泛的高级模块(AI、搜索、JSON 等)。
Valkey:社区继承者和真正开源
Valkey作为最后一个 BSD 许可的 Redis 版本(7.2.4)的_分叉_创建。它由Linux Foundation支持,并得到 AWS 和 Google 等公司的支持。
其目标很明确:提供一个完全开源的 Redis 兼容引擎,保持命令和协议兼容性,同时改进内部数据结构。
- 真正的开源:它保持BSD 风格许可证,与 OSI 开源一致。
- 关键内存创新:它重新设计了内部哈希表,使其对 CPU 缓存更友好,每键值对减少约20 字节的内存使用。
- Valkey 9.0:引入了原子槽迁移,允许集群重新平衡比以前快9 倍,且客户端不会看到错误。
Valkey 在以下情况下特别有吸引力:
- 你来自 Redis 并希望近乎无缝的兼容性;
- 你的组织要求100% 开源软件;
- 你希望通过减少内存使用来优化云成本。
DragonflyDB:为云时代构建
DragonflyDB不是 Redis 的分叉。它是一个从零开始构建的新引擎,旨在充分利用现代多核硬件。
- 架构:它使用无共享设计,每个线程拥有自己的数据分片。这消除了全局锁和瓶颈,使单机上的激进垂直扩展成为可能。
- 内存效率:其"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 经常成为主要候选者。
- 云策略:
- 检查你的云提供商为每个引擎提供什么托管服务。
- 评估总成本:实例、支持、存储和网络流量。
理解它们的隐喻
想象这些数据库是餐厅:
- Redis是一家有 15 年以上声誉的高级餐厅;它有最完整的菜单,每个人都知道它,但有时会排起长队,因为单一主厨(主线程)必须协调关键菜肴。
- Valkey是由原厨师创建的合作社;他们使用非常相似的食谱,重新设计了厨房以提高效率,并承诺入口将保持免费和开放。
- DragonflyDB是最新一代的工业厨房;它有多个独立的站点并行工作,设计为从单个建筑为整个城市提供服务而不流汗。
如果你从预算、用餐者数量(负载)和服务类型(支持、开源、极致性能)的角度思考,选择 Redis、Valkey 和 DragonflyDB 就变得容易多了。