Redis源码分析(三十四)--- redis.h服务端的实现分析(1)

上次刚刚分析过了客户端的结构体分析,思路比较简答,清晰,最后学习的是服务端的实现,服务端在Redis可是重中之重,里面基本上囊括了之前模块中涉及到的所有知识点,从redis的头文件就可以看出了,redis.h代码量就已经破1000+行了,而且都还只是一些变量,宏定义的声明,和一些方法原型的声明。所以,今天的总结跟昨天一样,先不做具体的实现学习,先从全局的角度思考,服务端的整体设计思路,这从头文件的声明正好可以学习。

/* ----------------------- 声明了一下所需的头文件,主要为各种结构体的操作文件 -------------------- */
#include "ae.h"      /* Event driven programming library  事件驱动库*/
#include "sds.h"     /* Dynamic safe strings  动态字符串库 */
#include "dict.h"    /* Hash tables 哈希字典 */
#include "adlist.h"  /* Linked lists 普通双向链表 */
#include "zmalloc.h" /* total memory usage aware version of malloc/free 内存申请管理库 */
#include "anet.h"    /* Networking the easy way  网络操作库 */
#include "ziplist.h" /* Compact list data structure  压缩列表 */
#include "intset.h"  /* Compact integer set structure 整形set结构体 */
#include "version.h" /* Version macro  版本号文件*/
#include "util.h"    /* Misc functions useful in many places 同样方法类*/
#include "latency.h" /* Latency monitor API 延时监视方法 */
#include "sparkline.h" /* ASII graphs API  微线图库 */

/* -----------------------------根据模块的不同,宏定义了不同的变量 ---------------- */
/* 1.Error codes Redis错误码*/
/* 2.Static server configuration  server中的一些静态变量值*/
/* 3.Protocol and I/O related defines  协议和I/O相关变量的定义*/
/* 4.Hash table parameters 哈希表的参数*/
/* 5.Command flags 命令行操作的flag定义*/
/* 6.Object types Object的类型,包括List,String,Hash等*/
/* 7.Objects encoding Object的编码类型*/
/* 8.Defines related to the dump file format RDB的保存格式,14位,32位等*/
/* 9.AOF states  AOF文件的状态*/
/* 10.Client flags 客户端的flag标示*/
/* 11.Client request types 客户端的请求类型,INLINE和MULTIBULK*/
/* 12.Client classes for client limits 客户端的类型*/
/* 13.Slave replication state replication状态*/
/* 14.List related stuff 列表位置,head或tail*/
/* 15.Sort operations 排序操作类型,升序或是降序等等*/
/* 16.Log levels 日志级别*/
/* 17.Anti-warning macro... 警告信息*/
/* 18.Append only defines 追加操作变量*/
/* 19.Zip structure related defaults ziplist压缩列表变量*/
/* 20.HyperLogLog defines HLLC的变量定义*/
/* 21.Sets operations codes 设置操作的操作码*/
/* 22.Redis maxmemory strategies Redis内存操作策略*/
/* 23.Scripting */
/* 24.Units 时间单位,微妙和毫秒*/
/* 25.SHUTDOWN flags */
/* 26.Command call flags, see call() function */
/* 27.Command propagation flags, see propagate() function */
/* 28.Keyspace changes notification classes. 通知类型*/

/*-----------------------------------------------------------------------------
 * Data types 数据类型的相关定义
 *----------------------------------------------------------------------------*/
1.typedef struct redisObject /* Redis Object对象 */
2.typedef struct redisDb
3.typedef struct multiCmd
4.typedef struct multiState
5.typedef struct blockingState
6.typedef struct readyList
7.typedef struct redisClient  /* Redis客户端结构体 */
8.struct saveparam
9.struct sharedObjectsStruct
10.typedef struct zskiplistNode
11.typedef struct zskiplist
12.typedef struct zset
13.typedef struct clientBufferLimitsConfig
14.typedef struct redisOp
15.typedef struct redisOpArray
16.struct redisServer /* Redis服务端结构体的定义 */
17.struct redisCommand /* Redis服务端Command命令结构体的定义 */

/*-----------------------------------------------------------------------------
 * Functions prototypes 方法原型
 *----------------------------------------------------------------------------*/
/* 1.Utils 通用类的方法*/
/* 2.networking.c -- Networking and Client related operations 网络操作类方法*/
/* 3.List data type 列表操作方法*/
/* 4.MULTI/EXEC/WATCH... 命令执行方法*/
/* 5.Redis object implementation Redis Object对象方法*/
/* 6.Synchronous I/O with timeout I/O同步类方法*/
/* 7.Replication 主从复制方法*/
/* 8.Generic persistence functions 持久化加载的一些方法*/
/* 9.AOF persistence AOF日志文件持久化方法*/
/* 10.Core functions 核心类方法*/
/* 11.Sorted sets data type 排序set集合方法*/
/* 12.Set data type set类型数据操作方法*/
/* 13.Hash data type 哈希类型方法操作方法*/
/* 14.Pub / Sub 发布订阅方法*/
/* 15.Keyspace events notification ketSpace事件通知方法*/
/* 16.Configuration 配置类方法*/
/* 17.db.c -- Keyspace access API db相关的方法*/
/* 18.Sentinel */
/* 19.Scripting */
/* 20.Git SHA1 */
/* 21.Commands prototypes 命令原型方法*/

主要4个大模块

1.引用头文件声明

