Zademy

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

Databases
Redis
1677 字

内存数据库已成为现代架构中的核心构建模块:它们被用作缓存轻量级队列会话存储、时序引擎,甚至作为向量搜索的骨干。

2024 年 Redis 的许可证变更为两个强大的替代方案打开了大门:ValkeyDragonflyDB。两者都保持与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.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 经常成为主要候选者。
  • 云策略
    • 检查你的云提供商为每个引擎提供什么托管服务。
    • 评估总成本:实例、支持、存储和网络流量。

理解它们的隐喻

想象这些数据库是餐厅

  • Redis是一家有 15 年以上声誉的高级餐厅;它有最完整的菜单,每个人都知道它,但有时会排起长队,因为单一主厨(主线程)必须协调关键菜肴。
  • Valkey是由原厨师创建的合作社;他们使用非常相似的食谱,重新设计了厨房以提高效率,并承诺入口将保持免费和开放。
  • DragonflyDB是最新一代的工业厨房;它有多个独立的站点并行工作,设计为从单个建筑为整个城市提供服务而不流汗。

如果你从预算、用餐者数量(负载)服务类型(支持、开源、极致性能)的角度思考,选择 Redis、Valkey 和 DragonflyDB 就变得容易多了。