命令表在src/redis.c文件的靠顶部的位置。它是一个数组,数组的元素类型是redisCommand
结构体。redisCommand是在src/redis.h中定义的。在
redisCommandTable的上方有一块比较详细的注释,对它的每一个field做了解释。下面是get命令的定义:
1
|
{
"get"
,
getCommand
,
2
,
"r"
,
0
,
NULL
,
1
,
1
,
1
,
0
,
0
}
,
|
第一个field是命令的名字“get”。第二个field是一个函数指针,指向这个命令的具体实现(你可以查看实现细节t_string.c)。
第三个field是命令的参数数量限制(命令接收的参数个数)。指定这个,意味着在调用函数指针之前,查找和执行命令的代码可以做一个预先验证。这种做法减少了在每个命令函数必须的错误处理代码。参数的个数算上了命令名字本身,所以它只接受两个参数:它自己的名字,key的名字(我们要获取它的值)。
第四个field,被设为”r”,用来指明这个命令是只读的,不能修改这个key的value或状态。有一大堆的字母标志,你都可以用在这个位置。而且在附近的注释块中,每个字母标志都有详细的解释。紧跟这个field的field总是被设置为0,后面会用来计算。它只是第四个field的字符串包含信息的位掩码。
第六个field是NULL,因为它只有在你要用复杂的逻辑去告诉Redis哪个参数才是真正的key的时候才需要。一个key指向一个存储在Redis中的值的引用,对应简单的参数,例如我们的max参数。这种机制,允许Redis在调用命令的实现之前,提取key的值(并且校验key是否存在)。如果这个field被设置了值,那么它将会是一个函数指针,指向的函数会返回一个参数索引的整型数组(db.c中的zunionInterGetKeys是一个示例)。在get命令(其他大部分命令)的场景下,这个数组的信息传达的信息跟后面三个field的一样。get命令只有一个参数,而它就是key。因此,第一个参数(key)在位置1上,最后一个参数(也是key)在位置1上,从第一个参数到最后一个参数的增量也是1(译者注:源码注释是:intkeystep;/* The step between first and last key */)。
redisCommand
的最后两个field是命令的度量项,由Redis来设置,并且总是初始化为0。
在命令表的底部加上我们的命令:
1
|
{
"rand"
,
randCommand
,
2
,
"rRl"
,
0
,
NULL
,
0
,
0
,
0
,
0
,
0
}
|
命令的名字是“rand”,randCommand指向实现的指针(还未实现),它接收2个参数(命令名字和max)。至于标志,它是只读的(r),返回随机的,不确定的输出(R),而且它可以在Redis还在加载数据的时候使用(l)。它没有关键参数。