在 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 框架深度集成的场景。