Zademy

Redis、Valkey 和 DragonflyDB:内存数据库现代指南

Databases
Redis
words 字

内存数据库现在几乎是每个后端架构的标配:缓存、轻量级队列、会话存储、时序数据、甚至向量搜索都在用。

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.0Valkey 9.0DragonflyDB
生态系统最成熟的生态系统,许多客户端和工具快速增长,与 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 往往是首选。

云策略方面,看看你的云厂商对每个引擎提供什么托管服务,算算总成本:实例、支持、存储和流量。