1.介绍
- 值在键在,值空键无
- List实际是双向列表...
2.常用核心命令
lpush/rpush <k1><v1><v2>...<--->从左边/右边插入一个或多个值
lpop/rpop <key><--->从左边/右边吐出一个或多个值
rpoplpush <k1><k2><--->k1右边吐一个值,然后插入到k2左边
lrange <key><start><stop><--->按照索引下标获得元素(从左到右,-1为最右边)
lindex <key><index><--->按照索引下标获得元素(从左到右)
llen <key><--->获取列表长度
linsert<key>before<value><newvalue><--->在的前面插入值
lrem <key> <n><value><--->从左边删除n个value(从左到右)
lset <key><index><value><--->将列表key下标为index的值替换成value
3.底层数据结构

C
//ziplist是Redis为了节约内存而开发的连续内存块结构,它将所有元素紧凑地存储在一块连续的内存中。
typedef struct quicklist {
quicklistNode *head; // 头节点
quicklistNode *tail; // 尾节点
unsigned long count; // 所有 ziplist 中的元素总数
unsigned long len; // quicklist 节点数量
int fill : 16; // 每个节点的填充因子(控制 ziplist 大小)
unsigned int compress : 16; // 压缩深度(LZF 压缩)
} quicklist;
//quicklist是Redis3.2引入的双向链表结构,每个节点是一个ziplist。
typedef struct quicklistNode {
struct quicklistNode *prev; // 前驱节点
struct quicklistNode *next; // 后继节点
unsigned char *zl; // 指向 ziplist 的指针
unsigned int sz; // ziplist 占用的字节数
unsigned int count : 16; // ziplist 中的元素数量
unsigned int encoding : 2; // 编码方式(1=RAW, 2=LZF压缩)
unsigned int container : 2; // 容器类型(1=ziplist)
unsigned int recompress : 1; // 是否需要重新压缩
unsigned int attempted_compress : 1; // 压缩尝试标志
unsigned int extra : 10; // 保留字段
} quicklistNode;