Redis數據庫是一種非關係型數據庫,基於key/value對,運行時加載到內存,對value支持虛擬內存, 支持多種數據結構,支持持久化,以性能著稱,可用於存儲,緩存,消息隊列等場景。主要介紹下Redis運行時維護的數據結構,以展現其工做方式。html
1.整體設計。redis
首先,Redis沒有MySQL那樣的索引機制,由於其內建一個基於hash的字典,以下圖:sql
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
![](http://static.javashuo.com/static/loading.gif)
注:新建一個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