更多精彩文章,關注【ToBeTopJavaer】,更有數萬元精品vip資源免費等你來拿!!!
接下來咱們要剖析的基本類型是List,相信你們對List都不會陌生吧,下面咱們將深刻源碼剖析Redis中List的實現。node
lpush queue a
lpush queue b c
rpush queue d e
lpop queue
rpop queue
blpop queue
brpop queue複製代碼
lindex queue 0
lrange queue 0 -1複製代碼
127.0.0.1:6379> object encoding queue
"quicklist"複製代碼
什麼是quicklist?
quicklist(快速列表)是 ziplist 和 linkedlist 的結合體。redis
typedef struct quicklist {
quicklistNode *head; /* 指向雙向列表的表頭 */
quicklistNode *tail; /* 指向雙向列表的表尾 */
unsigned long count; /* 全部的 ziplist 中一共存了多少個元素 */
unsigned long len; /* 雙向鏈表的長度, node 的數量 */
int fill : 16; /* fill factor for individual nodes */
unsigned int compress : 16; /* 壓縮深度, 0: 不壓縮; */
} quicklist;複製代碼
list-max-ziplist-size(fill)
list-compress-depth(compress)
源碼以下:算法
typedef struct quicklistNode {
struct quicklistNode *prev; /* 前一個節點 */
struct quicklistNode *next; /* 後一個節點 */
unsigned char *zl; /* 指向實際的 ziplist */
unsigned int sz; /* 當前 ziplist 佔用多少字節 */
unsigned int count : 16; /* 當前 ziplist 中存儲了多少個元素, 佔 16bit(下同) , 最大 65536 個 */
unsigned int encoding : 2; /* 是否採用了 LZF 壓縮算法壓縮節點, 1: RAW 2: LZF */
unsigned int container : 2; /* 2: ziplist, 將來可能支持其餘結構存儲 */
unsigned int recompress : 1; /* 當前 ziplist 是否是已經被解壓出來做臨時使用 */
unsigned int attempted_compress : 1; /* 測試用 */
unsigned int extra : 10; /* 預留給將來使用 */
} quicklistNode;複製代碼
源碼結構圖bash
用戶消息時間線 timeline
BRPOP:BRPOP key1 timeout 移出並獲取列表的最後一個元素, 若是列表沒有元素會阻塞列表直到等待超時或發現可彈出元素爲止。測試
隊列:先進先出:rpush blpop,左頭右尾,右邊進入隊列,左邊出隊列。ui
棧:先進後出:rpush brpopspa
更多精彩文章,關注【ToBeTopJavaer】,更有數萬元精品vip資源免費等你來拿!!!