Redis 命令映射表

Redis 命令映射表初始化

redis 命令映射表存储,使用hashTable

struct redisServer {
	dict *commands;             /* Command table */
}

redis command结构体

最重要的是处理函数,以及name属性


typedef void redisCommandProc(client *c);
typedef int *redisGetKeysProc(struct redisCommand *cmd, robj **argv, int argc, int *numkeys);
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;
    /* What keys should be loaded in background when calling this command? */
    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;
};

redisCommandTable 声明

struct redisCommand redisCommandTable[] = {
    {"module",moduleCommand,-2,"as",0,NULL,0,0,0,0,0},
    {"get",getCommand,2,"rF",0,NULL,1,1,1,0,0},
    {"set",setCommand,-3,"wm",0,NULL,1,1,1,0,0},
   	...
    {"lolwut",lolwutCommand,-1,"r",0,NULL,0,0,0,0,0}
};

将name当作key,redisCommand结构体存储到hash表中

/* Populates the Redis Command Table starting from the hard coded list
 * we have on top of redis.c file. */
void populateCommandTable(void) {
    int j;
    int numcommands = sizeof(redisCommandTable)/sizeof(struct redisCommand);

    for (j = 0; j < numcommands; j++) {
        struct redisCommand *c = redisCommandTable+j;
        char *f = c->sflags;
        int retval1, retval2;

        while(*f != '\0') {
            switch(*f) {
            case 'w': c->flags |= CMD_WRITE; break;
            case 'r': c->flags |= CMD_READONLY; break;
            case 'm': c->flags |= CMD_DENYOOM; break;
            case 'a': c->flags |= CMD_ADMIN; break;
            case 'p': c->flags |= CMD_PUBSUB; break;
            case 's': c->flags |= CMD_NOSCRIPT; break;
            case 'R': c->flags |= CMD_RANDOM; break;
            case 'S': c->flags |= CMD_SORT_FOR_SCRIPT; break;
            case 'l': c->flags |= CMD_LOADING; break;
            case 't': c->flags |= CMD_STALE; break;
            case 'M': c->flags |= CMD_SKIP_MONITOR; break;
            case 'k': c->flags |= CMD_ASKING; break;
            case 'F': c->flags |= CMD_FAST; break;
            default: serverPanic("Unsupported command flag"); break;
            }
            f++;
        }

        retval1 = dictAdd(server.commands, sdsnew(c->name), c);
        /* Populate an additional dictionary that will be unaffected
         * by rename-command statements in redis.conf. */
        retval2 = dictAdd(server.orig_commands, sdsnew(c->name), c);
        serverAssert(retval1 == DICT_OK && retval2 == DICT_OK);
    }
}

处理redis command请求

int processCommand(client *c){
	c->cmd = c->lastcmd = lookupCommand(c->argv[0]->ptr);
	call(c,CMD_CALL_FULL);
	return C_OK;
}
  • c-argv[0]->ptr 为redisCommand名称,例如get set等
  • lookupCommand从server.commands字典向查找到RedisCommand
  • call 调用对应的处理函数
### Redis 命令列表及用法 #### 查看帮助信息 为了方便用户了解不同类别的命令,在 Redis 客户端可以输入 `help` 加上特定标签来查询某类别下的所有命令。例如要查看有关列表(List)的所有命令,可以在客户端执行: ```bash 127.0.0.1:6379> help @list ``` 这会返回一系列与列表相关的操作指令[^1]。 #### 数据类型对应的常用命令 ##### 字符串(String) 对于字符串类型的键值对来说,常见的有设置(`SET`)、获取(`GET`)等基础操作之外还有追加内容到现有字符串末尾的功能(`APPEND`)等等[^2]。 ##### 列表(List) 列表允许存储多个按顺序排列的元素,并支持两端插入/弹出元素等功能。比如向队列头部添加成员可以用`LPUSH`;而从栈顶移除并返回第一个元素则对应着`LPOP`这样的命令。 ##### 集合(Set) 当涉及到无序不重复的数据集时,则需要用到集合这种数据结构。针对单一集合的操作包括但不限于增加新项(`SADD`)、删除指定成员(`SREM`)或是判断某个值是否存在于此集合之中(`SISMEMBER`)等[^4]。 ##### 有序集合(Sorted Set) 除了上述提到过的几种外,还有一种特殊的叫作“有序集合”的东西——它不仅能够保存独一无二的对象而且还能依据分数给它们排序。像把带有权重分值的新记录加入其中就通过`ZADD`完成;若是要找出排名靠前几位或范围内的条目的话就要借助于`ZRANGE`这类函数了。 ##### 散列(Hash) 散列用来表示对象内部属性字段映射关系,即每个 key 下面可关联若干 field-value 对儿。创建更新 hash 表里的域采用`HSET`方法;读取整个hash 或者单独field 的 value 可分别调用`HGETALL` 和 `HGET` 来达成目的。 #### 连接管理和服务器状态监控 除此之外还有一些用于维护连接安全性的命令如认证(`AUTH`)、选择数据库(`SELECT`);另外就是一些有助于管理员掌握当前实例健康状况的方法像是统计性能指标(`INFO`)、配置参数显示修改(`CONFIG GET|SET`)以及持久化策略设定(`SAVE`,`BGSAVE`)等方面的内容也相当重要。 #### 扩展特性 值得一提的是Redis不仅仅局限于简单的key-value存取服务,更提供了诸如发布订阅模式(Pub/Sub),Lua脚本执行环境等一系列高级特性和工具,极大地方便了开发者构建复杂应用场景下的解决方案[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值