【发布时间】:2021-12-19 23:46:54
【问题描述】:
我一直在制作一个键值存储,作为个人项目保存到磁盘,我一直使用 b-tree 作为我的数据结构,但我想像许多一样对键和值长度添加较大的限制其他键值存储,例如 redis。
当扇区大小只有 512 字节时,应该如何将大键和值存储在 b-tree 中?如果允许更大尺寸的键和值,每个节点应该允许多少个键,我是否应该考虑考虑另一种数据结构来存储可变大小的数据?
【问题讨论】:
我一直在制作一个键值存储,作为个人项目保存到磁盘,我一直使用 b-tree 作为我的数据结构,但我想像许多一样对键和值长度添加较大的限制其他键值存储,例如 redis。
当扇区大小只有 512 字节时,应该如何将大键和值存储在 b-tree 中?如果允许更大尺寸的键和值,每个节点应该允许多少个键,我是否应该考虑考虑另一种数据结构来存储可变大小的数据?
【问题讨论】:
您可以定义溢出页面以从页面链接列表中形成节点,或者您可以通过存储在 b-tree 叶节点中的指针来引用键和值。指针可以指向页面的链接列表或特殊类型的子树。如果这样可以减少由于未填充页面造成的浪费,您可以在叶节点中存储一些内联内容。
进行溢出设计时,每个节点允许多少键?最少的可能。随着链表变大,设计不会扩展。如果由于某种原因您需要存储非常大的值,您可以看到这种设计可能非常昂贵,因为您必须扫描并跳过这么多额外的页面。
基于指针的方法可以更好地扩展,但要使其对键最有效,必须尽可能多地内联键。否则,您在进行搜索时总是必须遵循指针。您可以潜在地应用一种指针压缩技术,其中一个公共前缀存储一次。这允许更多的键适合页面,减少跟随指针的可能性。
【讨论】: