redis.h中定了命令的數據結構,而且在redis.c中定義了命令表。redis
struct redisCommand {
char *name;
redisCommandProc *proc;
int arity;
char *sflags; /* Flags as string representation, one char per flag. */
int flags; /* The actual flags, obtained from the 'sflags' field. */
/* Use a function to determine keys arguments in a command line.
* Used for Redis Cluster redirect. */
redisGetKeysProc *getkeys_proc;
int firstkey; /* The first argument that's a key (0 = no keys) */ int lastkey; 說/* The last argument that's a key */
int keystep; /* The step between first and last key */
long long microseconds, calls;
};
複製代碼
/*
* 命令表
*/
struct redisCommand redisCommandTable[] = {
{"get",getCommand,2,"r",0,NULL,1,1,1,0,0},
{"set",setCommand,-3,"wm",0,NULL,1,1,1,0,0},
... // 後面的省略
};
複製代碼
命令的基本結構由命令名稱(name)和實現函數(proc)組成。數據庫
arity表示爲參數的個數,能夠用 -N 表示 >= N。sflags是一個用來表示FLAG的字符串,每一個標誌一個字符。命令中的FLAG首先是設置在sflags上,以後初始化服務器時調用redis.c中的populateCommandTable()函數從 sflags 屬性中計算出真正的 FLAG 到 flags 屬性中。bash
getkeys_proc是從命令中判斷命令的鍵參數。在Redis 集羣轉向時使用。一個可選的函數,用於從命令中取出key參數,僅在如下三個參數都不足以表示key參數時使用。服務器
firstkey爲第一個 key 參數的位置;lastkey爲最後一個 key 參數的位置;keystep爲key參數步長,從 first 參數和 last 參數之間,全部 key 的步數(step)。好比說, MSET 命令的格式爲 MSET key value [key value ...],它的 step 就爲 2。數據結構
microseconds記錄執行這個命令耗費的總微秒數,初始化爲 0。calls記錄命令被執行的總次數,初始化爲 0。less
w: write command (may modify the key space).
寫入命令,可能會修改 key spacedom
r: read command (will never modify the key space).
讀命令,不修改 key space函數
m: may increase memory usage once called. Don't allow if out of memory.
可能會佔用大量內存的命令,調用時對內存佔用進行檢查ui
a: admin command, like SAVE or SHUTDOWN.
管理用途的命令,好比 SAVE 和 SHUTDOWNthis
p: Pub/Sub related command.
發佈/訂閱相關的命令
f: force replication of this command, regardless of server.dirty.
無視 server.dirty ,強制複製這個命令。
s: command not allowed in scripts.
不容許在腳本中使用的命令
R: random command. Command is not deterministic, that is, the same command
with the same arguments, with the same key space, may have different results. For instance SPOP and RANDOMKEY are two random commands. 隨機命令。命令是非肯定性的:對於一樣的命令,一樣的參數,一樣的鍵,結果可能不一樣。好比 SPOP 和 RANDOMKEY 就是這樣的例子。
S: Sort command output array if called from script, so that the output is deterministic. 若是命令在 Lua 腳本中執行,那麼對輸出進行排序,從而得出肯定性的輸出。
l: Allow command while loading the database. 容許在載入數據庫時使用的命令。
t: Allow command while a slave has stale data but is not allowed to server this data. Normally no command is accepted in this condition but just a few. 容許在附屬節點帶有過時數據時執行的命令。 這類命令不多有,只有幾個。
M: Do not automatically propagate the command on MONITOR.
不要在 MONITOR 模式下自動廣播的命令。
k: Perform an implicit ASKING for this command, so the command will be accepted in cluster mode if the slot is marked as 'importing'. 爲這個命令執行一個顯式的ASKING,使得在集羣模式下,一個被標示爲importing的槽能夠接收這命令。