让我们从键值数据的索引开始。这不是你可以索引的唯一类型的数据,但它非常常见,而且它是构建更复杂索引的一个有用的模块。
键值存储与大多数编程语言中可以找到的dictionary类型非常相似,通常是作为散列表实现的。在许多算法教科书中都描述了哈希映射,因此我们不会详细讨论它们是如何工作的。既然我们已经有了内存数据结构的哈希映射,为什么不使用它们来索引磁盘上的数据呢?
假设我们的数据存储只包括追加记录到一个文件,就像前面的例子一样。然后,最简单的索引策略是:保存一个内存中的散列映射,其中每个键都映射到数据文件中的一个字节偏移位置,这个位置的值如图3-1所示可以被找到。当你在文件中添加新的键值对时,您还将更新散列映射以反映您刚刚编写的数据的偏移量(这既用于插入新键,也用于更新现有的键)。当您想查找一个值时,使用散列映射来查找数据文件中的偏移量,查找该位置,并读取该值。
![e9227b21df8db40cd384b0d003bb7be3.png](https://i-blog.csdnimg.cn/blog_migrate/48425bb3f3b8c51e8e5d8c5454741381.jpeg)
图3-1 以类csv的格式存储键值对,并使用内存散列映射进行索引。
这听起来可能过于简单,但却是可行的方法。实际上,这就是Bitcask (Riak的默认存储引擎)所做的事情。Bitcask提供高性能的读写,根据要求,所有的键都可以放在可用的RAM中,因为哈希映射被完全保存在内存中。这些值可以使用比可用内存更多的空间,因为它们可以从磁盘上加载。如果数据文件的那一部分已经在文件系统缓存中,