redis命令支援複雜資料結構BST
一、調研過程:
I 寫操作的流程
- 客戶端向服務端傳送寫操作(資料在客戶端的記憶體中);
- 資料庫服務端接收到寫請求的資料(資料在服務端的記憶體中);
- 服務端呼叫write(2) 這個系統呼叫,將資料往磁碟上寫(資料在系統記憶體的緩衝區中);
- 作業系統將緩衝區中的資料轉移到磁碟控制器上(資料在磁碟快取中);
- 磁碟控制器將資料寫到磁碟的物理介質中(資料真正落到磁碟上)。
II serverCron定期執行函式,檢查{時間段、修改次數}滿足條件,生成rdb檔案。
Redis的CONFIG SET命令在Redis執行時設定規則,不需要重啟Redis
圖1 rdb持久化
圖2 rdb載入
關鍵結構定義rio.h## rio typedef struct _rio rio; 註明:rio.c涉及磁碟和記憶體資料傳輸
III 追蹤t_list持久化過程
為了避免list底層編碼使用ziplist,找到ziplist->linkedlist編碼的切換條件: sdslen(value->ptr) > server.list_max_ziplist_value或者ziplistLen(subject->ptr) >= server.list_max_ziplist_entries;
#define REDIS_LIST_MAX_ZIPLIST_VALUE 1
通過od –c dump.rdb分析rdb檔案
二、程式碼實現:
IV 新增支援t_bst持久化程式碼
rdb.c ## int rdbSaveObjectType(rio *rdb, robj *o) 新增case REDIS_BST
rdb.h ## #define REDIS_RDB_TYPE_BST 5
rdb.c ##int rdbSaveObject(rio *rdb, robj *o)新增t_bst實現
rdb.c ##robj *rdbLoadObject(int rdbtype, rio *rdb) 需要新增t_bst實現
持久化功能完成
對於上面的object encoding tr 不能識別t_bst型別的改進辦法:
{“object”,objectCommand,3,”r”,0,NULL,2,2,2,0,0},
object.c ## char *strEncoding(int encoding)
小貼士:清空資料庫的方法——–1. 刪除redis目錄下(src)所有的*.rdb
2. flushall命令