在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执行客户端命令的过程就算结束了。

Redis中的执行命令的过程的更多相关文章

  1. Redis中的Scan命令踩坑记

    1 原本以为自己对redis命令还蛮熟悉的,各种数据模型各种基于redis的骚操作.但是最近在使用redis的scan的命令式却踩了一个坑,顿时发觉自己原来对redis的游标理解的很有限.所以记录下这 ...

  2. 如何在sublime编辑器中,执行命令行脚本

    我有个愿意,在执行命令行时,不打开那个黑乎乎命令行窗口,如果编辑器内置支持就好了. 打开vs code 和 sublime,分别按快捷键 Ctrl + ·(tab键上面那个键),vs code可以提供 ...

  3. php中代码执行&&命令执行函数

    转自i春秋 1.eval()函数 #传入的参数必须为PHP代码,既需要以分号结尾. #命令執行:cmd=system(whoami); #菜刀连接密码:cmd <?php @eval($_POS ...

  4. Redis中的Scan命令的使用

    Redis中有一个经典的问题,在巨大的数据量的情况下,做类似于查找符合某种规则的Key的信息,这里就有两种方式,一是keys命令,简单粗暴,由于Redis单线程这一特性,keys命令是以阻塞的方式执行 ...

  5. Redis中info all命令解析

    127.0.0.1:8376> info all# Server    --- 服务器信息redis_version:2.8.20 -- redis服务器版本redis_git_sha1:000 ...

  6. shell 脚本中后台执行命令 &

    最近遇到一个问题, 执行脚本,脚本调用 一个命令,命令(deamon)是一个守护进程,为了调试,取消了守护进程模式.导致命令后边的其他命令(echo "456")都无法执行. de ...

  7. redis中setbit bitcount命令详解

    bitmap,位图,即是使用bit. redis字符串是一个字节序列. 1 Byte = 8 bit SETBIT key offset value 设置或者清空key的value(字符串)在offs ...

  8. cmd到指定目录并执行命令 mysql到bin目录并执行命令 cmd bat进入指定文件夹中并执行命令

    其实就一条命令:(保存为bat格式,注意:有两个and希腊字母 && )cmd /k "cd /d Your ProjectPath&&Your CMD co ...

  9. Redis中的常用命令哪些?

    a.hset 存储一个哈希键值对的集合 b.hget获取一个哈希键的值c.hdel 删除一个或多个字段 d.hgetall 获取一个哈希是键值对的集合 e.lpush key value向链表左侧添加 ...

随机推荐

  1. 鸟哥私房菜--进程SELinux

    程序--binary file 进程(PID)--进行中的程序 服务--常驻内存的进程(crond atd 网络...) 父进程 fork()and exec()子进程(PID PPID) ps -l ...

  2. 画PCB

    1.AD16Design中Boardshape没有redefine board shape选项来修改板子的形状:{ 解决办法:在英文输入模式下按“1”键整个界面会变绿,此时就会有redefine bo ...

  3. 1-C++的并发世界

    1.1 何谓并发 并发的两种方式 多核机器上的真正并行 单核机器的任务切换 并发的两种途径 多进程并发 1.1 多进程并发需要通过操作系统进行进程间通信 多线程并发 2.1 多线程并发需要共享内存 1 ...

  4. Java 使用 Jxl 实现 Excel 导入导出

    开发过程中经常需要用到数据的导入导出功能,之前用的是POI,这次使用JXL,JXL相对于POI来说要轻量简洁许多,在数据量不大的情况下还是非常实用的.这里做一下使用JXL的学习记录.首先需要导入相应的 ...

  5. Hadoop 多表关联

    一.实例描述 多表关联和单表关联类似,它也是通过对原始数据进行一定的处理,从其中挖掘出关心的信息.下面进入这个实例. 输入是两个文件,一个代表工厂表,包含工厂名列和地址编号列:另一个代表地址列,包含地 ...

  6. 从零开始单排学设计模式「UML类图」定级赛

    阅读本文大概需要 3.5 分钟. 本篇是设计模式系列的开篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统. 所以现在打算重写,加上距离现在也有一段时间了, ...

  7. PowerShell 实现批量下载文件

    简介 批量文件下载器 PowerShell 版,类似于迅雷批量下载功能,且可以破解 Referer 防盗链 源代码 [int]$script:completed = 0 # 下载完成数量 [int]$ ...

  8. Python - 一些值得阅读的PEP

    1- PEP简介 PEP是Python增强提案(Python Enhancement Proposal)的缩写.社区通过PEP来给Python语言建言献策,每个版本的新特性和变化都是通过PEP提案经过 ...

  9. Xamarin.Android 解决打开软键盘导致底部菜单上移问题

    在界面布局中有EditText控件,该控件一旦获取焦点则打开软键盘,如果布局中有底部菜单,那么底部菜单可能会被软键盘顶在其上面,看如下效果: 解决方法:在活动绑定界面之前写上下段代码即可 Window ...

  10. 如何配置React Native真机调试-iOS

    说在前面,本教程是建立在项目已经成功在模拟器上运行的基础上,如果你是还未配置好环境的新手,建议先从官网快速入门开始:官网英文版 . 中文版 ok, 切入正题,当你已经完成好环境配置,在模拟器上成功的运 ...