-
Notifications
You must be signed in to change notification settings - Fork 13
db_010
KV存储的基本接口是put, get和remove,很多KV存储支持scans操作(两个输入:upper bound和lower bound)。
levelDB是一个KV存储,基于LSMT(Log-Structured Merge Tree)结构。
LSM主要优化磁盘写,分两层(tier),内存层(memory component)和磁盘层(disk component),内存层主要用来作cache和buffer,put和delete这两种update操作在这里进行并迅速返回。磁盘层有分为很多层(level),每个level中有1个或多个文件,如果要求严格,改内存层之前,可以先将所有更改写到磁盘的commit-log中。
LSM的关键操作是compaction,一个后台的操作,一个或者多个专用的线程进行,内存中的memory component达到一定的阈值,会被merge到disk中。compaction分两步:1)把暂时不可更改的memory component写到disk;2)重新组织磁盘上的结构,将文件移动、merge到合适的levels。
在内存层中,可以用顺序的skiplist或者乱序的hash table,顺序skiplist需要在插入操作时用log时间进行排序,但是scan操作和compaction操作会比较快。用乱序hash table,插入是常数时间,但是scan会很慢,在compaction时会进行全部的重排序再写磁盘,所以时间比较长。
- rocksDB 有个Persistent Read Cache https://github.com/facebook/rocksdb/wiki/Persistent-Read-Cache
...
相对LevelDB 和 RocksDB两种“嵌入式”的数据库,Redis 和 memcached虽然也是KV存储,但是是server形式,远程访问(给出IP和端口)。[2]
[1] O. Balmau, R. Guerraoui, V. Trigonakis, and I. Zablotchi, “FloDB : Unlocking Memory in Persistent Key-Value Stores,” EuroSys ’17, 2017.
[2] How does Leveldb compare with Redis or Riak or Tokyo Tyrant?, https://stackoverflow.com/questions/6101402/how-does-leveldb-compare-with-redis-or-riak-or-tokyo-tyrant
[3] Getting Started with RocksDB in CentOS 7, https://blog.jeffli.me/blog/2016/12/02/getting-started-with-rocksdb-in-centos-7/
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
Wiki: wiki.jcix.top ~聚沙成塔~ Blog: blog.jcix.top