REDIS-一条指令是如何被执行的

当我们在使用redis的时候,往往都是在客户端get,set那有没有想过我们发送的命令是如何被执行的呢?

命令请求的执行过程
redis>set key value
OK

在redis客户端执行这条命令的时候,首先客户端会将这个命令转换为协议格式,然后通过连接到服务器的套接字发送给服务器,服务器接收到这条消息之后,将内容转换为具体的执行命令,在判断用户授权信息和其它信息,当验证通过之后就会执行这条命令,命令执行完成之后会进行信息记录和数据统计,然后再将执行结果发送给客户端。

步骤一:用户在客户端键入一条命令

步骤二:客户端将命令转为redis协议然后通过socket发送给服务器

服务端在初始化的时候会创建一个socket监听用于监听链接客户端的socket链接。

/* Open the TCP listening socket for the user commands. */
    if (server.port != 0 &&
        listenToPort(server.port,&server.ipfd) == C_ERR) {
        serverLog(LL_WARNING, "Failed listening on port %u (TCP), aborting.",server.port);
        exit(1);
    }

当socket成功链接之后,客户端就会把用户键入的命令先转换为Redis协议(RESP协议)发送给服务端,这个服务器是为了保障服务器能够快速的理解命令的含义而指定的,如果没有这个协议,那么redis服务端要遍历这个命令来确认这个命令的含义,这明显加到大了服务器的运算量,而发送通信协议就把解析工作交给了客户端,这样就很大程度的提高了服务器的运行速度。

步骤三:服务端接收到命令

服务端先去输入缓冲区(命令通过socket发送到服务器之后,这些解析后的命令会暂存在服务端的输入缓冲区,读取函数会从输入缓冲区读取数据,而不是直接从网络中读取的),然后判断数据的大小的是否超过了系统设置的值(默认1GB),如果超过了就会返回默认值,然后服务器对输入缓冲区的请求命令进行分析,提取命令请求中的命令参数,存储在client对象(在服务端每个链接都有一个client对象)的属性中,如下图。

sdshdr是redis服务器存储字符串的数据结构,没有使用普通的char数组,后面会写一篇文章会详细介绍。

然后分析程序对缓冲区的RESP协议命令进行分析,并将结果在redisClient的argv属性和argc属性里面,如下图。

步骤四:调用命令执行器、执行客户端指定的命令。

接下来命令执行器会在命令表里面(存储了命令的实现信息)找到对应的命令;比如上面的set命令,在命令表中查找到之后,会返回set键对应的redisCommand结构,然后执行前会校验命令参数是否完整有效,校验完成之后就可以调用命令的实现函数了,然后会产生相应的回复命令,这些命令会保存在客户端对象的输出缓冲区里面,比如前面的打印的“OK\r\n”。

步骤五:命令执行起执行后续工作

如果服务器开启了慢查询日志功能,就需要为命令添加一条慢查询日志,还有数据持久化等等其它后续操作。

最后将结果返回给客户端。客户端接收并打印回复命令。

总结

当我们在redis客户端键入一条命令之后,redis客户端会将这条命令通过RESP协议转换为对应的字符命令并且通过socket发送给客户端;客户端会监听这个socket链接,然后从socket缓冲器读取命令,然后分析这个命令得到这个命令对应的执行函数,校验命令参数是否合法,合法的话就会执行对应的执行函数,并将结果缓存在redisClient中,最后执行函数执行后续操作比如说记录日志,持久化等等操作,都执行完毕之后会将缓存的执行结果返回给客户端,客户端打印结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值