redis 数据结构基础 (二) 链表

redis中的链表恐怕是最简单的数据结构了,redis链表中总共有3个数据结构:

listNode:

1 typedef struct listNode {
2     struct listNode *prev; //前向节点指针
3     struct listNode *next; //后续节点指针
4     void *value;  //存储的值,采取void*类型,万能类型,但是少了类型信息
5 } listNode;

从这个上面可以看出,redis的链表是双向链表

list:

typedef struct list {
    listNode *head; //头结点指针
    listNode *tail; //尾节点指针
    void *(*dup)(void *ptr); //复制节点数据的函数指针
    void (*free)(void *ptr); //释放节点数据的函数指针
    int (*match)(void *ptr, void *key); //这个类似于C++中的operator==操作,即判定节点的数据内容和key指向的内容是否匹配
    unsigned long len; //节点的个数
} list;

值得研究一下的是,redis为链表实现了迭代器,迭代器是本文的第三个数据结构:

1 typedef struct listIter {
2     listNode *next; //迭代器指向的节点
3     int direction;  //迭代器前进的方向 表头->表尾 or 表尾->表头?
4 } listIter;

迭代器本身就是一种设计模式,可见C语言一样可以利用各种设计模式

list的操作都非常简单,本文不再分析,简单描述如下: 1 list *listCreate(void); //创建链表 2 void listRelease(list *list); //释放链 3 void listEmpty(list *list); //清空链表中的数据

 4 list *listAddNodeHead(list *list, void *value); //表头添加节点 O(1)
 5 list *listAddNodeTail(list *list, void *value); //表尾添加节点 O(1)
 6 list *listInsertNode(list *list, listNode *old_node, void *value, int after); //插入节点,after参数表明是在该节点前还是该节点后插入该节点 O(1)
 7 void listDelNode(list *list, listNode *node); //删除某节点 O(1)
 8 listIter *listGetIterator(list *list, int direction); //得到链表的迭代器, direction参数表示这是个前向迭代器还是个逆向迭代器
 9 listNode *listNext(listIter *iter); //迭代器指向下一个节点 O(1)
10 void listReleaseIterator(listIter *iter); //释放迭代器
11 list *listDup(list *orig); //复制链表 O(n)
12 listNode *listSearchKey(list *list, void *key); //在链表中查找匹配key的节点, 如果match函数不为空,则调用match函数比较,否则直接判定指针的地址的方式来判定 O(n)
13 listNode *listIndex(list *list, long index); //得到第index个节点,注意index可以为负数,-1代表最后一个,-2代表倒数第二个 O(n)
14 void listRewind(list *list, listIter *li); //重置迭代器到表头,且未前向迭代器 O(1)
15 void listRewindTail(list *list, listIter *li); //重置迭代器到表尾,且未前向迭代器 O(1)16 void listRotate(list *list);  //将表尾的节点作为新的表头 O(1)17 void listJoin(list *l, list *o); //将o链表中的内容增加到o中去, 操作执行完成后,o中的内容被清空 O(n

o

)

redis链表的总结:

1、redis中的链表中直接存储了头节点和尾节点,不是循环链表,到表头和表尾都是O(1)时间

2、添加、删除、插入都是O(1)的时间

3、所有的迭代器操作都是O(1)时间

4、获取链表中数据个数的时间也是O(1)

5、redis结构中设置了dup,free,match三个函数指针,使得对数据的操作和链表操作解耦,其实就是实现了C语言下的多态

时间: 2024-10-16 04:02:18

redis 数据结构基础 (二) 链表的相关文章

02 Redis数据结构基础

一.客户端命令行参数 1.-x 从标准输入读取一个参数,等价于set k v [[email protected] etc]# echo -en 'v1'|redis-cli -a foobared -x set k1 OK [[email protected] etc]# redis-cli -a foobared get k1 "v1" 2.-r 重复执行一个命令指定次数 [[email protected] etc]# redis-cli -a foobared -r 2 get

Redis学习基础二

回顾:上一基础中已了解 ( 什么是redis .redis 的三大特点.安装,和数据配置) 接下来浅尝Redis的数据类型,时间煮雨...... 一.Redis数据类型 redis支持五中数据类型(string字符串.hash哈希.list列表.set集合.zset有序集合) (一)String 字符串 1.string 是redis 中最基本的类型,可以理解成与memcached一模一样的类型,一个key对应一个value 2.string 类型是二进制安全的,意思是redis 的string

