本教程系列由本人總結,未經本人允許,謝絕轉載。
功能說明:通過修改原始碼的形式,實現redis內建的命令set key value的功能。並且新的命令為make key value,注意,所有修改的源檔案都處於src目錄下面
需要修改的部分:
1 redis.c
該檔案是redis資料庫伺服器端主檔案,也就是main函數入口處。所有的命令定義均在該檔案定義的全域變數中。
struct redisCommand redisCommandTable[] = { {"get",getCommand,2,"r",0,NULL,1,1,1,0,0}, {"make",makeCommand,3,"wm",0,NULL,1,1,1,0,0},//our function {"set",setCommand,-3,"wm",0,noPreloadGetKeys,1,1,1,0,0}, {"setnx",setnxCommand,3,"wm",0,noPreloadGetKeys,1,1,1,0,0}, {"setex",setexCommand,4,"wm",0,noPreloadGetKeys,1,1,1,0,0}, {"psetex",psetexCommand,4,"wm",0,noPreloadGetKeys,1,1,1,0,0}, {"append",appendCommand,3,"wm",0,NULL,1,1,1,0,0}, {"strlen",strlenCommand,2,"r",0,NULL,1,1,1,0,0},......這裡省略.......
結構體redisCommand就是儲存redis資料庫的所有命令。我們在第二行添加了一句:
{"make",makeCommand,3,"wm",0,NULL,1,1,1,0,0},//our function
其中注意,第一個參數為命令,第二個為命令調用的函數,第三個三參數。比如set key value 一共就是三個參數,注意如果輸入命令和參數不同,伺服器端會給出提示。
2 redis.h
該檔案是標頭檔,需要在這裡添加對函數的原型聲明。
/* Commands prototypes */void authCommand(redisClient *c);void pingCommand(redisClient *c);void echoCommand(redisClient *c);void setCommand(redisClient *c);void makeCommand(redisClient *c);void setnxCommand(redisClient *c);...............省略.................
我們在標頭檔上添加我們新的函數原型
void makeCommand(redisClient *c);
3 t_string.c
該檔案是函數的實現檔案。
//add by jianghuiwenvoid makeCommand(redisClient *c){setKey(c->db,c->argv[1],c->argv[2]);addReply(c, shared.ok);return;}void getCommand(redisClient *c) { getGenericCommand(c);}
如上述所示,
void makeCommand(redisClient *c)
就是我們自己定義的實現函數,
其中參數是redisClient *c,也就是用戶端請求(我這裡暫時這麼說,具體的我會在教程做進一步說明)。
setKey(c->db,c->argv[1],c->argv[2]);這裡setKey是一個函數,該函數的作用就是設定資料庫中鍵值的函數,其中第一個參數為系統指定的資料庫,第二個參數為用戶端請求第二個參數,第三個參數為用戶端命令第三個參數。
也就是分別對應:set key value中的key 和value。
addReply(c, shared.ok);是給用戶端返回一個OK訊息,相當於發一個訊號,否則用戶端會等待。
上面三個參數修改完成後,在src上一層目錄進行make,重新編譯,然後運行伺服器端和用戶端
在用戶端輸入make name jiang
再輸入get name
伺服器端會返回jiang。說明執行成功。
如果對於redis安裝或者編譯有疑問,可以在這篇文章下留言,我會儘快回答。
該文章來自IT部落格,http://www.itbuluoge.com。