Redis命令执行全过程

这个问题说简单也很简单,无非就是客户端发送命令请求,服务器读取命令请求,然后是命令执行器查找命令实现,执行预备操作,调用命令实现函数,执行后续工作。

但是我们想要了解的不能简简单单的就是这些。下面我们详细的来分析一下Redis命令执行的全过程。

发送命令请求

但用户通过客户端输入一个命令请求的时候,客户端首先会对用户输入的命令请求进行一个格式转换,转换成协议格式,然后通过连接到服务器的套接字把这个已经格式化的命令发送给服务器(服务器是通过套节字和客户端或者是其他服务器连接通信的)

读取命令请求

但客户端与服务器端的套接字因为客户端的写入而变的可读时(这点需要查阅Redis文件事件的内容,这里不再赘述),

服务器会首先读取套接字中的协议格式的命令请求,并将它保存到客户端状态的输入缓冲区中(这里输入缓冲区的大小可以根据输入内容动态的缩小或者扩大,但是最大不能超过1GB否则服务器将关闭这个客户端)

然后服务器对输入缓冲区中的命令请求进行分析,提取命令请求中包含的命令参数,以及参数的个数,然后分别将参数和参数个数保存到客户端状态的argv属性和argc属性中(argv属性是一个数组,数组中的每个项都是一个字符串对象,其中argv[0]是要执行的命令,之后的其他项是传给的命令参数,argc属性负责记录argv数组的长度)

最后是调用命令执行器,执行客户端指定的命令。

命令执行

当服务器分析得到argv和argc属性的值之后,服务器会根据arg[0]的值在命令表中查找所对应的命令实现函数,Redis命令表示一个字典(字典的又一个应用)key是命令的名字,value对应一个redisCommand结构,保存了命令的实现函数、命令的标志、命令应该指定的参数个数、命令总执行次数、总消耗时间等统计信息。

找到实现函数之后并不是真正的执行命令,还需要进行一些检查操作,

检查用户输入的命令名字是否能找到相应的命令实现,

然后检查用户输入的参数个数是否符合要求(redisCommand结构中有个arity属性,如果是 -3 表示输入的参数个数必须大于等于3)

然后还要检查客户端是否通过了身份验证,如果通过了身份验证客户端状态里的authenticated属性的值是1,否则是0(Auth命令)

还有就是内存占用情况、上次执行bgsave出错的话是否打开了stop-writes-on-bgsave-error等等检查。

检查全部通过之后就是调用命令的实现函数,也就是真正的执行命令了,执行完之后会将执行的结果保存客户端状态的输出缓冲区中,输出缓冲区有两个,一个是固定大小16Kb,用来保存长度较小的回复,还有就是可变大小的输出缓冲区,用来保存长度较大的回复【注意:服务器通过两种模式限制客户端输出缓冲区的大小,一种是硬性限制,一种是软性限制,如果超出的硬性限制的大小,服务器立即关闭客户端,如果超出的软性限制,但是没有超硬性限制,那么记录超出的时间,如果一直超出,持续时间超过了设置的时间,那么关闭客户端,相反不会关闭】

最后执行后续的工作,包括更新慢查询日志记录,更新redisCommand结构中的一些统计信息,还有一些持久化操作,复制操作等。

最后的最后就是将结果发送给客户端,仍旧是套接字。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-25 21:23:55

Redis命令执行全过程的相关文章

Redis 命令执行过程(下)

在上一篇文章中<Redis 命令执行过程(上)>中,我们首先了解 Redis 命令执行的整体流程,然后细致分析了从 Redis 启动到建立 socket 连接,再到读取 socket 数据到输入缓冲区,解析命令,执行命令等过程的原理和实现细节.接下来,我们来具体看一下 set 和 get 命令的实现细节和如何将命令结果通过输出缓冲区和 socket 发送给 Redis 客户端. set 和 get 命令具体实现 前文讲到 processCommand 方法会从输入缓冲区中解析出对应的 redi

