博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Redis中的执行命令的过程
阅读量:6648 次
发布时间:2019-06-25

本文共 1689 字,大约阅读时间需要 5 分钟。

Redis中的执行命令的过程

在redis.c的initServerConfig()方法中,通过调用dictCreate方法初始化server端的命令表。这个命令表是一个hashtable,可以通过key找到相关的命令:

/* Command table -- we initiialize it here as it is part of the

  • initial configuration, since command names may be changed via
  • redis.conf using the rename-command directive. */
    server.commands = dictCreate(&commandTableDictType, NULL);

server.orig_commands = dictCreate(&commandTableDictType, NULL);

populateCommandTable();
server.delCommand = lookupCommandByCString("del");
server.multiCommand = lookupCommandByCString("multi");
server.lpushCommand = lookupCommandByCString("lpush");
server.lpopCommand = lookupCommandByCString("lpop");
server.rpopCommand = lookupCommandByCString("rpop");

initServer()函数在初始化服务端的基本配置时,已经提前创建了客户端的回调函数。具体的调用为:

1.创建客户端的文件读事件的回调:acceptTcpHandler/acceptUnixHandler
2.一旦接收到客户端连接请求后,调用acceptCommonHandler()方法。在接收到客户端请求后,可以得到客户端的fd(file description),这个fd在调用acceptCommonHandler时会传入。
3.acceptCommonHandler内部根据fd调用createClient创建redis客户端的上下文信息。
4.createClient内部又创建了一个事件回调函数readQueryFromClient,用于读取客户端的传入的信息。
5.readQueryFromClient从客户端读取实际的请求内容,然后会做一个初步判断客户端的请求内容是否合理。不合理的请求在这里直接被拦截处理了。这里判断请求是否合理主要是判断网络层面的内容是否合理。如果网络层相关的请求合理的话,调用processInputBuffer方法解析客户端的请求类型。
6.processInputBuffer会解析客户端的reqtype是inline还是multibulk的。如果是inline的,调用processInlineBuffer函数类解析出argv/argc;否则调用processMultibulkBuffer。如果argc没有,直接重置客户端;否则调用processCommand方法处理客户端的命令。
7.processCommand首先根据argv的内容,然后调用lookupCommand()方法从server.commands中找到需要执行的命令,然后将找到的命令赋值到client的cmd和lastcmd字段上。
c->cmd = c->lastcmd = lookupCommand(c->argv[0]->ptr);
8.找到相关的命令后,调用call方法,执行客户端的命令。执行命令很简单,因为上一步中已经找到了客户端的cmd了。每个命令都有一个proc方法,方法接受一个redisclient的参数。这里只需要调用c->cmd->proc(),然后将c传入即可。
9.至此,redis执行客户端命令的过程就算结束了。
原文地址

转载地址:http://dtyto.baihongyu.com/

你可能感兴趣的文章
DLL放在指定目录 以及设置dll调用路径
查看>>
是否遇到过rollback segment的状态为need recovery??
查看>>
sbin/hadoop-daemon.sh: line 165: /tmp/hadoop-hxsyl-journalnode.pid: Permission denied
查看>>
什么是IDOC,以及IDOC的步骤
查看>>
windows server 2012搭建sqlserver 2008经验总结
查看>>
关于OCM数量及OCM Profile登记
查看>>
JSON Web Token
查看>>
[20170518]11G审计日志清除3.txt
查看>>
CAP原理和BASE思想
查看>>
经典算法题每日演练——第四题 最长公共子序列
查看>>
Swift游戏实战-跑酷熊猫 02 创建熊猫类
查看>>
VSTO 学习笔记(十)Office 2010 Ribbon开发
查看>>
负载均衡 > 常见问题
查看>>
Spring实战5-基于Spring构建Web应用
查看>>
基于Redis Sentinel的Redis集群(主从Sharding)高可用方案(转)
查看>>
POJ 1936 All in All
查看>>
MyBatis整体Review
查看>>
ffmepg 指定RTSP网络连接模式UDP还是TCP
查看>>
linux挂载u盘
查看>>
jenkins 入门教程(中)
查看>>