在 DB-Engines 上挑选了五个 开源的 key-value 数据库,一起来看看吧。
图片
1. Redis
图片
Redis is an in-memory database that persists on disk. The data model is key-value, but many different kind of values are supported: Strings, Lists, Sets, Sorted Sets, Hashes, Streams, HyperLogLogs, Bitmaps.
Redis是一个存储在磁盘上的内存数据库。数据模型是键-值,但支持许多不同类型的值:字符串、列表、集合、排序集、哈希、流、HyperLogLogs、位图。
2009 年发行,C 语言编写。
特点
- 提供多种数据结构:字符串、哈希、列表、集合、有序集合等
- 支持Lua脚本,事务,发布/订阅(pub/sub)模式,可持久化
- 高可用性和分布式功能(通过Redis Sentinel和Redis Cluster)
优点
- 数据结构丰富,读写性能高
- 社区活跃,生态系统丰富
- 灵活的持久化策略
- 支持复杂操作和事务
缺点
- 主要基于内存,存储大量数据时成本较高
- 单线程模型在CPU密集型任务下可能是瓶颈
- 比如 时间复杂度 O(n) 的命令 操作大 Key :LRANGE,SORT,HGETALL 等
- 复杂 Lua 脚本
使用场景
- 缓存系统
- 实时分析和统计
- 会话存储
- 排行榜
2. Memcached
图片
Free & open source, high-performance, distributed memory object caching system, generic in nature, but intended for use in speeding up dynamic web applications by alleviating database load.
免费开源、高性能、分布式内存对象缓存系统,本质上是通用的,但旨在通过减轻数据库负载来加速动态 Web 应用程序。
2003 年发行,C 语言编写。
特点
- 内存缓存系统,不支持持久化
- 分布式设计,支持集群
优点
- 极简设计,极高的性能
- 易于部署和使用,扩展性好,可以轻松横向扩展
缺点
- 只支持字符串类型的key-value存储
- 不支持持久化,数据在重启后会丢失
- 功能较少,不支持复杂操作
使用场景
- Web应用的缓存
- 数据库查询结果缓存
- 会话存储
3. etcd
图片
Distributed reliable key-value store for the most critical data of a distributed system
可靠的分布式键值存储,用于存储分布式系统中最关键的数据
2013 年发行,GO 语言编写。
特点
- 分布式键值存储
- 使用 Raft 算法保证强一致性
- 支持复杂的数据查询
- 接口简单,可以用 HTTP 操作
优点
- 强一致性和高可用性
- 易于与Kubernetes等容器编排工具集成
- 适用于分布式系统的配置管理和服务发现
缺点
- 写入性能相对较低(Benchmarked at 1000s of writes/s per instance)
- 数据存储限制:一般建议每个键值对的大小保持在较小的范围内(通常小于 1 MB),并且总的数据量不应超过几个 GB。
使用场景
- 分布式系统的配置管理
- 服务注册与发现
- 分布式锁
- leader 选举
4. Hazelcast
图片
Hazelcast is a unified real-time data platform combining stream processing with a fast data store, allowing customers to act instantly on data-in-motion for real-time insights.
Hazelcast是一个统一的实时数据平台,将流处理与快速数据存储相结合,允许客户立即对动态数据采取行动,以获得实时见解。
Hazelcast 最初发布于 2008 年,用 Java 编写。
使用场景
- 对流数据或静态数据进行状态数据处理
- 直接使用SQL查询流式和批量数据源
- 通过连接器库提取数据并使用低延迟 SQL 查询提供数据
- 根据事件推送更新到应用程序
- 基于低延迟队列或发布-订阅消息传递
- 通过读/写和后写等缓存模式快速访问上下文和事务数据
- 微服务的分布式协调
- 将数据从一个区域复制到另一个区域或同一区域的数据中心之间
看了官网和 Github 的介绍后,可以发现它不仅提供分布式数据存储,更是一个分布式数据平台,支持更广泛的用例,包括缓存、数据处理、事件流处理和并发计算等。
它支持的 分布式数据结构 非常丰富,第一个就是 Map,还有 AP,CP 之分。
图片
文档:https://docs.hazelcast.com/hazelcast/latest/data-structures/distributed-data-structures
5. Ehcache
图片
Ehcache is an open source, standards-based cache that boosts performance, offloads your database, and simplifies scalability. It's the most widely-used Java-based cache because it's robust, proven, full-featured, and integrates with other popular libraries and frameworks. Ehcache scales from in-process caching, all the way to mixed in-process/out-of-process deployments with terabyte-sized caches.
Ehcache是一个开源的,基于标准的缓存,可以提高性能,卸载数据库,简化可伸缩性。
它是使用最广泛的基于java的缓存,因为它是健壮的、经过验证的、功能齐全的,并且可以与其他流行的库和框架集成。
Ehcache可以从进程内缓存扩展到使用 tb级缓存的进程内/进程外混合部署。
2009年发行,Java 语言编写。
特点
- Java内存缓存库
- 支持本地和分布式缓存
- 支持多级缓存(内存和磁盘)
- 可与Spring等框架集成
优点
- 易于集成到Java应用中
- 支持持久化和多级缓存
- 配置灵活,适应多种使用场景
缺点
- 主要针对Java生态系统,其他语言支持较弱
- 分布式功能相对较弱
使用场景
- Web应用的页面缓存
- 数据库结果缓存
总结
- Redis 适用于需要丰富数据结构、高性能读写、发布/订阅功能的场景,适合实时数据处理和复杂缓存需求。
- Memcached 适用于简单、高速缓存需求的场景,适合简单的键值对存储,不适合需要持久化或复杂数据结构的场景。
- etcd 适用于分布式系统的协调、配置管理和服务发现,适合需要强一致性的小数据量存储。
- Hazelcast 适用于需要分布式缓存和计算的场景,适合需要在内存中处理大规模数据并进行复杂计算的应用。
- Ehcache 适用于 Java 应用的本地和分布式缓存需求,适合需要与 Java 框架深度集成的场景。