redis 命令的调用过程

参考文献: Redis 是如何处理命令的(客户端) 我是如何通过添加一条命令学习redis源码的 从零开始写redis客户端(deerlet-redis-client)之路--第一个纠结很久的问题,restore引发的血案 redis命令执行流程分析 通信协议(protocol) Redis主从复制原理 Redis配置文件详解 当用户在redis客户端键入一个命令的时候,客户端会将这个命令发送到服务端.服务端会完成一系列的操作.一个redis命令在服务端大体经历了以下的几个阶段: 读取命令请求

redis如何执行redis命令

Redis 命令 Redis 命令用于在 redis 服务上执行操作.所以我们必须要启动Redis服务程序,也就是redis安装目录下的redis-server.exe,你可以双击执行,也可以打开cmd窗口,将路径定位到Redis安装目录下,通过redis-server命令执行. 要在 redis 服务上执行命令需要一个 redis 客户端.Redis 客户端在我们之前下载的的 redis 的安装包中,也就是redis-cli.exe,同理,可以双击执行也可以通过命令执行. 语法 Redis 客

连接Redis后执行命令错误 MISCONF Redis is configured to save RDB snapshots

今天在redis中执行setrange name 1 chun 命令时报了如下错误提示: (error) MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the er

深入Redis命令的执行过程

深入Redis命令的执行过程 Redis 服务器: Redis 服务器实现与多个客户端的连接,并处理这些客户端发送过来的请求,同时保存客户端执行命令所产生的数据到数据库中.Redis 服务器依靠资源管理器来维持自身的运转,其主要作用是管理 Redis 服务. 服务器处理命令的过程 我们向客户端发送了一条命令:SET city〝beijing〝 第一步 用户将命令 SET city〝beijing〝输入客户端,客户端接收到此命令. 第二步 客户端会先将接收到的命令转化为服务器可以识别的协议格式,然

redis实战笔记(3)-第3章 Redis命令

第3章 Redis命令 本章主要内容 字符串命令. 列表命令和集合命令 散列命令和有序集合命令 发布命令与订阅命令 其他命令 在每个不同的数据类型的章节里, 展示的都是该数据类型所独有的. 最具代表性的命令. 首先让我们来看看, 除了GET和SET之外, Redis的字符串还支持哪些命令. 3.1 字符串 在Redis里面, 字符串可以存储以下3种类型的值. 字节串( byte string) . 整数. 浮点数. 除了自 增操作和自 减操作之外, Redis还拥有对字节串的其中一部分内容进行读

Redis 命令

Redis 命令用于在 redis 服务上执行操作. 要在 redis 服务上执行命令需要一个 redis 客户端.Redis 客户端在我们之前下载的的 redis 的安装包中. 语法 Redis 客户端的基本语法为: $ redis-cli 实例 以下实例讲解了如何启动 redis 客户端: 启动 redis 客户端,打开终端并输入命令 redis-cli.该命令会连接本地的 redis 服务. $redis-cli redis 127.0.0.1:6379> redis 127.0.0.1:

redis命令详解与使用场景举例——String

APPEND key value 如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾. 如果 key 不存在, APPEND 就简单地将给定 key 设为 value ,就像执行 SET key value 一样. 可用版本: 2.0.0+ 时间复杂度: 平摊O(1) 返回值: 追加 value 之后, key 中字符串的长度. 对不存在的 key 执行 APPEND redis> EXISTS myphone # 确保 myphone 不

Redis 命令参考

本文档是 Redis Command Reference 和 Redis Documentation 的中文翻译版: 所有 Redis 命令文档均已翻译完毕, Redis 最重要的一部分主题(topic)文档, 比如事务.持久化.复制.Sentinel.集群等文章也已翻译完毕. 文档目前描述的内容以 Redis 2.8 版本为准, 查看更新日志(change log)可以了解本文档对 Redis 2.8 所做的更新. 你可以通过网址 doc.redisfans.com 在线阅览本文档, 也可以下