2.宏定义变量定义

3.数据结构体的声明

4.方法原型声明

在这里特别提出,在 代码中遍地出现的RedisObject,RedisClient,RedisServer的结构定义,都是在这个文件中定义的。

/* The actual Redis Object */
#define REDIS_LRU_BITS 24
#define REDIS_LRU_CLOCK_MAX ((1<<REDIS_LRU_BITS)-1) /* Max value of obj->lru */
#define REDIS_LRU_CLOCK_RESOLUTION 1 /* LRU clock resolution in seconds */
typedef struct redisObject {
    unsigned type:4;
    unsigned encoding:4;
    unsigned lru:REDIS_LRU_BITS; /* lru time (relative to server.lruclock) */
    int refcount;
    void *ptr;
} robj;

RedisClient,RedisServer的结构定义非常类似,里面包含了一堆的属性,长长的一排下来。

时间: 2024-11-07 07:19:29

Redis源码分析(三十四)--- redis.h服务端的实现分析(1)的相关文章

JAVA之旅(三十四)——自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫

JAVA之旅(三十四)--自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫 我们接着来说网络编程,TCP 一.自定义服务端 我们直接写一个服务端,让本机去连接,可以看到什么样的效果 package com.lgl.socket; import java.io.IOException; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; publ

hbase源码系列(十四)Compact和Split

先上一张图讲一下Compaction和Split的关系,这样会比较直观一些. Compaction把多个MemStore flush出来的StoreFile合并成一个文件,而Split则是把过大的文件Split成两个. 之前在Delete的时候,我们知道它其实并没有真正删除数据的,那总不能一直不删吧,下面我们就介绍一下它删除数据的过程,它就是Compaction. 在讲源码之前,先说一下它的分类和作用. Compaction主要起到如下几个作用: 1)合并文件 2)清除删除.过期.多余版本的数据

Redis源码解析(十五)--- aof-append only file解析

继续学习redis源码下的Data数据相关文件的代码分析,今天我看的是一个叫aof的文件,这个字母是append ONLY file的简称,意味只进行追加文件操作.这里的文件追加记录时为了记录数据操作的改变记录,用以异常情况的数据恢复的.类似于之前我说的redo,undo日志的作用.我们都知道,redis作为一个内存数据库,数据的每次操作改变是先放在内存中,等到内存数据满了,在刷新到磁盘文件中,达到持久化的目的.所以aof的操作模式,也是采用了这样的方式.这里引入了一个block块的概念,其实就

Android 源码系列之&lt;十四&gt;从源码的角度深入理解LeakCanary的内存泄露检测机制(下)

转载请注明出处:http://blog.csdn.net/llew2011/article/details/52958567 在上边文章Android 源码系列之<十三>从源码的角度深入理解LeakCanary的内存泄露检测机制(中)由于篇幅原因仅仅向小伙伴们讲述了在Android开发中如何使用LeakCanary来检测应用中出现的内存泄露,并简单的介绍了LeakCanary的相关配置信息.根据上篇文章的介绍我们知道LeakCanary为了不给APP进程造成影响所以新开启了一个进程,在新开启的

three.js 源码注释(十四)Math/Sphere.js

商域无疆 (http://blog.csdn.net/omni360/) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:商域无疆 -  本博客专注于 敏捷开发及移动和物联设备研究:数据可视化.GOLANG.Html5.WEBGL.THREE.JS,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 俺也是刚开始学,好多地儿肯定不对还请见谅. 以下代码是THREE.JS 源码文件中Math/Sphere.js文件的注释. 更多更新在 : https://github

Redis源码解析(三):redis之数据类型String

sds(简单动态字符串)是redis底层的字符串表示,它具有字符串对象化和替代char*的作用.数据库中的值类型包括字符串,哈希表,列表,集合和有序集合,但是键类型却总是字符串. typedef char *sds; struct sdshdr { // buf 已占用长度 int len; // buf 剩余可用长度 int free; // 实际保存字符串数据的地方 char buf[]; }; redis构建了自己的类型系统,所有的键.值.参数都是有类型的,在redis中用redisObj

Redis源码解析(十六)--- config配置文件

每个系统都会有类似一个config配置文件,config文件里的内容想想都知道,一定就是那么一些固定的一行行的属性代码了,今天在看redis代码中的config属性,那拉下来的一笔,的确多,目测在50至100个属性左右.如果就此将config每个属性代表什么意思不是我的风格,也一定是很乏味的,所以我的特点就是在代码中去理解程序员在写这类代码时的思路,和茫茫代码中的亮点.我们知道,redis运行的环境包括很多种的,windows,Linux,mac os等等,不同的操作系统,当然有些属性就不能支持

J.U.C并发框架源码阅读(十四)ScheduledThreadPoolExecutor

基于版本jdk1.7.0_80 java.util.concurrent.ScheduledThreadPoolExecutor 代码如下 /* * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * * * * * * * * * * * * * * * * * * * * */ /* * * * * * * Written by Doug Lea with assistance from members of

yii2源码学习笔记(十四)

Module类是模块和应用类的基类. yiisoft\yii2\base\Module.php 1 <?php 2 /** 3 * @link http://www.yiiframework.com/ 4 * @copyright Copyright (c) 2008 Yii Software LLC 5 * @license http://www.yiiframework.com/license/ 6 */ 7 8 namespace yii\base; 9 10 use Yii; 11 us