Python中的Berkeley DB(1):Hello Berkeley DB

evancss發表於2015-09-16

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的特性

參考文件

相關文章