Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

darlinglele/bitcask

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

7 Commits

Repository files navigation

Bitcask简洁、优雅的key/value存储引擎

在关系数据库存储上,Btree一直是主角,但在某些情况下,log(n)的读写操作并不是总是让人满意。 Bitcask是一种连续写入很快速的Key/Value数据存储结构,读写操作的时间复杂度近似常量。

####Bitcask连续写入操作 Bitcask具有高效的连续写入操作,连续写操作类似向log文件追加记录,因此Bitcask也被称作是日志结构存储。

Bitcask将存储对象的key、value分别存储:

  • 在内存中对key创建索引
  • 磁盘文件存储value数据

当有数据需要写入时,磁盘无需遍历文件,直接写入到数据块或者文件的末尾,避免了磁盘机械查找的时间,写入磁盘之后,只需要在内存的HashMap中更新相应的索引,内存中用HashMap来保存一条记录的索引部分,一条索引包含的信息如下:

  • [Key: Jason, Filename: employee.db, Offset:0, Size:146, ModifiedDate:2343432312]

  • [Key: Bill, Filename: employee.db, Offset:146, Size:146, ModifiedDate:5489354345]

Key表示一条记录的主键,查找通过它在HashMap中找到完整索引信息 Filename是磁盘文件名字,通过它和Offset找到Value在磁盘的开始位置 Offset是Value在文件中偏移量,通过它和Size可以读取一条记录 Size是Value所占的磁盘大小,单位是Byte 假设目前数据库中已有上述两条的记录,当我要写入key为 "Jobs", value为: object的一条新记录时, 只需要在文件employee.db的末尾写入value=object,在HashMap中添加索引:[Key: Jobs, Filename: employee.db, Offset:292, Size:146, ModifiedDate:9489354343] 即可。

最后数据库就包含了三条索引信息:

  • [Key: Jason, Filename: employee.db, Offset:0, Size:146, ModifiedDate:2343432312]
  • [Key: Bill, Filename: employee.db, Offset:146, Size:150, ModifiedDate:5489354345]
  • [Key: Jobs, Filename: employee.db, Offset:294, Size:136, ModifiedDate:948965443]

####Bitcask随机读取操作

由于数据在内存当中使用HashMap作为索引,查找索引的时间为Hash查找的时间,近似常量。比如查找Bill,直接通过Key就可以找到它的索引信息,再根据索引信息,找到value在文件位置和大小,精确读取出bytes,反序列化成value对象。 当然在value存入文件时需要序列化内存对象成bytes。磁盘读取的过程的时间复杂度也是常量, 并不会随时数据的增大而增大。

####Bitcask 数据删除和更新 一条记录包含了索引和数据两个部分,删除索引容易,但要彻底的删除数据不是件容易的事情(参考磁盘空间整理)。对于更新数据,Bitcask通常采用的策略是append一条新数据,并更新已有的索引,至于旧数据则在清理数据的时候把它删除掉。

####Bitcask适合的场景

  • 适合连续写入,随机的读取,连续读取性能不如Btree;
  • 记录的key可以完全的载入内存;
  • value的大小比key大很多,否则意义不大;

About

简洁、优雅的key/value存储引擎

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

Contributors

AltStyle によって変換されたページ (->オリジナル) /