redis底层数据结构之双向链表(linkedlist)
双向链表(linkedlist)
redis的双向链表(linkedlist)是基于链表的一种数据结构
链表是一种常见的基础数据结构,是一种非顺序存储数据的线性表,在每一个节点里存储了下一个节点的指针
链表充分利用内存实现灵活的内存动态管理,但是失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大
1 list结构
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;
其中:
head:表头节点
tail:表尾节点
len:包含的节点数量
(*dup)函数:节点值复制函数
(*free)函数:节点值释放函数
(*match)函数:节点值比较函数,比较是否相等
2 listNode(链表节点)结构
typedef struct listNode {
struct listNode *prev;
struct listNode *next;
void *value;
} listNode;
其中:
prev:前置节点
next:后置节点
value:当前节点的值
3 linkedlist结构示意图
拥有4个节点的linkedlist示意图如下:

4 redis中linkedlist特性
1) 双向: linkedlist的每个节点都包含前置节点和后置节点的指针
2) 无环: 头节点的prev指针和尾节点的next指针都指向 NULL
3) 常数时间复杂度获取linkedlist长度:len属性获取链表长度的时间复杂度为O(1)
redis底层数据结构之双向链表(linkedlist)的更多相关文章
- Redis 底层数据结构介绍
Redis 底层数据结构 版本:2.9 支持的数据类型: 字符串 散列 列表 集合 有序集合 字符串 Redis 利用原生的 c 字符串进行了一次封装.封装的字符串叫做简单动态字符串:SDS(simp ...
- Redis底层数据结构详解
上一篇说了Redis有五种数据类型,今天就来聊一下Redis底层的数据结构是什么样的.是这一周看了<redis设计与实现>一书,现来总结一下.(看书总是非常烦躁的!) Redis是由C语言 ...
- 【redis】redis底层数据结构原理--简单动态字符串 链表 字典 跳跃表 整数集合 压缩列表等
redis有五种数据类型string.list.hash.set.zset(字符串.哈希.列表.集合.有序集合)并且自实现了简单动态字符串.双端链表.字典.压缩列表.整数集合.跳跃表等数据结构.red ...
- Redis学习笔记(二)redis 底层数据结构
在上一节提到的图中,我们知道,可以通过 redisObject 对象的 type 和 encoding 属性.可以决定Redis 主要的底层数据结构:SDS.QuickList.ZipList.Has ...
- redis底层数据结构--简单动态字符串 链表 字典 跳跃表 整数集合 压缩列表
1.动态字符串 redis中使用c语言的字符床存储字面量,默认字符串存储采用自己构建的简单动态字符串SDS(symple dynamic string) redis包含字符串的键值对都是用SDS实现的 ...
- redis 底层数据结构 压缩列表 ziplist
压缩列表是列表键和哈希键的底层实现之一.当一个列表键只包含少量列表项,并且每个列表项要么就是小整数,要么就是长度比较短的字符串,redis就会使用压缩列表来做列表键的底层实现 当一个哈希键只包含少量键 ...
- redis 底层数据结构 整数集合intset
整数集合是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时Redis就会使用整数集合作为集合键的底层实现 整数集合是Redis用于保存整数值的集合抽象数据结构,它可以保存 ...
- Redis底层数据结构实现
REDIS 较宽泛的支持5种数据结构 分别为 字符串 列表 集合 散列 有序集合 关于这几种数据结构的使用 相信网上有很多资料,查看官网API 也很详细了 读者可以自己随意翻阅 很方便 . 接下 ...
- Redis 底层数据结构之压缩列表
文章参考:<Redis 设计与实现>黄建宏 压缩列表 压缩列表 ziplist 是列表键和哈希键的底层实现之一.当一个列表键只包含少量列表项,并且每个列表项要么就是小整数值,要么就是长度比 ...
- Redis 底层数据结构之跳跃表
文章参考 <Redis 设计与实现>黄建宏 Redis(2) 跳跃表 跳跃表 跳跃表 skiplist 是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节 ...
随机推荐
- forms组件渲染标签、展示信息、校验数据的一些补充,forms组件参数和源码剖析,modelform组件,Django中间
今日内容 forms组件渲染标签 forms组件渲染标签的方式1 <p>forms组件渲染标签的方式1</p> {{ form_obj.as_p }} {{ form_obj. ...
- C#爬虫开发小结
前言 2023年以来一直很忙,临近春节,各种琐事更多,但鸽了太久没写文章总是不舒坦,忙中偷闲来记录下最近用C#写爬虫的一些笔记. 爬虫一般都是用Python来写,生态丰富,动态语言开发速度快,调试也很 ...
- 轻松理解Promise.all 、Promise.then、Promise.race有什么区别以及使用方法
简单来说呢,Promse.all一般应用于某个场景需要多个接口数据合并起来才能实现 有个极大地好处我必须说一下,请求顺序和获取数据顺序是一样的哟,大可放心使用~~ const success1 = n ...
- c++代码实现中时间复杂度的不断优化
先来介绍一下时间复杂度: 同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率.算法分析的目的在于选择合适算法和改进算法. 计算机科学中,算法的时间复杂度是一个函数,它定量描述了该 ...
- Java入门与进阶P-4.3+P-4.4
循环控制 素数 只能被1和自己整除的数,不包括1 2 3 5 7 11 13 17 19 ... 1.循环控制语句 可以在满足循环条件的请款下,反复的执行某一段代码,这段被重复执行的代码被称为循环体语 ...
- java helloworld demo
大二的时候写过 web 仅限于 idea 配合 springboot, 学习的时候需要写个 java demo 或者算法, 居然不知道怎么写了 首先创建一个文件夹, 写上你的代码, 因为是demo, ...
- xml基本学习
概念:可拓展标记语言.可拓展即标签都是自定义的.标记语言即由标签构成的语言. 功能:存储数据: 配置文件 在网络中传输 语法 基本语法: xml文件后缀名为.xml xml第一行必须定义为文档声明 x ...
- try...catch中finally子句的使用
目录: finally的使用 finally面试题 final.finally.finalize的区别 finally子句的使用: 1.在finally子句中的代码是最后且一定会执行的,即使try语句 ...
- honoka和格点三角形
题目: honoka最近在研究三角形计数问题.她认为,满足以下三个条件的三角形是"好三角形".1.三角形的三个顶点均为格点,即横坐标和纵坐标均为整数.2.三角形的面积为 .3.三角 ...
- H5与原生APP调了交互方式
APP中不支持position:fixed; 改成 position:absolute; 触发H5按钮跳转APP原生页,进入调取APP的名传自己的方法 <a href="javascr ...