標籤:nosql資料庫 redis 記憶體資料庫 結構
上次剛剛分析過了用戶端的結構體分析,思路比較簡答,清晰,最後學習的是服務端的實現,服務端在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 redisDb3.typedef struct multiCmd4.typedef struct multiState5.typedef struct blockingState6.typedef struct readyList7.typedef struct redisClient /* Redis用戶端結構體 */8.struct saveparam9.struct sharedObjectsStruct10.typedef struct zskiplistNode11.typedef struct zskiplist12.typedef struct zset13.typedef struct clientBufferLimitsConfig 14.typedef struct redisOp15.typedef struct redisOpArray16.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源碼分析(三十四)--- redis.h服務端的實現分析(1)