Redis源码刨析系列:三、链表adlist

Redis 6.2 的链表(官方命名为 adlist,A generic doubly linked list)是通用双向循环链表的工业级实现,作为 Redis 核心底层数据结构之一,支撑了列表键、发布订阅、慢查询日志、AOF 重写缓冲区等核心功能。相较于 C 标准库无通用链表实现,Redis 自研的链表具备「双向循环、O (1) 长度、类型无关、安全迭代」等特性,兼顾性能与灵活性。

核心结构体(源码位于 src/adlist.h

链表节点(listNode)

复制代码
/* 链表节点结构体:双向节点,存储值指针 + 前驱/后继指针 */
typedef struct listNode {
    struct listNode *prev;  // 前驱节点指针(双向特性核心)
    struct listNode *next;  // 后继节点指针
    void *value;            // 节点值:void* 类型,支持任意数据(类型无关)
} listNode;

链表迭代器(listIter)

复制代码
/* 链表迭代器:支持安全遍历,区分正向/反向迭代 */
typedef struct listIter {
    listNode *next;         // 下一个要访问的节点
    int direction;          // 迭代方向:AL_START_HEAD(正向)/AL_START_TAIL(反向)
} listIter;

/* 迭代方向常量 */
#define AL_START_HEAD 0  // 从表头到表尾(next 指向 head->next)
#define AL_START_TAIL 1  // 从表尾到表头(next 指向 tail->prev)

链表本体(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;      // 链表长度(节点总数):O(1) 获取
} list;

函数指针的作用(类型无关核心)

Redis 链表通过 dup/free/match 函数指针,实现「同一链表结构支持任意类型值」:

  • 示例 1:存储 SDS 时,free 设为 sdsfreematch 设为 sdscmp
  • 示例 2:存储整数时,free 设为 NULL(无需释放),match 设为整数比较函数;
  • 示例 3:存储自定义结构体时,自定义 dup/free/match 函数。
相关推荐
曹牧11 分钟前
Oracle:字段为值列表
数据库·oracle
亮子AI18 分钟前
【Prisma】如何修复(重建)已经损坏的迁移历史?
数据库·prisma
+VX:Fegn089529 分钟前
计算机毕业设计|基于springboot + vue职位管理推荐系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
热爱专研AI的学妹1 小时前
【搭建工作流教程】使用数眼智能 API 搭建 AI 智能体工作流教程(含可视化流程图)
大数据·数据库·人工智能·python·ai·语言模型·流程图
DBA小马哥1 小时前
国产数据库加速替代Oracle:聚焦信创背景下的平滑迁移与性能突破
数据库·oracle
漂亮的小碎步丶1 小时前
【7】SQL性能优化实践:EXPLAIN解读+慢查询分析+移动代理商结算案例
数据库·sql性能优化
小股虫2 小时前
从Tair虚拟桶到数据库分库分表:解耦逻辑与物理的架构艺术
数据库·架构·解耦
车载测试工程师2 小时前
CAPL学习-CAN相关函数-CANdb API类函数
网络·数据库·学习·capl·canoe
默 语2 小时前
RAG实战:用Java+向量数据库打造智能问答系统
java·开发语言·数据库
北极糊的狐2 小时前
若依报错org.springframework.dao.DataIntegrityViolationException
数据库·mysql