深入浅出Redis 请求的处理过程(redis请求过程)
Redis是一种高效、可扩展的内存数据库,如今,它已经成为许多应用之中必用的工具。在本文中,我将深入浅出地介绍Redis请求的处理过程。
客户端将请求发送到Redis服务器,该请求分为几个步骤:
* 第一步,请求编码。客户端使用Redis客户端库(比如hiredis)来编码请求数据,然后将编码的数据发送到Redis服务器。
/* encode()函数示例 */
void encode(struct redisCommand *cmd, int argc, const char **argv){
/* Header */ char *s = sdsnewlen(NULL, REDIS_INLINE_MAX_SIZE);
s = sdscatprintf(s, "*%d\r\n$%zd\r\n", argc, strlen(cmd->name));
/* Command name */ s = sdscatlen(s, cmd->name, strlen(cmd->name));
s = sdscatlen(s, "\r\n", 2);
/* Arguments */ int i;
for (i = 0; i s = sdscatprintf(s, "$%zd\r\n", strlen(argv[i]));
s = sdscatlen(s, argv[i], strlen(argv[i])); s = sdscatlen(s, "\r\n", 2);
}
/* Send command to server */ rediSendCommandToServer(cmd, s);
}
* 第二步,Redis服务器解码请求。Redis服务器会收到客户端发送过来的编码后的请求,然后采用反序列化算法(Protocol Deserialization)将其解码成可读的格式,然后分析请求的内容。
* 第三步,执行请求的命令。Redis服务器根据解码的请求内容,选择相应的处理函数执行请求的命令,处理函数函数根据请求,操作Redis服务器内存,更新数据。
* 第四步,客户端接收响应数据。Redis服务器完成命令操作后,会将结果返回给客户端,客户端再采用Seralization(序列化)算法将响应结果编码成二进制数据,然后发送给客户端。
/* Serialization()函数示例 */
void Serialization(redisClient *c, robj *o){
/* Header */ size_t len;
char buf[128];
if (o->encoding == REDIS_ENCODING_INT) { len = ll2string(buf, sizeof(buf), (long)o->ptr);
} else { len = sdslen(o->ptr);
}
/* Type */ redisClientReplyType(c, o->type);
/* Length */ if (o->encoding == REDIS_ENCODING_RAW) {
redisClientReplyLongLong(c, len); } else if (o->type == REDIS_STRING) {
redisClientReplyLongLong(c, len); }
/* Content */ redisClientReply(c, buf, len);
}
综上,Redis请求处理过程包含了客户端编码请求数据、Redis服务器解码请求、执行命令以及客户端接收响应结果这四个步骤,即将收到的编码请求解码后,执行函数的处理,然后再将响应结果序列化之后发送到客户端,从而完成了一个请求的处理过程。