链表作为数组之外的一种常用序列抽象,是大多数高级语言的基本数据类型,因为C 语言本身不支持链表类型,大部分C 程序都会自己实现一种链表类型,Redis 也不例外.
双端链表的应用
双端链表作为一种通用的数据结构,在Redis 内部使用得非常多:它既是Redis 列表结构的底层实现之一,还被大量Redis 模块所使用,用于构建Redis 的其他功能.
实现Redis 的列表类型
双端链表还是Redis 列表类型的底层实现之一,当对列表类型的键进行操作——比如执行RPUSH 、LPOP 或LLEN 等命令时,程序在底层操作的可能就是双端链表
Redis 列表使用两种数据结构作为底层实现:
1:双端链表
2:压缩列表
因为双端链表占用的内存比压缩列表要多,所以当创建新的列表键时,列表会优先考虑使用压缩列表作为底层实现,并且在有需要的时候,才从压缩列表实现转换到双端链表实现。
除了实现列表类型以外,双端链表还被很多Redis 内部模块所应用:
1:事务模块使用双端链表来按顺序保存输入的命令
2:服务器模块使用双端链表来保存多个客户端;
3:订阅/发送模块使用双端链表来保存订阅模式的多个客户端;
4:事件模块使用双端链表来保存时间事件(time event);
双端链表的实现
双端链表的实现由listNode 和list 两个数据结构构成,下图展示了由这两个结构组成的一个双端链表实例