在关系数据库存储上,Btree一直是主角,但在读写性能要求更高的场景下,log(n)的读写操作并不是总是让人满意。 Bitcask是一种连续写入很快速的Key/Value数据存储结构,读写操作的时间复杂度均为常量。它是怎么做到的呢?
BitCash连续写入操作
Bitcask具有高效的连续写入操作,连续写操作类似向log文件追加记录,因此Bitcash也叫Log结构存储。
BitCash中一个记录由两部分组成:
- 内存中的HashMap用来保存索引索引
- 磁盘文件存储数据
当有数据需要写入时,磁盘无需遍历文件,直接写入到数据块或者文件的末尾,避免了磁盘机械查找的时间,写入磁盘之后,只需要在内存的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]
BitCash随机读取操作
由于数据在内存当中使用HashMap作为索引,查找索引的时间为常量,比如查找 Bill,直接通过Key就可以找到它的索引信息,再根据索引信息,找到value在文件位置和大小,精确读取出bytes,反序列化成value对象。 当然在value存入文件时需要序列化内存对象成bytes。磁盘读取的过程的时间复杂度也是常量, 并不会随时数据的增大而增大。
BitCash 数据删除和更新
一条记录包含了索引和数据两个部分,删除索引容易,但要彻底的删除数据不是件容易的事情(不讨论,参考磁盘空间整理)。对于更新数据,Bitcash通常采用的策略是append一条新数据,并更新已有的索引,至于旧数据则在清理数据的时候把它删除掉。
BitCash适合的场景
- 适合连续写入,随机的读取,连续读取性能不如Btree
- 记录的key可以完全的载入内存
- value的大小比key大很多,否则意义不大
- key/value存储结构
BitCash Java 实现
相关推荐
bitcask, 因为你需要另一个密钥/值存储引擎 Bitcask - 用于快速键/值数据的日志结构哈希表 Bitcask使用了"rebar"构建系统,但是我们提供了一个包装文件,以便在顶层运行"制作"。Bitcask需要 Erlang R14B04或者更高...
最终成果是一个能够出色达成前述所有目标的存储系统——Bitcask。尽管最初是为了Riak而开发,但Bitcask的设计具有通用性,可作为其他应用的本地键值存储选择。 Bitcask的核心模型非常简洁。一个Bitcask实例实际上...
RoseDB 是一款高效且可靠的键值(KV)存储引擎,其设计灵感来源于 Bitcask 存储模型。Bitcask 模型是日志结构化存储的一种体现,它在数据库领域中被广泛应用,因其简单性、高效性和易扩展性而备受青睐。RoseDB 在这...
木桶 用编写的高性能键/值存储,具有可预测的读/写性能和高吞吐量。 使用类似于的磁盘布局(LSM + WAL) 对于功能更完备的Redis兼容服务器,分布式键/值存储可以查看 ,它使用该库作为后端。 使用作为起点,或者如果...
基于Bitcask的磁盘存储 命令支持筏 与现有的Redis客户端兼容 用法 $ go get github.com/prologic/bitraft $ bitraft 码头工人 您还可以使用: $ docker pull prologic/bitraft $ docker run -d -p 4920:4920 pro...
HashMap由于Key的尺寸可变所以需要自己实现一个内存索引结构,即HashMap结构为<key, value>key为主键value为在磁盘中的位置等信息版本号在磁盘中的位置。 Hash存储引擎的设计目标概要还包括对文件结构的设计,数据...
Bitcask 是用于快速键/值数据的日志结构哈希表。 Bitcask 的注意事项 我选择将 Bitcask 源代码包含在库中,而不是要求将包装库作为依赖项的常用方法。 这将大大简化获取和编译库。 从不利的方面来说,这意味着更新...
bitcask用Go编写的高性能键/值存储,具有可预测的读/写性能和高吞吐量。 使用类似于Riak的Bitcask磁盘布局(LSM + WAL)获得功能更完善的Redis兼容的bitcask用Go编写的高性能键/值存储,具有可预测的读/写性能和高...
采用Bitcask存储模型 顺序写,随机读 采用变长编码,大大节约内存空间,抛弃了论文中的TimeStamp 支持多线程 Benchmark key int 类型 4个字节 value 1--2000个长度的随机字符串 put 1000000 ,cost 45.656 ms remove ...
受到1980年代和1990年代开发的日志结构文件系统的启发,Riak团队重新审视了一些旧有的技术,并在此基础上开发了Bitcask——一个能够很好地满足上述所有设计目标的存储系统。 ##### 基本模型 Bitcask的核心概念非常...
比特桶文件数据库的FUSE文件系统。 受启发。入门安装bitcaskfs : go get github.com/prologic/bitcaskfs挂载一个 Bitcask 数据库: bitcaskfs -p /path/to/db /path/to/mount执照bitcaskfs根据条款获得
该项目是一个基于_Bitcask_存储模型的_KV_数据库。Bitcask_是一种高性能的持久化存储_-Bitcask-KV-
python-bitcask 启发KV商店的Python实现。 密钥存储在内存中的哈希表(Python字典)中。 每个键都映射到一个条目,该条目指示在一次搜索中可以在磁盘上找到该值的位置。 免责声明:不适用于生产。 在设计数据密集...
它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go...
版本: 0.2.1 rkvs 是一个简单的 Key-Value 数据库接口。 它目前为以下 K/V 存储提供前端:ets、leveldb、rocksdb、hanoidb、bitcask。使用示例启用后端要启用后端之一,请将以下行之一添加到您的钢筋或使 ERL_LIBS...
- **Bitcask存储引擎**:BeansDB使用Bitcask作为其底层存储引擎,该引擎具有日志结构和全内存索引的特点,保证了数据存储的简单、可靠和高效。 - **多目录结构**:为了便于数据的迁移和恢复,以及提高并发性,...
FreshDB 是一款基于 Bitcask 模式的轻量级键值数据库,专为高效、快速的数据存储和检索设计。在IT行业中,键值数据库因其简单的数据模型和高性能特性,常被用于缓存、日志记录以及分布式系统中的数据存储。FreshDB ...
酒桶 基于著名的为顺序不可变数据优化的价值存储。 Seqcask 与 bitcask 相比有以下区别; 在 RAM 中保留约 35% 的密钥 顺序键而不是变量 仅支持put和get ,不支持... 在使用 leveldb 和 bitcask 等不同的存储引擎时,
分布式哈希表(Distributed Hash Table,简称DHT)是一种在分布式系统中用以实现大规模数据存储和快速定位的算法。DHT通过分布式的方式将数据以键值对的形式存储在各个节点上,从而实现无需中心服务器的高效数据管理...
Rosedb是一个采用Go语言实现的NoSQL数据库,基于高效的bitcask模型设计。该数据库原生支持多种数据结构,提供了丰富的数据存储和检索能力。 技术构成: - 主要编程语言:Go - 文件构成:共85个文件,包括: - Go源...