更多精彩文章,关注【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资源免费等你来拿!!!