`
xpenxpen
  • 浏览: 725167 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

redis源码阅读笔记(2)——adlist

阅读更多
adlist(A doubly linked list)是Redis里实现的一个双向链表。

1.高层视角解读
请先看这篇文章
链表和链表节点的实现
链表的数据结构如图所示:


2.底层代码
请看adlist.h, adlist.c,很简单的,学过数据结构的看这个一般没问题。

3.疑难点解惑
Q:节点的值定义为void *value;
void *什么意思?
A:void pointer, 或者叫general purpose pointer,可以用来存储任意类型变量的地址。

例子
void *ptr;    // ptr is declared as Void pointer

char cnum;
int inum;
float fnum;

ptr = &cnum;  // ptr has address of character data
ptr = &inum;  // ptr has address of integer data
ptr = &fnum;  // ptr has address of float data


这个例子说明了void *可以指向char型,也可以指向int或者float型变量。

redis中listNode的节点的值定义为void *value;这样节点所保存的值就可以是任意类型。


Q: 这段代码
   // 节点值复制函数
    void *(*dup)(void *ptr);

    // 节点值释放函数
    void (*free)(void *ptr);

    // 节点值对比函数
    int (*match)(void *ptr, void *key);


为什么free和match前面有1个*,而dup前面有2个*?

A:
(*dup)代表这是一个函数指针,前面的void *代表函数返回值为指针(void *型)
(*free)代表这是一个函数指针,前面的void代表函数没有返回值
(*match)代表这是一个函数指针,前面的int代表函数返回值为int型
3者都有的最后面的(void *ptr)就不用解释了,是参数,接受类型为指针。

调用例子
listDup里
void *value = copy->dup(node->value);

listRelease里
list->free(current->value);

listSearchKey里
int result = list->match(node->value, key);


分享到:
评论

相关推荐

    redis源码阅读笔记(6)——ziplist

    Redis是一款高性能的键值对数据库,其内部使用了许多优化的数据结构来存储数据,其中ziplist是Redis为了节省内存而设计...在阅读Redis源码时,深入分析ziplist的实现细节将有助于我们更好地理解和调试Redis的内存管理。

    redis源码阅读笔记(10)——事件

    在Redis源码阅读笔记(10)——事件中,我们将探讨Redis如何利用事件模型来实现非阻塞I/O,以及相关的编程模型如Reactor模式和NIO。 Redis使用了一个基于epoll的事件处理器,epoll是Linux系统提供的一种高效I/O多路...

    redis源码阅读笔记(7)——对象

    这篇源码阅读笔记主要关注Redis中的对象系统,它是Redis实现高效数据操作的关键。 在Redis中,每个数据都有一个特定的对象类型,比如`OBJ_STRING`、`OBJ_HASH`等,这些类型定义了数据的存储方式和操作行为。对象...

    redis源码阅读笔记(1)——sds

    本篇笔记将聚焦于Redis源码中的“sds”(Simple Dynamic Strings,简单动态字符串)部分,这是Redis中处理字符串的基础数据结构。 首先,我们要明白sds是什么。在C语言中,字符串是以字符数组的形式存在的,而sds是...

    redis源码阅读中文分析注释

    redis源码阅读中文分析注释

    redis安装遇到的问题——linux centos7.5

    Redis 安装遇到的问题——Linux Centos7.5 Redis 是一个开源的、基于内存的数据结构存储系统,常用于数据库、缓存、消息队列等场景。但是,在 Linux Centos7.5 环境中安装 Redis 时可能会遇到一些问题,这篇文章将...

    redis/phpredis源码及文档

    Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 附件里面包括redis源码,phpredis源码,redis指令及文档

    Redis全套学习笔记 (带章节目录) 完整版pdf

    Redis,即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。...本文适合Redis初学者和进阶者阅读,是一份全面而实用的学习笔记。

    scala连接redis哨兵模式 demo 使用scala的redis库(csdn)————程序.pdf

    2. 使用的库和依赖:该代码示例使用了rediscala库来实现Scala与Redis之间的交互。具体版本为rediscala_2.12,版本号为1.9.0。在Maven或SBT中添加rediscala库作为依赖项是连接Redis的重要步骤。 3. ...

    狂神redis源码笔记.rar

    通过阅读“狂神redis源码笔记”和解压的“redis-study”文件,你将能够深入理解Redis的内部运作,掌握Java客户端的使用技巧,提升在实际项目中运用Redis的能力。这包括但不限于了解Redis的设计模式、源码实现细节、...

    redis的可视化工具——redisdesktopmanager

    2. **连接管理**:你可以保存多个Redis服务器的连接配置,包括主机名、端口、密码和认证方式,便于快速切换和管理多个实例。 3. **数据浏览与编辑**:通过键值对的形式展示Redis中的数据,支持多种数据类型,如字符...

    redis源码资源下载

    Redis(Remote Dictionary Server),即远程字典服务,是一个开源的、高性能的、基于内存的Key-Value数据库,它使用ANSI C语言编写,支持网络,并提供了多种语言的API。Redis以其丰富的数据结构、高性能、持久化特性...

    Redis全套学习笔记 完整版pdf.rar

    Redis全套学习笔记 完整版pdf.rar set:添加键值对 get:获取值 apend:追价值 strlen:获取值的长度 setnx:key不存在时,设置key的值 incr:原子递增1 decr:原子递减1 incrby/decrby:递增或者递减指定的数字 ...

    Redis全套学习笔记-带章节目录-114页.pdf

    Redis全套学习笔记 Redis是一种基于内存的NoSQL数据库,具有高性能、可扩展性和灵活性等特点。以下是Redis的详细知识点: 安装和启动 * 安装Redis可以通过下载软件包或使用yum、apt-get等安装工具进行安装。 * ...

    Redis Windows源码

    在Windows环境下,Redis的源码分析和部署对于开发者来说具有重要意义,尤其是在Windows服务端开发中。以下是对"Redis Windows源码"的详细解析: 1. Redis核心架构: Redis基于单线程模型,通过事件驱动机制处理...

    redis源码安装以及配置

    **一、Redis源码安装** 1. **下载源码** 首先,我们需要从Redis官方网站或者GitHub仓库下载源码。在这个例子中,我们使用的是`redis-2.8.9.tar.gz`。你可以通过命令行工具如`wget`或`curl`来下载,或者直接在网页...

    Redis全套学习笔记

    Redis 安装简单,可以通过源码编译或使用包管理器安装。启动Redis有前台和后台两种方式,后台启动更常见。Redis 可通过`redis-cli`命令行工具进行交互,提供一系列命令用于操作数据库。 2. Redis 数据类型: - **...

Global site tag (gtag.js) - Google Analytics