NoSql数据库:几款key-value数据库
redis
c语言实现
都知道redis是非常强大的内存数据库, 由于所有的数据都存储在内存中,其操作非常的快。但是由于内存比较昂贵,不可能把所有的数据都放到内存中,因此往往redis都用来做缓存。
这带来什么问题呢,缓存的有效性如何保证,在持久化存储的更新发生时,需要同步更新缓存,在高并发的情况下,很可能带来不一致性的问题。(当然得有一定的并发量)
如果redis可以把持久化存储的工作干了,是不是就不需要做同步更新了呢?来看下leveldb
leveldb
c++语言实现
leveldb是一款key-value NoSql数据库,基于内存的写入 + 基于内存和磁盘的读取,实现高效的Get Put操作
具体是如何工作的呢?
首先介绍下skiplist:
我们都知道linkedlist,linkedlist的查询/修改复杂度为O(n),对于linkedlist我们如何能实现类似于二分法,复杂度为O(log(n))的算法呢?
linkedlist是实现不了,其变异版本skiplist可以实现,欲了解详情自行百度,这里只是介绍下 它是一种能够实现高效查询和修改的类链表结构
leveldb的数据存储分为内存和磁盘,在内存中数据存储在2个skiplist,一个只读一个读写
数据在写入leveldb的时候数据,会写入wskiplist以及磁盘日志(类似于wal机制),在wskiplist达到一定大小,wskiplist变成新的rskiplist,老的rskiplist会被异步写入磁盘,生成sst文件(sorted string table)
生成新的wskiplist用于写入数据
在读取数据的时候,其顺序依次为wskiplist-> rskiplist -> sst文件
sst文件分层存储,从而每层文件个数不同,大小类似
rocksdb
基于leveldb开发,在leveldb代码的基础上进行优化,主要用于服务器嵌入式db的使用。我们平常使用db,是应用通过网络访问db中心,facebook为了减少这50微妙的网络延时而开发的优化的嵌入式db。改进点在于充分应用闪存的优势,利用多核服务器的特点,加快db的存取。其工作原理和leveldb类似。
Cassandra
java语言实现
来自 Apache 的分布式数据库,理论依据:Amazon Dynamo和Google Big Table论文
数据模型类似于hbase,是rowkey-列族-列 结构
单节点的读写原理跟leveldb类似,跟rocks不同的是,其只是原理类似,不是基于leveldb实现
也就是说Cassandra 类似于 leveldb集群。集群中的节点通过gossip协议协调,数据通过在节点间的冗余存储实现节点故障容忍。
hbase
java语言实现
来自于Apache的分布式数据库,理论依据:Google Big Table论文
hbase跟cassandra类似都是分布式数据库,数据模型也都是rowkey-列族-列,不过Cassandra采用gossip协议实现集群内通信和协调,较为负载,hbase采用zk作为集群信息协调,实现较为简单。并且提供强一致性。
其使用范围比Cassandra更广,在国内外更多的公司采用hbase
相关文章