Redis设计与实现 (二): 链表

  

Redis实现为双链表结构, 列表键的底层实现之一就是链表,  发布与订阅, 慢查询, 监视器等功能都用到了链表. Redis本身也使用链表维持多个客户端.

节点定义, 位于 adlist.h/listNode

typedef struct listNode {

 // 前置节点
 struct listNode *prev;

 // 后置节点
 struct listNode *next;

 // 节点的值
 void *value;

} listNode;

链表结构定义, 位于adlist.h/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;

Redis链表特性总结 :

  1. 双端链表, 获取前驱和后置都为O(1);
  2. 无环, 表头的前驱和表尾的后置都为NULL;
  3. 带头指针和尾指针;
  4. 带链表长度计数器;
  5. 多态,  void * 保存点值,  通过list结构的dup, free, match三个属性设置节点特定函数, 所以可以用链表保存不同类型的值.
时间: 2024-10-03 22:25:35

Redis设计与实现 (二): 链表的相关文章

学习笔记-Redis设计与实现-链表

链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过删除节点来灵活地调整链表地长度. 当一个列表键包含了数量比较多地元素,又或者列表中包含的元素都是比较长的字符串时,Redis就会使用链表作为列表键的底层实现. 出了链表键之外,发布与订阅.慢查询.监视器等功能也用到了链表,Redis服务器本身还使用链表来保存多个客户端的状态信息,以及使用链表来构建客户端输出缓冲区(Output buffer) 3.1 链表和链表节点的实现 Redis的链表实现的特性总结如下: 双端:链表节点带有

Redis设计与实现(一~五整合版)【搬运】

Redis设计与实现(一~五整合版) by @飘过的小牛 一 前言 项目中用到了redis,但用到的都是最最基本的功能,比如简单的slave机制,数据结构只使用了字符串.但是一直听说redis是一个很牛的开源项目,很多公司都在用.于是我就比较奇怪,这玩意不就和 memcache 差不多吗?仅仅是因为memcache是内存级别的,没有持久化功能.而redis支持持久化?难道这就是它的必杀技? 带着这个疑问,我在网上搜了一圈.发现有个叫做huangz的程序员针对redis写了一本书叫做<redis设

《Redis设计与实现剖析- 前言》

现如今Redis已经不折不扣的成为缓存技术中的主流中间件,基本上大型的系统都会选择Redis缓存来提升系统性能. 由于在目前开发项目中也有使用Redis,在使用以及了解Redis的过程中被Redis优秀的设计与实现所吸引,Redis本身是基于C语言实现的高级应用,Redis内部也大量使用了经典数据结构(数组,链表,Hash表,队列,堆,跳跃表),刚好最近在巩固加深数据结构与算法这方面的基本功,所以就萌出了通过剖析Redis内部实现的方式,来复习巩固C语言的知识及其高级应用和经典数据结构的原理及其

Redis设计与实现 pdf扫描版【65M】高清下载

<Redis设计与实现>全面而完整地讲解了Redis的内部机制与实现方式,对Redis的大多数单机功能以及所有多机功能的实现原理进行了介绍,展示了这些功能的核心数据结构以及关键的算法思想,图示丰富,描述清晰,并给出大量参考信息.通过阅读本书,读者可以快速.有效地了解Redis的内部构造以及运作机制,更好.更高效地使用Redis. <Redis设计与实现>主要分为四大部分.第一部分“数据结构与对象”介绍了Redis中的各种对象及其数据结构,并说明这些数据结构如何影响对象的功能和性能.

《Redis设计与实现》读书笔记

花了几天时间把<Redis设计与实现>读完了,把一些心得记下来给大家分享. 第2章 简单动态字符串 redis里面的字符串对象都采用SDS结构实现.SDS有别于C风格的字符数组和java的String(定长).这种结构更像C++的String或者java的ArrayList<Character>.长度动态可变. redis的所有键值及字符串字面量都采用这种结构. 这一章节花了十几页去讲这个SDS结构,感觉全是废话,有时间建议去看ArrayList的源码. 第3章 链表 redis的

《Redis设计与实现》

<Redis设计与实现> 基本信息 作者: 黄健宏 丛书名: 数据库技术丛书 出版社:机械工业出版社 ISBN:9787111464747 上架时间:2014-6-3 出版日期:2014 年6月 开本:16开 页码:1 版次:1-1 所属分类:计算机 > 数据库 > 数据库理论 > 综合 更多关于>>> <Redis设计与实现>   内容简介 书籍 计算机书籍 <redis设计与实现>全面而完整地讲解了redis的内部机制与实现方式,

《Redis设计与实现》[第一部分]数据结构与对象-C源码阅读(一)

一.简单动态字符串SDS 关键字:空间预分配,惰性空间释放,二进制安全 C字符串不易更改,所以Redis中把C字符串用在一些无须对字符串值进行修改的地方,作为字符串字面量(String literal),比如打印日志: redisLog(REDIS_WARING, "Redis is now ready to exit, bye bye-"); 在Redis数据库中,包含字符串的键值对在底层都是由SDS实现的. SDS还被用作缓冲区(buffer):AOF模块中的AOF缓冲区,以及客户

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

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

用MongoDB数据库来管理办公系统中文档型的表单和信息——通用流程化应用审批单设计思路(二,续)

1.办公系统中文档的定义 办公系统中的文档就是指对数据不敏感的业务,例如流程中的审批单.信息专栏.数据上报.信息记录等.而对于这些信息的管理,特别是时效性较强的管理记录,仍采用关系型数据库进行管理. (1)流程中审批单 流程中审批单由功能按钮区.特殊功能区.业务表单区.附件区.审批意见区等区域构成,其中,业务表单区理论上包含附件和意见,但是由于附件和意见的业务特殊性,需要单独进行管理,剩下的业务表单就可以看作文档了. 在一些流程审批业务中,业务信息有的是以Excel或word文件等方式专递,这样