2.redis学习笔记:redis List底层数据实现(通用双端链表)

redis-5种数据类型底层数据结构 2、其他情况使用跳表,跳表底层是hash表和跳表,hash表存储key value,跳表存储有序双端链表。每个节点有层级和元素,层级节点有一个指向下级节点和下个节点的指针,用于快速查找数据。string类型底层数据结构是动态数组,动态数组扩容规则:当新申请数据小于1m时,扩容至2倍新数据长度+1;从最大层开始查找数据,当前节点值小于查找元素时,查找同层下个节点,如果下个节点指向null,向下跨度查找下一层节点,如果查到数据返回数据否则返回null。当value值是大于39字节的字符串,内部编码是row。 阅读详情

redis List底层数据实现


redis列表使用两种数据结构左为底层实现:
1.双端链表
2.压缩列表

今天我们来介绍redis中的双端链表,在前边的数据结构章节中已经介绍了通用双端链表的实现,在redis数据库中,双端链表还被很多内部模块所应用:
1.事务模块使用双端链表依序保存输入的命令;
2.服务器模块使用双端链表来保存多个客户端;
3.订阅/发送模块使用双端链表来保存订阅模式的多个客户端;
4.事件模块使用双端链表来保存时间事件(time event);

在redis的双端链表中,数据结构可以分为两个部分,一个是控制信息,一个是链表节点信息。

关于redis双端链表的定义和实现在其根目录src/adlist.c和src/adlist.h上进行定义和实现。

//链表控制信息
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;
//链表节点信息
typedef struct listNode {
    struct listNode *prev;    //前驱节点
    struct listNode *next;    //后继节点
    void *value;              //数据域
} listNode;

//迭代器的迭代方向
#define AL_START_HEAD 0
#define AL_START_TAIL 1

值的一提的是链表的遍历操作采用的是迭代器操作,关于迭代器的定义如下所示:

//迭代器定义
typedef struct listIter {
    listNode *next;
    int direction;
} listIter;

不过比较其他开源库的迭代器设计,redis的迭代器设计并不算优雅,在博客<5.数据结构之通用动态数组>章节中,我们介绍了acl库中迭代器的操作,有兴趣的同学可以参考一下。

redis把指针的操作封装成了宏的类型,方便了程序员的使用,不过如果你习惯指针写法也可以采用指针的方式:

//宏定义操作
#define listLength(l) ((l)->len)
#define listFirst(l) ((l)->head)
#define listLast(l) ((l)->tail)
#define listPrevNode(n) ((n)->prev)
#define listNextNode(n) ((n)->next)
#define listNodeValue(n) ((n)->value)

#define listSetDupMethod(l,m) ((l)->dup = (m))
#define listSetFreeMethod(l,m) ((l)->free = (m))
#define listSetMatchMethod(l,m) ((l)->match = (m))

#define listGetDupMethod(l) ((l)->dup)
#define listGetFree(l) ((l)->free)
#define listGetMatchMethod(l) ((l)->match)

redis通用双端链表接口

