在 Redis 数据类型中的列表list,对数据的添加和删除常用的命令有 lpush,rpush,lpop,rpop,其中 l 表示在左侧,r 表示在右侧,可以在左右两侧做添加和删除操作,说明这是一个双向的数据结构,而 list 数据结构正是双向链表,类似 java 中的 LinekdList 链表列表。

链表提供了高效的节点重排能力,以及顺序的节点访问方式,通过修改节点的 pre 和 next 指针来修改链表的数据。

C 语言没有内置链表的数据结构,所以 Redis 构建了自己的链表结构。

链表的数据结构,链表以及链表节点

链表是由链表以及链表节点组成,每个链表节点使用一个 adlist.h/listNode 结构来表示:

typedef struct listNode {
//前置节点
struct listNode *prev;
//后置节点
struct listNode *next;
// 节点值
void *value;
} listNode;

多个 listNode 可以通过 prev 和 next 指针组成双链表的,如题所示:

多个 listNode 可以组成链表,但是为了方便管理,使用 adlist.h/list 管理链表,list 结构如下:

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

list 结构为链表提供了表头指针 head、表尾指针 tail,以及节点数量计算 len。下图展示一个由 list 结构和三个 listNode 节点组成的链表:

Redis 链表实现的特征有如下的总结:

  • 双向:链表节点带有 prev 和 next 指针,可以通过指针获取每一个数据
  • 快速计算链表长度:通过 list 结构中的 len 属性计算 list 的长度,而时间复杂度为O(1)
  • 多态: 链表节点使用 void* 指针保存节点,所以链表支持保存各种不同类型的值

双链表的运用

列表键,发布订阅、慢查询以及监视器等。

总结

  • 本文通过介绍链表的数据结构,链表是由链表和链表节点组成的
  • 链表节点都有一个前置和后置指针,所以 Redis 的链表是一个双向链表
  • 链表可以存储头结点,尾节点,更好的管理自己的节点,len 属性快速算出链表的长度
  • 链表通过 void* 以及不同的类型设定函数,所以链表可以不同的类型的值

参考

  • Redis设计与实现

如果觉得文章对你有帮助的话,请点个推荐吧!

深入理解Redis 数据结构—双链表的更多相关文章

  1. 【Redis笔记(四)】 Redis数据结构 - list链表

    原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/50573605 经过前面的介绍,我们学习了Redis中string字符串.hash ...

  2. Redis数据结构之链表

    Redis使用的链表是双向无环链表,链表节点可用于保存各种不同类型的值. 一.链表结构定义1. 链表节点结构定义: 2. 链表结构定义: 示例: 二.链表在Redis中的用途1. 作为列表键的底层实现 ...

  3. 深入理解Redis 数据结构—字典

    字典,又称为符号表.关联数组或映射,是一种用于保存键值对的抽象数据结构.在字典中,一个键可以和一个值进行关联,这些关联的键和值称为键值对.键值对中键是唯一的,我们可以根据键key通过映射查找或者更新对 ...

  4. Redis数据结构:链表

    链表被广泛用于Redis的各种功能,比如列表键.发布与订阅.慢查询.监视器等. 每个链表节点由一个listNode结构表示,每个节点都有前置节点和后置节点. 每个链表使用一个list结构来表示,这个结 ...

  5. 深入理解Redis 数据结构—简单动态字符串sds

    Redis是用ANSI C语言编写的,它是一个高性能的key-value数据库,它可以作用在数据库.缓存和消息中间件.其中 Redis 键值对中的键都是 string 类型,而键值对中的值也是有 st ...

  6. 数据结构 - 双链表(C++)

    // ------DoublyLinkedList.h------ template <class T> class DNode { private: // 指向左.右结点的指针 DNod ...

  7. 双链表【参照redis链表结构】

    参照了Redis里面的双链表结构,可以说是完全复制粘贴,redis的双链表还是写的很通俗易懂的,没有什么花里胡哨的东西,但是redis还有个iter迭代器的结构来遍历链表.我这里就没有实现了,只是实现 ...

  8. Redis数据结构—链表与字典的结构

    目录 Redis数据结构-链表与字典的结构 链表 Redis链表节点的结构 Redis链表的表示 Redis链表用在哪 字典 Redis字典结构总览 Redis字典结构分解 Redis字典的使用 Re ...

  9. Redis数据结构—链表与字典

    目录 Redis数据结构-链表与字典 链表 Redis链表节点的结构 Redis链表的表示 Redis链表用在哪 字典 Redis字典结构总览 Redis字典结构分解 哈希算法 解决键冲突 rehas ...

随机推荐

  1. 【原创】Linux v4l2框架分析

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  2. 如何使用远程工具连接Linux服务器

    大家好,今天我想和大家分享一下Linux如何连接远程控制工具我们都知道,Linux是著名的开源服务器操作系统,而在运维工程师的实际工作当中,我们不大可能时时刻刻都在服务器本地操作.因此这时,我们要用远 ...

  3. 【二食堂】Alpha - Scrum Meeting 7

    Scrum Meeting 7 例会时间:4.17 11:40 - 12:00 进度情况 组员 昨日进度 今日任务 李健 1. 继续文本区域的开发,先完成目前简陋的添加方式,再区实现勾选功能issue ...

  4. linux centos7 修改默认网卡命名规则为eth0脚本

    CentOS6之前基于传统的命名方式如:eth1,eth0.... Centos7提供了不同的命名规则,默认是基于固件.拓扑.位置信息来分配.这样做的优点是命名是全自动的.可预知的,缺点是比eth0. ...

  5. FastAPI 学习之路(五十六)将token存放在redis

    在之前的文章中,FastAPI 学习之路(二十九)使用(哈希)密码和 JWT Bearer 令牌的 OAuth2,FastAPI 学习之路(二十八)使用密码和 Bearer 的简单 OAuth2,Fa ...

  6. Machine learning (6-Logistic Regression)

    1.Classification However, 2.Hypothesis Representation Python code: import numpy as np def sigmoid(z) ...

  7. cURL 命令获取本机外网 IP

    1.1 查询本机外网 IP # curl dhcp.cn 134.175.159.160 1.2 输出格式为 JSON # curl dhcp.cn/?json { "IP": & ...

  8. linux job

    通常运行的进程 ctrl-z之后会暂停到后台 bash test.sh Linux-4.15.0-36-generic-x86_64-with-Ubuntu-16.04-xenial #39~16.0 ...

  9. single-number-ii leetcode C++

    Given an array of integers, every element appears three times except for one. Find that single one. ...

  10. 面试官:能手写实现call、apply、bind吗?

    1 call.apply.bind 用法及对比 1.1 Function.prototype 三者都是Function原型上的方法,所有函数都能调用它们 Function.prototype.call ...