Redis---list
概况:
list用来存储多个有序的字符串,一个列表可以存储2^32-1个元素。 Redis中的列表支持两端插入和弹出,并可以获得指定位置(或范围)的元素,可以充当数组、队列、栈等。
内部编码:
-
双端链表(linkedlist)
-
typedef struct listNode{ struct listNode *prev; struct listNode * next; void * value; }
-
typedef struct list{ listNode * head; //表头节点 listNode * tail; //表尾节点 unsigned long len; //链表长度 void *(*dup) (void *ptr); //节点值复制函数 void (*free) (void *ptr); //节点值释放函数 int (*match)(void *ptr, void *key); //节点值对比函数 }
![]()
-
a) 双端链表同时保存了表头指针和表尾指针,每个节点都有指向前和指向后的指针
b) dup、free和match为节点值设置类型特定函数,所以链表可以用于保存各种不同类型的值 ?????
c) 链表中保存了列表的长度
d) 链表中每个节点指向的是type为字符串的redisObject
-
压缩列表(ziplist)
- 为了节约内存开发的,特殊编码的连续内存块
- 修改或增删操作时,复杂度较高。因此节点较少时,用压缩列表。较多时,用双端链表。
- 不仅用于实现列表,也用于实现哈希,有序列表
编码转换:
元素较少的时候使用压缩列表,否则使用双端链表。
使用双端链表的条件是:
- 列表中元素数量小于512个
- 列表中所有字符串对象都不足64字节


浙公网安备 33010602011771号