Redis数据结构(二)字典

Redis字典其实就是Hash表,其实现和JAVA语言中的hashmap结构大同小异,按Key-Value方式存储键值对,但是又存在一定的差异. java中的hashmap结构即包含hash表,又实现了rehash自我扩充: 而redis字典则通过dictht结构实现hash表,通过字典(dict)实现rehash(字典中包含一个dictht数组dictht ht[2]). Redis字典的实现 Redis字典所使用的哈希表由dict.h/dictht结构定义: typedef struct d

redis使用基础(二) ——Redis数据类型

redis使用基础(二) --Redis数据类型 (转载请附上本文链接--linhxx)  一.概述 Redis是一种Key-Value类型的数据库,属于非关系型数据库,NoSQL的一种.Redis共有5种数据类型:字符串(string).散列(hash).列表(list).集合(set).有序集合(zset). 1.通配符 Redis支持部分通配符,包括?.*.[].\x,和正则表达式一致,?表示匹配0或1个,*匹配任意个,[]匹配框内的任意一个内容,\x转义,例如\?表示匹配?. 2.获取键

数据结构和算法 (二)数据结构基础、线性表、栈和队列、数组和字符串

Java面试宝典之数据结构基础 —— 线性表篇 一.数据结构概念 用我的理解,数据结构包含数据和结构,通俗一点就是将数据按照一定的结构组合起来,不同的组合方式会有不同的效率,使用不同的场景,如此而已.比 如我们最常用的数组,就是一种数据结构,有独特的承载数据的方式,按顺序排列,其特点就是你可以根据下标快速查找元素,但是因为在数组中插入和删除元素会 有其它元素较大幅度的便宜,所以会带来较多的消耗,所以因为这种特点,使得数组适合:查询比较频繁,增.删比较少的情况,这就是数据结构的概念.数据结构 包括

数据结构(二)链表的实现

链表定义:(java版)一种递归的数据结构,他或者为空,或者是指向一个节点的引用,该节点含有一个泛型的元素和指向另一个链表的引用.在这个定义中,节点是一个可能含有任意数据类型的抽象实体,这也是为什么使用泛型来表示的原因. 一:链表构造,节点概述 我们可以使用Node来表示一个结点: private class Node{ Item item;//泛型类型 Node next;//执行下一个节点的引用 } 有必要说明参数item和next的含义:Item:泛型参数,它就好比一个占位符,表示我们希望

算法与数据结构基础11:C++实现——二拆搜索树节点删除

基于我的另一篇文章<算法与数据结构基础4:C++二叉树实现及遍历方法大全> ,二叉树的结构用的这篇文章里的. 二查找叉树的删除可以细分为三种情况: 1 被删除的是叶子节点,直接删除: 2 被删除只有一个子节点,指针下移: 3 有两个子节点,为了不破坏树的结构,需要找出一个节点来替换当前节点. 根据二叉树的特点,当前节点大于所有左子树,小于所有右子树, 可以用左子树中最大的节点,或者右子树最小的节点来替换当前节点,然后删除替换节点. // BSTree.h #include <cstdio

redis学习(二) redis数据结构介绍以及常用命令

redis数据结构介绍 我们已经知道redis是一个基于key-value数据存储的数据结构数据库,这里的key指的是string类型,而对应的value则可以是多样的数据结构.其中包括下面五种类型: 1.string 字符串 string字符串类型是redis最基础的数据存储类型.string是最基础的一种数据类型,其可以拓展为某种特定类型,例如普通文本,json字符串,二进制数据等等.就本质上来说,接下来要介绍的hash,list,set等其内部最基础的组成单位依然是string,只不过re

自己动手实现java数据结构(二) 链表

1.链表介绍 前面我们已经介绍了向量,向量是基于数组进行数据存储的线性表.今天,要介绍的是线性表的另一种实现方式---链表. 链表和向量都是线性表,从使用者的角度上依然被视为一个线性的列表结构.但是,链表内部存储数据的方式却和向量大不相同:链表的核心是节点.节点存储"数据"的同时还维护着"关联节点的引用".要理解链表,首先必须理解链表的内部节点结构. 最简单的链表结构是单向链表,单向链表中的内部节点存储着数据(data)和其关联的下一个节点的引用(next). da