写一个键值存储

时间:2009-11-14 07:42:57

标签: python key-value-store

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

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

7 个答案:

答案 0 :(得分:21)

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

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

为了更进一步,你可以阅读有关B树的信息。

对于您的特定问题:在某些数据库大小之上,您永远不能将其全部保留在内存中,因此您需要一些从磁盘加载数据的强大方法。还要考虑商店是单客户还是多客户。这对其实施具有严重后果。

答案 1 :(得分:4)

看看Python的shelve模块,它提供了一个persitent字典。它基本上将pickle存储在数据库中,通常是dmb或BSDDB。查看shelve如何工作将为您提供一些见解,源代码随您的python发行版一起提供。

要查看的另一个产品是Durus。这是一个对象数据库,它使用它自己的B树实现来持久化到磁盘。

答案 2 :(得分:3)

如果您在Python中使用键/值存储进行学习,最简单的方法是从pickle模块开始。将任意Python数据流写入持久性存储并再次读取它是一种快速而方便的方法。

答案 3 :(得分:3)

您可以查看“Berkley db”以查看其工作原理,它是一个键/值数据库,因此您可以直接使用它,或者它是开源的,看看它如何处理持久性,大多数参考页面的交易和分页。

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

答案 4 :(得分:2)

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

我建议您查看谈话Write optimization in external - memory data structuresslides),它可以很好地概述构建额外内存数据库的现代方法(例如键值存储) ,并解释log-structured merge trees

如果您的键值存储以所有数据适合主内存为目标的用例,数据存储架构可以更简单,mapping a file to a big chunk of memory并使用该内存而不必担心磁盘到内存的通信和同步,因为它成为操作系统的一个问题。