https://zhuanlan.zhihu.com/p/499313638

Redis作为NoSQL领域的代表,拥有很高的读写性能,支持比较丰富的数据类型,但是Redis也存在一些缺陷。

  • l 内存数据库,容量有限,成本很高
  • l 主从复制模型,存在数据丢失的风险
  • l 自身备份代价很大
  • l 集群模式存在很多的限制
  • l Redis支持事务,但是并不完全满足ACID

业务要求的KV存储需要满足以下条件:

  • l 兼容Redis通信协议
  • l 分布式持久化存储(数据不能丢失)
  • l 单个存储节点的宕机,不影响整个系统的正常运转(或者可以基于备份自动恢复)
  • l 集群扩容方便,对用户透明
  • l 相对于Redis,性能损失(延迟,吞吐量 ...等)要在可接受范围内
  • l 对于监控、命名空间 ... 提供更好的支持

下面根据网络上的资料,简单整理一下目前比较流行的KV系统

Redis

  • l 内存数据库,容量有限,成本较高
  • l 主从复制模型,不能保证数据强一致
  • l 数据持久化代价很大,对性能影响很大
  • l 有官方和非官方的分布式方案,其中官方集群版本很少听说大规模生产使用
  • l Redis支持事务,但是不满足ACID

HBASE

  • l 支持单行事务
  • l 依赖HDFS,ZK部署运维复杂
  • l 读写延迟比较大
  • l 需要自己实现兼容Redis协议的proxy
  • l 支持数据强一致
  • l 不支持Key级别的TTL

Cassandra

  • l Dynamo的开源实现
  • l 支持最终一致性(AP系统)
  • l 分片规则是hash,对scan不友好
  • l CQL查询语言
  • l 无中心化设计,部署简单
  • l 需要自己实现Redis协议的proxy
  • l Java语言开发
  • l 资料不多

Tair

  • l 客户端支持不够友好,业务需要改造,对开发语言有要求
  • l 不能保证数据强一致性
  • l 支持多种存储引擎

Zeppelin

  • l 360开源的分布式KV存储数据库
  • l 数据采用key space 划分partition,大分片策略
  • l 支持有限的API:Set,Get,Delete
  • l 支持TTL
  • l 支持HashTag,以及HashTag的batch提交原子性
  • l 元数据保证强一致性,数据采用主从复制
  • l 开源关注度很低(star 359),未见社区应用案例

Pika

  • l 单机版的兼容Redis协议的持久化存储引擎
  • l 没有集群方案

SSDB

  • l 底层存储引擎采用leveldb单机引擎,实现zset、map、queue数据结构
  • l 基于master-slave复制、
  • l 全量复制和flush操作速度慢
  • l 本身无集群化方案,类似于redis2.8
  • l 主从复制效率低,全局锁竞争严重
  • l 数据结构的一些操作效率低,很多操作基于遍历
  • l c++实现

LedisDB

  • l Golang实现
  • l 底层引擎采用可替换引擎,leveldb、rocksdb、goleveldb等,实现kv、list、set、zset、hash等数据结构
  • l 采用leveldb或rocksdb会存在cgo性能损失
  • l 基于master-slave复制
  • l 采用类似codis的集群化方案xcodis
  • l 未经线上多规模验证

SwapDB

  • l 深度定制的redis和优化过的ssdb整合
  • l 京东金融开源
  • l 高度兼容redis api
  • l 冷热数据分离,热数据在redis,冷数据存储到ssdb
  • l 可以实现原生的redis cluster集群
  • l 无数据可靠性保证,定位还是缓存
  • l 开源后没看到社区应用案例

Tidis

  • l golang实现
  • l 目前状态为demo实现,还处于功能开发阶段,仅供测试
  • l 实现采用分布式key value引擎TiKV, 可以对比FoundationDB
  • l Tidis类似TiDB层,无状态
  • l 采用存储计算分离架构
  • l 无限水平扩展
  • l 自动数据均衡
  • l Raft副本复制,确保数据不丢
  • l TiKV采用rust语言,底层引擎为rocksdb
  • l 支持分布式事务
  • l 事务采用乐观锁,事务提交冲突可配重试次数
  • l 事务是完全的2PC分布式事务,因为采用TSO时钟,性能较差,延迟比较高

