redis数据结构之二-双端链表

双端链表是redis列表类型的底层实现之一,当对列表类型的键进行操作时,例如RPUSH,LPOP,LLEN,等命令时,程序在底层操作的可能就是双端链表。

//eg:
RPUSH brands Apple Microsoft Google
(integer)3
LPOP brands 
"Apple"
LLEN brands
(integer)2
LRANGE 0 -1
"Microsoft"
"Google"

双端链表的功能
1.实现redis的列表类型
2.事务模块使用双端链表按顺序保存输入的命令
3.服务器模块使用双端链表保存客户端
4.订阅、发送模块使用双端链表保存时间事件
5.事件模块使用双端链表来保存时间事件

双端链表的实现
redis数据结构之二-双端链表_第1张图片


//节点
    //前驱节点
    struct listNode *prev;
    //后继结点
    struct listNode *next;
    //值
    void *value;
}listNode;

//双端链表
typedef struct list{
    //表头指针
    listNode  *head;
    //表尾指针
    listNode *tail;
    //节点数量
    unsigned long len;
    //复制函数
    void *(*dup)(void *ptr);
    //释放函数
    void (*free)(void *ptr);
    //比对函数
    int (*match)(void *ptr,void *key);  
}list;

迭代器
redis提供的迭代器可以从两个方向对双端链表进行迭代
沿着节点的next指针前进,从表头到表尾进行迭代
沿着节点的prev指针前进,从表尾到表头进行迭代

typedef struct listIter{
    //下一节点
    listNode *next;
    //迭代方向
    int direction;
}listIter;

小结:
1.redis实现了双端链表结构
2.双端链表结构主要有两个作用
-作为redis列表类型的底层实现之一
-作为通用数据结构,被其它功能模块所使用
3.双端链表及其节点的性能特性如下
-节点带有前驱和后继指针,访问其前驱和后继指针的复杂度为O(1), 并且对链表的迭代可以从表头到表尾或者从表尾到表头
-链表带有指向表头和表尾的指针,因此对表头或表尾进行处理的复杂 度为O(1)
-链表带有记录节点数量的属性,所以可以在O(1)复杂度内返回链表的 长度。

你可能感兴趣的:(redis)