比Redis更快 Berkeley DB面面觀

2021-08-27 15:24:59 字數 2030 閱讀 8974

redis很火,最近大家用的多。從兩年前開始,memcached轉向redis逐漸成為潮流;

而berkeley db可能很多朋友還很陌生,首先,我們簡單的介紹一下。

簡單、小巧、可靠、高效能。

db庫和應用執行在同一程序空間,介面為api形式,應用通過api訪問db;

mysql 5.1版之前的資料事務儲存引擎使用的是berkeley db;(5.1版之後不再使用更多的可能是出於商業的原因,因為berkeley db被oracle收購了)

google accounts選用的berkeley db作為儲存引擎;

除了速度,berkeley db的最大的優勢是支援多索引(次級索引);支援多索引,使得從關係型db中移植到記憶體db更容易,可有效避免資料膨脹及自行處理索引之間的對映關係;

eg:一張學生資訊表,以學號為主鍵(唯一性索引)建立了索引可以查詢到指定的學生記錄;如果再希望以姓名來查詢,可以以姓名為鍵建立次級索引來查詢;

在查詢條件比較複雜的情況下,可組合建立多個次級索引來找到同乙份資料;

想進一步了解次級索引如何使用,可參考這篇文章:《berkeley db多索引查詢》

使用環境:

cpu:intel core 2 duo p9*** 2.0g

mem:16g

os:red hat enterprise linux server release 6.3 (santiago) x86_64

同樣是記憶體資料庫,我們對比berkeley db和redis的執行時間(單位:ms)

a表記錄:506622條記錄:每條記錄:96個位元組

b表記錄:2478條記錄;每條記錄:10個位元組;

c表記錄:107221條記錄;每條記錄:82個位元組;

重建記憶體資料庫 bdb用4s,redis 20s;

更新記憶體資料庫,bdb和redis的實驗結果都比較理想

查詢記錄時,bdb比redis基本快乙個數量級;

快取、重建整個表操作,bdb效能明顯優於redis;這是因為bdb提供批量讀取所有資料的介面,而redis沒有提供類似的介面;

為了將資料從oracle中移植出來,我們需要對比關係型資料庫和berkeley db的查詢效率:

首先,我們使用唯一性索引作為berkeley db的主鍵,並因此查詢來和oracle對比;

資料規模:

實驗資料;1112516條記錄:

大小2.8g;

以查詢出最終結果為準:

sql查詢:

select * from table_a

where (date=to_date(:v, 'yyyymmdd') and a =:a and b =:b and c>=:c and d>=:d) and ( e=:e) and (f=:f) and (g=:g) and h!='c' and n='n'";

其中》= 、 !=操作無法編入索引,在索引查處資料後需應用再進行篩選過濾;

最終的查詢結果為一條記錄;

1. 全記憶體操作;資料都在記憶體中;

2. db與應用在同乙個程序位址空間中;這樣,就沒有額外的網路開銷。

當然,我們會意識到使用berkerley db就必須在每個應用物理節點上都開闢一大塊記憶體,來存放berkerley db的資料。這方面,分布式的redis則顯得更為實惠。

如果這篇文章讓你對berkeley db產生了興趣,如果你也想著效率那點事,想著將關聯式資料庫轉到nosql,試著上手吧。傳送門:《berkeley db入門篇》。

posted by: 大cc | 31oct,2013

部落格:blog.me115.com

為什麼 比list()更快?

我最近比較了和list 的處理速度,並且驚訝地發現執行速度比list 快三倍以上。我跑了相同的測試與 和dict 結果幾乎相同 和 兩個花了大約0.128sec 百萬次,而list 和dict 大約花費每個0.428sec 萬次。後來我查了查原因,得到的結論如下 list 需要全域性查詢和函式呼叫,...

為什麼get比post更快

get和post在面試過程中一般都會問到,一般的區別 1.post更安全 不會作為url的一部分,不會被快取 儲存在伺服器日誌 以及瀏覽器瀏覽記錄中 2.post傳送的資料量更大 get有url長度限制 3.post能傳送更多的資料型別 get只能傳送ascii字元 4.post比get慢 我相信不...

比讀寫鎖更快的StampedLock

readwritelock支援兩種模式 讀鎖 寫鎖 stampedlock支援三種模式 悲觀讀鎖 寫鎖 樂觀讀 stampedlock的悲觀讀鎖和寫鎖 與 readwritelock的讀鎖和寫鎖 語義相似,允許多個執行緒獲取悲觀讀鎖,只允許乙個執行緒獲取寫鎖,寫鎖和悲觀讀鎖是互斥的。不同的是stam...