? ? ?上次剛剛分析過了客戶端的結構體分析,思路比較簡答,清晰,最后學習的是服務端的實現,服務端在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的結構定義非常類似,里面包含了一堆的屬性,長長的一排下來。
- 前言
- (一)--Redis結構解析
- (二)--結構體分析(1)
- (三)---dict哈希結構
- (四)-- sds字符串
- (五)--- sparkline微線圖
- (六)--- ziplist壓縮列表
- (七)--- zipmap壓縮圖
- (八)--- t_hash哈希轉換
- (九)--- t_list,t_string的分析
- (十)--- testhelp.h小型測試框架和redis-check-aof.c日志檢測
- (十一)--- memtest內存檢測
- (十二)--- redis-check-dump本地數據庫檢測
- (十三)--- redis-benchmark性能測試
- (十四)--- rdb.c本地數據庫操作
- (十五)--- aof-append only file解析
- (十六)--- config配置文件
- (十七)--- multi事務操作
- (十八)--- db.c內存數據庫操作
- (十九)--- replication主從數據復制的實現
- (二十)--- ae事件驅動
- (二十一)--- anet網絡通信的封裝
- (二十二)--- networking網絡協議傳輸
- (二十三)--- CRC循環冗余算法和RAND隨機數算法
- (二十四)--- tool工具類(2)
- (二十五)--- zmalloc內存分配實現
- (二十六)--- slowLog和hyperloglog
- (二十七)--- rio系統I/O的封裝
- (二十八)--- object創建和釋放redisObject對象
- (二十九)--- bio后臺I/O服務的實現
- (三十)--- pubsub發布訂閱模式
- (三十一)--- latency延遲分析處理
- (三十二)--- redis-cli.c客戶端命令行接口的實現(1)
- (三十三)--- redis-cli.c客戶端命令行接口的實現(2)
- (三十四)--- redis.h服務端的實現分析(1)
- (三十五)--- redis.c服務端的實現分析(2)
- (三十六)--- Redis中的11大優秀設計