MapDB 的集合设计

数据库中的分区通常是在多个存储、表等之间分配数据的一种方式。MapDB 具有很强的灵活性,其分区也更为复杂。因此,在 MapDB 中,当一个集合使用多个存储来包含其状态时,就会进行分区。

例如,HTreeMap 可以在多个磁盘之间拆分键值条目,而其哈希表使用内存中的存储和到期队列是常规的堆上集合。

本章概述了 MapDB 中大多数分区选项。有关详细信息,请参见每个集合或存储对应的单独章节。

哈希分区

HTreeMap 对哈希分区(HP)提供了良好的支持。为实现并发,HashMap 被拆分为多个段,每个段都是独立的 HashMap,拥有自己的读写锁。段编号由哈希值计算得出。当启用过期功能时,每个段都有自己的过期队列。

通常 HTreeMap 段共享单个存储。但是每个段都可以有自己的存储,这提高了并发性并允许跨多个磁盘分片 HTreeMap。

范围分区

BTreeMap 目前不支持范围分区。

更新时间分区

由于写入放大,大型 BTrees 通常更新缓慢。在某些情况下(时间序列),根据上次修改对数据进行分片是有意义的。每天(或其他间隔)都有自己的存储,只需删除文件即可删除旧数据。有各种选项来处理修改、删除标记等…MapDB 通过 SortedTableMap 和 CopyOnWriteMap 支持这一点。

按持久性分区

持久提交比非持久提交慢得多。我们必须将数据移入/移出预写日志、同步文件、计算校验和……持久性分区允许通过将非必要数据移至非持久存储来最小化持久数据的大小。其代价是崩溃后的恢复时间更长。

一个很好的例子是 BTree。我们真正关心的只有叶节点,它包含所有的键值对。目录节点(索引)可以很容易地从叶节点重建。BTreeMap 可以使用两个存储,一个用于叶节点的持久化提交,另一个用于目录节点的非持久化提交。这样,在发生崩溃时,Pump 就会重建目录存储。


到这里,MapDB 就介绍完了,更多相关知识参考官方文档,地址:

https://jankotek.gitbooks.io/mapdb/content/ 

  

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号