Anna

  • l 伯克利开源的号称最快的KV存储引擎,性能是Redis的10倍
  • l 充分利用了多核架构,尽量避免线程切换,绑定CPU
  • l 针对热点数据有非常好的优化
  • l 没有经过生产检验,偏学术

Masstree

  • l 单机KV系统
  • l 字典树+Btree的组合数据结构
  • l 充分利用CPU cache line
  • l 没有经过生产检验,存在不少的bug,偏学术研究

GMKV

  • l 资料很少,TiKV+proxy,支持Redis协议
  • l 类似Tidis,未开源

DCache

  • l 腾讯开源的分布式缓存
  • l 支持持久化,cache和磁盘的一致性对用户透明
  • l API简单,支持简单的KV接口
  • l 部署比较复杂,组件比较多,运维成本高,依赖ETCD,TARS中间件以及持久化数据库

Aerospike

Aerospike是一个高性能、可扩展、可靠性强的NoSQL解决方案,支持RAM和SSD作为存储介质,并专门针对SSD特殊优化,广泛应用于实时竞价等实时计算领域。官方保证99%的操作在1ms内完成,并提供集群数据自动Rebalance、集群感知客户端等功能,且支持超大规模数据集(100T级别)的存储。

  • l 跟Redis比较亲和,支持String,Hash,Set,ZSet
  • l 支持分布式集群,可以自动负载均衡
  • l 磁盘存储,绕过文件系统,读写性能很高
  • | 限制比较多,比如一个namespace下的set数量,set中的成员数量。
  • | 只支持行级事务,不支持分布式事务
  • | 查询支持限制比较多

ArangoDB

  • | 支持Multi-Model :KV、Document、Graph、AQL
  • | 数据组织形式:database → collection → document
  • | 底层引擎支持MMFiles和RocksDB,前者是mmap实现锁粒度比较粗。
  • | 支持的索引:Primary、Edge、Hash、Skiplist、Persistent、Geo、Fulltext (文档中的_id、_key、_from、_to字段建立索引)
  • | 支持完整的ACID和snapshot isolation。

SequoiaDB

  • | 支持Multi-Model:支持SQL、API、Json、对象存储
  • | BSON作为记录的存储结构
  • | 数据逻辑组织形式:collection space → collection → doc (bson)
  • | 数据物理组织形式:file (data / index) → extent → page (存放doc)
  • | 引擎级复制,支持灾备
  • | 支持多租户

[转帖]KV数据库调研的更多相关文章

  1. 选择KV数据库最重要的是什么

    本文分享自华为云社区<选择KV数据库最重要的是什么?>,作者:GaussDB 数据库 . 经常有客户提到KV数据库,但却偏偏"不要Redis".比如有个做安全威胁分析平 ...

  2. 从零开始山寨Caffe·柒:KV数据库

    你说你会关系数据库?你说你会Hadoop? 忘掉它们吧,我们既不需要网络支持,也不需要复杂关系模式,只要读写够快就行.    ——论数据存储的本质 浅析数据库技术 内存数据库——STL的map容器 关 ...

  3. 后端程序员之路 8、一种内存kv数据库的实现

    键值(Key-Value)存储数据库,这是一种NoSQL(非关系型数据库)模型,其数据按照键值对的形式进行组织.索引和存储.KV存储非常适合不涉及过多数据关系业务关系的业务数据,同时能有效减少读写磁盘 ...

  4. 【万字长文】使用 LSM Tree 思想实现一个 KV 数据库

    目录 设计思路 何为 LSM-Treee 参考资料 整体结构 内存表 WAL SSTable 的结构 SSTable 元素和索引的结构 SSTable Tree 内存中的 SSTable 数据查找过程 ...

  5. 【万字长文】使用 LSM-Tree 思想基于.Net 6.0 C# 实现 KV 数据库(案例版)

    文章有点长,耐心看完应该可以懂实际原理到底是啥子. 这是一个KV数据库的C#实现,目前用.NET 6.0实现的,目前算是属于雏形,骨架都已经完备,毕竟刚完工不到一星期. 当然,这个其实也算是NoSQL ...

  6. 计算机程序的思维逻辑 (60) - 随机读写文件及其应用 - 实现一个简单的KV数据库

    57节介绍了字节流, 58节介绍了字符流,它们都是以流的方式读写文件,流的方式有几个限制: 要么读,要么写,不能同时读和写 不能随机读写,只能从头读到尾,且不能重复读,虽然通过缓冲可以实现部分重读,但 ...

  7. Aerospike-内存和硬盘混合存储的kv数据库

    为什么会有Aerospike? Redis是一个纯内存型数据库,性能上没有多大问题. 但这又带来一个新问题,内存是很贵的,所以全内存的存储成本非常昂贵.为了节省成本,我们需要把一部分不经常用到的数据存 ...

  8. 时间序列数据库调研之InfluxDB

    基于 Go 语言开发,社区非常活跃,项目更新速度很快,日新月异,关注度高 测试版本 1.0.0_beta2-1 安装部署 wget https://dl.influxdata.com/influxdb ...

  9. Java编程的逻辑 (60) - 随机读写文件及其应用 - 实现一个简单的KV数据库

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  10. redis k-v数据库、高速缓存、消息队列代理

    Redis 简介   Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的 ...

