標籤:
Redis資料庫是一種非關係型資料庫,基於key/value對,運行時載入到記憶體,對value支援虛擬記憶體, 支援多種資料結構,支援持久化,以效能著稱,可用於儲存,緩衝,訊息佇列等情境。主要介紹下Redis運行時維護的資料結構,以展示其工作方式。
1.總體設計。
首先,Redis沒有MySQL那樣的索引機制,因為其內建一個基於hash的字典,如:
Redis 計算雜湊值和索引值的方法如下:
# 使用字典設定的雜湊函數,計算鍵 key 的雜湊值hash = dict->type->hashFunction(key);# 使用雜湊表的 sizemask 屬性和雜湊值,計算出索引值# 根據情況不同, ht[x] 可以是 ht[0] 或者 ht[1]index = hash & dict->ht[x].sizemask;
插入資料時,根據以上算出index,然後根據index值放入table表中相應位置即可。
2. string類型
例如:Set hello world
3. list類型
例如:Lpush list aaaa bbb ccc
4. hash類型
例如:Hset test hello world
註:建立一個hash對象時開始是用zipmap(又稱為small hash)來儲存的。這個zipmap其實並不是hash table,但是zipmap相比正常的hash實現可以節省不少hash本身需要的一些中繼資料存放區開銷。儘管zipmap的添加,刪除,尋找都是O(n),但是由於一般對象的field數量都不太多。所以使用zipmap也是很快的,也就是說添加刪除平均還是O(1)。如果field或者value的大小超出一定限制後,Redis會在內部自動將zipmap替換成正常的hash實現(一個key對應一個hash表)。
參考:
http://www.slideshare.net/iammutex/redis-9948788
http://blog.nosqlfan.com/html/3525.html?ref=rediszt
http://redisbook.com/preview/dict/hash_algorithm.html
Redis資料庫各種資料結構的內部實現。