Redis---list

概况:

list用来存储多个有序的字符串,一个列表可以存储2^32-1个元素。 Redis中的列表支持两端插入和弹出,并可以获得指定位置(或范围)的元素,可以充当数组、队列、栈等。

内部编码:

  • 双端链表(linkedlist)

    1. typedef struct listNode{
            struct listNode *prev;
            struct listNode * next;
            void * value;  
      }
    2. 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)

    1. 为了节约内存开发的,特殊编码的连续内存块
    2. 修改或增删操作时,复杂度较高。因此节点较少时,用压缩列表。较多时,用双端链表。
    3. 不仅用于实现列表,也用于实现哈希,有序列表

编码转换:

元素较少的时候使用压缩列表,否则使用双端链表。

使用双端链表的条件是:

    1. 列表中元素数量小于512个
    2. 列表中所有字符串对象都不足64字节
posted @ 2020-05-20 21:10  crossdunk  阅读(111)  评论(0)    收藏  举报