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...