文章目錄
- 前言
- 一、Redis中的對象的結構體如下:
- 二、壓縮鏈表
- 三、跳躍表
前言
Redis是一種key/value型數據庫,其中,每個key和value都是使用對象表示的。
一、Redis中的對象的結構體如下:
/** Redis 對象*/
typedef struct redisObject {// 類型unsigned type:4; // 不使用(對齊位)unsigned notused:2;// 編碼方式unsigned encoding:4;// LRU 時間(相對于 server.lruclock)unsigned lru:22;// 引用計數int refcount;// 指向對象的值void *ptr;} robj;
二、壓縮鏈表
ziplist是一種壓縮鏈表,它的好處是更能節省內存空間,因為它所存儲的內容都是在連續的內存區域當中的。當列表對象元素不大,每個元素也不大的時候,就采用ziplist存儲。但當數據量過大時就ziplist就不是那么好用了。因為為了保證他存儲內容在內存中的連續性,插入的復雜度是O(N),即每次插入都會重新進行realloc。如下圖所示,對象結構中ptr所指向的就是一個ziplist。整個ziplist只需要malloc一次,它們在內存中是一塊連續的區域。
使用 ziplist 存儲鏈表,ziplist是一種壓縮鏈表,它的好處是更能節省內存空間,因為它所存儲的內容都是在連續的內存區域當中的。
三、跳躍表
使用 skiplist(跳躍表)來存儲有序集合對象、查找上先從高Level查起、時間復雜度和紅黑樹相當,實現容易,無鎖、并發性好。
ziplist作為集合和作為哈希對象是一樣的,member和score順序存放。按照score從小到大順序排列。它的結構不再復述。
skiplist是一種跳躍表,它實現了有序集合中的快速查找,在大多數情況下它的速度都可以和平衡樹差不多。但它的實現比較簡單,可以作為平衡樹的替代品。它的結構比較特殊。下面分別是跳躍表skiplist和它內部的節點skiplistNode的結構體:
/** 跳躍表*/
typedef struct zskiplist {// 頭節點,尾節點struct zskiplistNode *header, *tail;// 節點數量unsigned long length;// 目前表內節點的最大層數int level;
} zskiplist;
/* ZSETs use a specialized version of Skiplists */
/** 跳躍表節點*/
typedef struct zskiplistNode {// member 對象robj *obj;// 分值double score;// 后退指針struct zskiplistNode *backward;// 層struct zskiplistLevel {// 前進指針struct zskiplistNode *forward;// 這個層跨越的節點數量unsigned int span;} level[];
} zskiplistNode;