随机推荐

  1. Redis 事务管理

    Redis 提供了五个指令用于处理事务:MULTI.EXEC.DISCARD.WATCH.UNWATCH,这五个命令是 Redis 进行事务处理的基础. 这些指令允许一组命令在一个步骤中执行,其中有两 ...

  2. 在ASP.NET Core微服务架构下使用RabbitMQ如何实现CQRS模式

    前言 在现代软件开发中,微服务架构和CQRS模式都是备受关注的技术趋势.微服务架构通过将应用程序拆分为一系列小型.自治的服务,提供了更好的可伸缩性和灵活性.而CQRS模式则通过将读操作和写操作分离,优 ...

  3. JavaImprove--Lesson03--String的工具类,Math,Runtime,BigDecimal,Date

    一String的工具类 String的作为字符串对象,也是使用最多的数据类型对象 所以难免有很多操作,字符串的常见操作包括:字符串拼接,字符串反转,字符串长度,字符串转换等 直接使用String类型来 ...

  4. Cesium案例解析(八)——CesiumWidget简化窗体

    目录 1. 正文 2. 参考 1. 正文 Cesium Widget这个案例展示了一个Cesium的简化窗体.在之前的案例中使用的都是Cesium.Viewer这个窗体组件,包含了非常丰富的组件内容. ...

  5. 这场世界级的攻坚考验,华为云GaussDB稳过

    摘要:实践证明,华为云GaussDB完全经受住了这场世界级的攻坚考验,也完全具备支撑大型一体机系统迁移上云的能力,并积累了丰富的经验. 本文分享自华为云社区<这场世界级的攻坚考验,华为云Gaus ...

  6. 昇腾实战丨DVPP媒体数据处理图片解码问题案例

    摘要:本期就分享几个关于DVPP图片解码问题的典型案例,并给出原因分析及解决方法. 本文分享自华为云社区<DVPP媒体数据处理图片解码问题案例>,作者:昇腾CANN . DVPP(Digi ...

  7. 如何做好分支管理,保证高效CI/CD?

    摘要:一文讲述git分支管理策略. 本文分享自华为云社区<如何做好分支管理,保证高效CICD?>,作者:华为云PaaS服务小智. 引言 CI/CD是DevOps 的基础核心,做好CI/CD ...

  8. 摆平各类目标检测识别AI应用,有它就够了!

    摘要:在计算机视觉领域,CANN最新开源的通用目标检测与识别样例,通过其强大的可定制.可扩展性,为AI开发者们提供了良好编程选择. 本文分享自华为云社区<摆平各类目标检测识别AI应用,有它就够了 ...

  9. Spring Boot Admin 自定义健康检查

    添加自定义类: /** * 监控接口的健康情况 * */ @Component public class ApiHealthIndicator implements HealthIndicator { ...

  10. Mybatis 模块拆份带来的 Mapper 扫描问题

    项目中,两个模块中都放了 Mapper,如下所示 @MapperScan(basePackages ={"com.vipsoft.his.mapper","com.vip ...