【问题标题】:Writing a key-value store编写键值存储
【发布时间】:2009-11-14 07:42:57
【问题描述】:

我希望编写一个键/值存储(可能在 python 中),主要是为了体验,因为我认为这是一个非常有用的产品。我有一些问题。一般来说,键/值对通常如何存储在内存和磁盘中?如何将存储在磁盘上的内容加载回内存?键/值存储是否一次将所有键/值对保存在内存中?还是从磁盘读取?

我试图找到一些关于这个主题的文献,但没有走得太远,希望这里有人能帮助我。

【问题讨论】:

标签: python key-value-store


【解决方案1】:

这完全取决于您想要深入研究的复杂程度。从一个简单的 Python dict 以多种可能的方式序列化到一个文件开始(其中 pickle 可能是最简单的),您可以实现一个完整的数据库系统。

查找redis - 这是一个用 C 语言编写的键/值存储,并作为服务器“数据库”运行。它有一些很好的文档和易于阅读的代码,因此您可以为您的 Python 实现借鉴一些想法。

为了更进一步,您可以阅读 B-trees。

对于您的具体问题:超过一定的数据库大小,您永远无法将其全部保存在内存中,因此您需要一些可靠的方式从磁盘加载数据。还要考虑商店是单客户端还是多客户端。这对其实施产生了严重后果。

【讨论】:

  • 如果我可以投票两次,我会的。这就是我正在寻找的答案。谢谢。
【解决方案2】:

看看 Python 的 shelve 模块,它提供了一个持久字典。它基本上将泡菜存储在数据库中,通常是 dmb 或 BSDDB。看看shelve 的工作原理会给你一些见解,源代码随你的 python 发行版一起提供。

另一个值得关注的产品是Durus。这是一个对象数据库,它使用自己的 B-tree 实现来持久化到磁盘。

【讨论】:

    【解决方案3】:

    如果您出于学习目的在 Python 中进行键/值存储,那么从 pickle 模块开始可能是最简单的。这是一种将任意 Python 数据流写入持久存储并再次读回的快速便捷方式。

    【讨论】:

      【解决方案4】:

      你可以看看'Berkley db'看看它是如何工作的,它是一个键/值数据库,所以你可以直接使用它,或者因为它是开源的,所以看看它如何处理持久性、事务和被引用最多的页面的分页。

      这里是 python 绑定到它http://www.jcea.es/programacion/pybsddb.htm

      【讨论】:

      • 这个答案是我来这里写的。 BDB 无处不在,为大量存储问题实现了解决方案。
      • 不过,我认为他阅读代码不会有什么乐趣。
      【解决方案5】:

      亚马逊发布了一个关于 Dynamo 的document——一个高可用的键值存储系统。它主要处理扩展问题(如何创建在大量机器上运行的键/值存储),但它也处理一些基础知识,通常值得一读。

      【讨论】:

        【解决方案6】:

        首先,我知道这个问题很老了。

        我是 aodbm (http://sf.net/projects/aodbm/) 的创建者,它是一个键值对存储库。 aodbm 使用不可变的 B+Trees 来存储您的数据。因此,每当进行修改时,都会在文件末尾附加一棵新树。这可能听起来像是对空间的可怕浪费,但鉴于前一棵树中的绝大多数节点都被引用,开销实际上非常低。在任何给定时间(最多 O(log n)),整个树中只有很少一部分保存在内存中。

        【讨论】:

          【解决方案7】:

          我建议观看 Write optimization in external - memory data structures (slides) 演讲,它很好地概述了构建 额外内存 数据库(例如键值存储)的现代方法,并解释了 @ 987654323@.

          如果您的键值存储针对所有数据都适合主内存的用例,那么数据存储架构可能会简单得多,mapping a file to a big chunk of memory 并且使用该内存而无需担心磁盘到内存的通信和同步完全没有,因为它成为操作系统的关注点。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-11-10
            • 2013-05-05
            • 1970-01-01
            • 2011-03-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多