//接口声明
list *listCreate(void)                        ;    //链表的创建
void listRelease(list *list)                  ;    //链表的释放
list *listAddNodeHead(list *list, void *value);    //链表的头部添加
list *listAddNodeTail(list *list, void *value);    //链表的尾部添加
list *listInsertNode(list *list, listNode *old_node, void *value, int after);    //链表的节点插入
void     listDelNode(list *list, listNode *node)        ;    //链表节点删除
listIter *listGetIterator(list *list, int direction)    ;    //初始化链表迭代器(可以通过direction调整初始化方向,头部或者尾部)
listNode *listNext(listIter *iter)                      ;    //链表的下一个节点(有direction确定是向前遍历还是向后遍历)
void     listReleaseIterator(listIter *iter)            ;    //链表迭代器的释放
list     *listDup(list *orig)                           ;    //链表的拷贝
listNode *listSearchKey(list *l
多目标跟踪中使用trackeval评估dancetrack运行结果 trackeval使用 阅读详情

相关推荐

【5G演进】4G到5G演进之网络架构与协议栈

4G到5G演进之网络架构与协议栈

Learning makes me happy (0^◇^0) 5529

2.4G/4G天线共存方案:Air8101多频段隔离设计实战(附波长计算表)

本文深入探讨了物联网设备中Wi-Fi 2.4GHz与4G LTE天线共存设计的实战方案。针对B40与2.4G频段紧邻带来的干扰挑战,文章系统性地提出了空间隔离、PCB布局优化、结构设计三重防线,并提供了关键的波长计算工具与系统级验证Checklist,旨在帮助工程师将多频段隔离设计从“玄学”变为可执行的工程规范。

weixin_29197051的博客 389

Oracle19c SYSAUX表空间爆满?手把手教你清理SM/ADVISOR和AUDSYS占用(附完整SQL)

本文详细解析了Oracle19c中SYSAUX表空间爆满的常见原因及解决方案,重点针对SM/ADVISOR和AUDSYS组件的空间占用问题提供了完整的SQL清理脚本。通过诊断查询、空间清理和预防性维护策略,帮助DBA有效管理SYSAUX表空间,确保数据库稳定运行。

weixin_28338005的博客 236

“守望先锋”网络同步分析

守望先锋”(Overwatch)是一款由暴雪娱乐开发的团队基础第一人称射击游戏(FPS),于2016年正式发布。游戏以其独特的角色设计、丰富的游戏模式和高度的团队合作性而受到广泛欢迎。类型:第一人称射击(FPS)/多人在线战斗竞技场(MOBA元素)平台玩家人数:每场比赛由两个六人队伍组成,共12名玩家。客户端/服务器模型:在这种模型中,客户端负责处理用户输入和表现逻辑,而服务器则负责游戏的核心逻辑和状态管理。客户端与服务器之间通过网络进行通信,确保游戏状态的一致性。强同步机制。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 426

AgentScope实战训练营- Java从零开始快速构建Agent完整教程

本文基于阿里巴巴开源的 AgentScope Java 框架,从零开始手把手带你构建 AI 智能体应用。内容涵盖环境搭建、基础对话、工具调用、结构化输出、多Agent流水线、Hook可观测性、会话持久化、MCP协议、RAG知识库集成、多模态工具、技能系统、Spring Boot Web部署等21个核心模块,附带完整可运行代码示例,帮助Java开发者快速掌握Agent开发全流程。

program哲学 859

KMD 核心功能模块——命令提交与调度:Ring Buffer 与硬件引擎交互

《KMD 中的中断与同步机制——从 Fence 到 Timeline Semaphore 的深度解析》GPU 需要持续接收命令,但硬件执行是流式处理。Ring Buffer 作为。导致 CVE-2022-1234(GPU 挂起),修复后强制检查。:命令提交延迟从 50μs 降至 5μs(20 倍提升)。,CPU 通过写入该地址更新指针(避免直接操作寄存器)。,实现 CPU 与 GPU 的高效协同。),GPU 读指针更新是硬件自动完成的。(通过硬件状态机),实现真正的零等待。AMDGPU 驱动曾因。

amy_mhd的博客 82

Vue2 - 最新实现接入使用天地图及卫星视图切换功能,在国家天地图上自由切换地图显示类型(卫星视图/地形视图/卫星混合/地形混合/普通视图)vue天地图切换视图显示改成卫星风格,切换地图图层完整代码

vue2,nuxt2,天地图,视图,卫星,地图类型切换,vue天地图,改成卫星视角,在线地图切换,来回切换卫星图,天地图如何实现来回切换卫星图,地形图,卫星视图,vue中使用天地图自定义样式切换地图图层,切换报错,加载出错,卫星图太卡,地图图层更换,vue安装集成天地图详细示例源码,切换地图的样式,在天地图中如何将地图的类型随意更换,提供多种视图模式用户自由点击更换,VUE引入天地图卫星版,详细教程示例源码代码,天地图切换卫星用什么api,卫星视角API方法,vue2卫星天地图,能改地图的显示方式,图层类型

🏆 前端领域优质创作者 4140

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

上一篇: 2.python学习笔记:python操作mysql数据库
下一篇: 7.数据结构之哈希表
linux_player_c
博客等级 码龄13年 214粉丝 134原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值