Python中的Berkeley DB(1):Hello Berkeley DB
什么是Berkeley DB1
Berkeley DB(后文简称BDB)是一个高性能的嵌入式数据库编程库(引擎),它可以用来保存任意类型的键/值对 (Key/Value Pair),而且可以为一个键保存多个数据。BDB可以支持数千的并发线程同时操作数据库,支持最大256TB的数据。
BDB提供诸如C语言,C++,Java,Perl,Python,Tcl等多种编程语言的API,并且广泛支持大多数类Unix操作系统和Windows操作系统以及实时操作系统(如 VxWorks)。
- 1991年,Berkeley DB的第一个版发行(Linux系统也在这一年诞生),其最初的开发目的是以新的HASH访问算法来代替旧的hsearch函数和大量的dbm实现,该版本还包含了B+树数据访问算法。
- 1992年,BSD UNIX第4.4发行版中包含了Berkeley DB1.85版。基本上认为这是Berkeley DB的第一个正式版。
- 1996年,Sleepycat软件公司成立,提供对Berkeley DB的商业支持。
- 2006年,Sleepycat被Oracle收购,当时最新版本是4.7.25。
为什么是Berkeley DB
从功能来看,BDB似乎非常单一,同其它Key/Value类数据库系统类似,它只具有很少的数据操作能力,在当前各种No-SQL系统百花齐放的时代,你可能会觉得功能如此简单的数据库系统并不会有太多的用武之地,不过读完下面的介绍,你可能会对BDB另眼相看了。
优异的性能2
BDB和应用运行在同一进程空间,直接使用原生态的API存取数据,因此它具有其它数据库系统无法比拟的性能,不要不相信,它跑起来甩出Redis几条大街!至于MySQL、Oracle这些RDBMS系统,更不好意思和Berkeley在一起谈性能了,MySQL5.1版之前的数据事务存储引擎使用的是BDB,Google Accounts选用的BDB作为存储引擎。
轻量化和跨平台
BDB被Oracle收购后,其使用许可变更为AGPL3,但它仍然是一个Freeware,你可以从Oracle网站上下载3它的源码,在任何一个你喜欢或需要的平台上编译运行,它还有Java版本(Berkeley DB Java Edition),让你更方便地跨平台部署你的应用,此外,Python语言也内置了对BDB的绑定(binding),可以让你无需在本地安装BDB的情况下无障碍地使用,本文后续部分便为你介绍如何在Python中方便地使用BDB。需要注意的是,Python 2.7版本中的binding库pybsddb为V4.8,为了方便大家测试我们会基于这个版本,如果你需要使用到最新的功能特性请参考该项目的新主页。4
Hello Berkeley DB
本节我们用一个类似Hello world的入门案例来讲一讲如何在Python中调用BDB binding。
我们假设你安装了原始的Python 2.7.X系列Python运行环境,打开Windows命令行或Linux终端,输入python启动Python语言解析器,输入import bsddb
。
Python 2.7.10 (default, May 23 2015, 09:44:00) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>import bsddb
如果系统未提示错误,意味着导入bsddb包正常,那么可以进行下一步操作了。
此时我们还可以输入print bsddb.db.DB_VERSION_STRING
查看BDB版本号。
>>>print bsddb.db.DB_VERSION_STRING
Berkeley DB 4.7.25: (May 15, 2008)
下面我们创建一个新的数据库(注意BDB中没有数据表的概念,一个Key/Value对组成的集合对应一个磁盘文件)。
>>> mydb = bsddb.db.DB()
>>> mydb.open('mydb.db',dbtype = bsddb.db.DB_HASH, flags = bsddb.db.DB_CREATE)
上面的代码中,使用bsddb.db.DB()创建一个DB实例,然后使用DB中的open方法打开一个数据库,设计dbtype参数为DB_HASH表明这个库的结构为哈希表类型,设置flags参数为DB_CREATE表明如果数据文件不存在则新建一个空的数据文件。
TIPS:执行了mydb.open后会在当前操作系统路径下新建一个mydb.db的数据文件。如果你打开命令行没有改变当前路径的话默认会在用户主目录下(Windows为 C:\Users\你的用户名,Linux系统为~)
现在你就可以使用这个已经打开的DB实例存储第一个数据了,使用DB的put方法存储一个Key/Value对,如mydb.put(“author”,”evancsss”),其中Key为author,Value为evancss。执行完put方法后,我们使用close()方法关闭数据库,并退出Python以验证数据是否已在磁盘上持久化存储。
>>> mydb.put("author","evancss")
>>> mydb.put("title","Berkeley DB in Python")
>>> mydb.close()
>>> exit()
现在我们要读取刚刚建立的数据库,重新进入Python解析器并开始使用BDB,这次我们使用from * import *的语法来简化我们的操作:
>>> from bsddb import db
>>> mydb = db.DB()
>>> mydb.open('mydb.db')
>>> print mydb.items()
[('title', 'Berkeley DB in Python'), ('author', 'evancss')]
哇塞,一切顺利,我们用一个简单的items()方法取出了刚刚添加的两条数据。
待续……
第二篇:Berkeley DB的数据结构
第三篇:高级特性与线程安全
第四篇:使用Berkeley DB进行URL去重
第五篇:使用Berkeley DB作为缓冲队列
第六篇: 新版Berkeley DB的特性