DBDB: 一个简单的key/value数据库(一)

编译自:http://www.aosabook.org/en/500L/dbdb-dog-bed-database.html 作者:Taavi Burns 翻译:鸿 如有翻译问题或建议,请公众号留言

导论 DBDB(Dog Bed Database)是基于Python实现的key/value数据库。 它将key值与value值关联,并将该关联存储在磁盘上方便检索。DBDB可以在服务器崩溃或者发生错误的情况下保存数据,并且也避免了所有数据都保存在内存中,因此它可以存储比服务器内存更多的数据。

DBDB解决的三个问题 如果您的文件系统空间不足,会发生什么情况? 如果服务器在保存数据时死机会发生什么? 如果你的数据大小超过可用内存呢?

DBDB的特点 数据库的特点可以用ACID来描述:原子性,一致性,隔离性和持久性。DBDB中的数据更新具有原子性和持久性。但是DBDB不提供一致性保证,因为它没有对存储的数据施加限制。同样的,隔离性也没有实现。当然,应用程序可以使用属于它自己的一致性保证,但隔离性则需要专门的事务管理器。除此以外,还有其它的问题存在。例如,DBDB不会处理老数据,因此重复更新(即使是相同的key值)最终都会消耗掉所有的磁盘空间。

俯瞰DBDB DBDB分为逻辑层(数据结构:二叉树),物理层(如何在磁盘上存储数据)以及接口API(key值与value值的具体内容)几层。

代码架构 下面的模块是按终端用户的使用频率进行降序排序的,换句话说,第一个模块是用户了解的最多的模块,而最后一个模块与终端用户没有什么交集。

  • tool.py:一个用于从终端窗口使用数据库的命令行工具。
  • interface.py:定义了类(DBDB),它基于二叉树实现了Python字典数据结构。
  • logical.py:逻辑层。它是一个key值/value值存储的抽象接口。LogicalBase为数据更新提供了接口(如get,set和commit),并且对锁进行管理和回收内部节点引用。ValueRef是一个引用存储在数据库中的二进制Blob的Python对象,可以避免将所有数据一次性加载到内存中。
  • binary_tree.py:在逻辑层之下定义了一个具体的二叉树算法。BinaryTree提供了二叉树的具体实现,其中包含读取,插入和删除key/value的方法。 BinaryTree是一棵函数式的不变的二叉树;更新是通过返回一个与旧树共享公共结构的新树来实现的。 BinaryNode实现了二叉树的一个节点。BinaryNodeRef是一个特殊的ValueRef,它知道如何对BinaryNode进行序列化和反序列化。
  • physical.py:定义了物理层。 Storage类提供持久,(往往是)仅追加记录的存储。

原文发布于微信公众号 - 鸿的学习笔记(shujuxuexizhilu)

原文发表时间:2018-04-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏游戏杂谈

关于seajs

虽然已经有很长时间没写JavaScript,但很多时候看到一些应用还是会带着好奇心去研究一下。之前是看腾讯的朋友网,它的webchat做的很不错(虽然ff下有b...

39230
来自专栏Java帮帮-微信公众号-技术文章全总结

大文件拆分方案的Java实践【面试+工作】

大文件拆分问题涉及到io处理、并发编程、生产者/消费者模式的理解,是一个很好的综合应用场景,为此,花点时间做一些实践,对相关的知识做一次梳理和集成,总结一些共性...

39240
来自专栏along的开发之旅

Android逆向分析概述

学习逆向的初衷是想系统学习Android下的hook技术和工具, 想系统学习Android的hook技术和工具是因为Android移动性能实战这本书. 这本书里...

20230
来自专栏云计算

JClouds的命令行界面

我已经使用jclouds一年多了,也一直为它的进步做贡献。目前为止,我已经在很多领域广泛地使用它,特别是在 Fuse Ecosystem 。总之,它是一个特别棒...

26870
来自专栏微信终端开发团队的专栏

MMKV for Android 多进程设计与实现

MMKV 是基于 mmap 内存映射的移动端通用 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强。从 2015 ...

47010
来自专栏三丰SanFeng

Linux同步机制 - 基本概念(死锁,活锁,饿死,优先级反转,护航现象)

死锁(deadlock) 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态...

36090
来自专栏BestSDK

Python开发必备的6个库,有了它事半功倍!

01 Python 必备之 PyPy PyPy 主要用于何处? 如果你需要更快的 Python 应用程序,最简单的实现的方法就是通过 PyPy ,Python ...

44580
来自专栏FreeBuf

用搜索神器Everything定位Webshell木马后门

Everything是速度最快的文件名搜索软件。其速度之快令人震惊,百G硬盘几十万个文件,可以在几秒钟之内完成索引;文件名搜索瞬间呈现结果。它小巧免费,支持中文...

32980
来自专栏涤生的博客

天池中间件大赛——单机百万消息队列存储设计与实现

这次天池中间件性能大赛初赛和复赛的成绩都正好是第五名,本次整理了复赛《单机百万消息队列的存储设计》的思路方案分享给大家,实现方案上也是决赛队伍中相对比较特别的。

24810
来自专栏码匠的流水账

聊聊jdbc的大数据量读写相关异常的防御措施

jdbc提供fetchSize参数来设置每次查询按fetchSize分批获取。不同的数据库的jdbc driver实现不一样。

20010

扫码关注云+社区

领取腾讯云代金券