千家信息网

Redis怎么执行命令

发表于:2024-11-21 作者:千家信息网编辑
千家信息网最后更新 2024年11月21日,本篇内容介绍了"Redis怎么执行命令"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!处理新连接Red
千家信息网最后更新 2024年11月21日Redis怎么执行命令

本篇内容介绍了"Redis怎么执行命令"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

处理新连接

Redis在initServer()函数中创建循环事件调用了acceptTcpHandler和acceptUnixHandler函数(都在networking.c文件中)来处理接收到的TCP连接和Unix的Sockets连接。这两个函数又调用了acceptCommonHandler()函数,在这个函数中调用了createClient()函数创建一个新的client对象,用来表示一个新的客户端连接。

createClient()函数具体做了哪些事情呢?

首先为变量c分配了内存,接着将Socket连接置为非阻塞状态,并且设置了TCP无延迟。然后创建了File循环事件(aeCreateFileEvent)来调用readQueryFromClient函数。新建的客户端默认连接的是服务器的第一个数据库(编码为0),最后需要设置好客户端的各种属性和状态。

读一个客户端的命令

刚刚我们提到了readQueryFromClient函数,从名称上就能看出来这个函数是用来从客户端读取命令的。下面来看看函数的具体实现。

Redis会先将命令读入缓冲区,一次最多读取的大小是PROTO_IOBUF_LEN(1024*16)bit。然后调用processInputBufferAndReplicate()函数,来处理缓冲区中的数据,如果客户端是master(主从同步过程),那么Redis会计算处理前后缓冲区的不同部分,以确定从节点接收了多少数据。processInputBufferAndReplicate()函数会处理客户端向服务器发送命令和主节点向从节点发送命令这两种情况,不过最后都需要调用processInputBuffer()函数。

processInputBuffer()函数会先判断客户端是否正常,如果出现连接中断或者客户端阻塞等情况,就会立即停止处理命令,不做无用功。然后根据读取的请求生成相应的Redis可以执行的命令(包括参数)。不同的请求类型分别调用processInlineBuffer()和processMultibulkBuffer()函数。生成好命令之后,交给processCommand()(server.c文件中)函数执行,如果返回C_OK则重置客户端,等待下一个命令。如果返回的是C_ERR,则客户端会被销毁(比如执行QUIT命令)。

processCommand()函数会从Redis启动时加载的命令表中查找命令,然后检查命令的执行权限。

如果是cluster,这时会判断key是否属于当前的master,不属于需要返回重定向信息。

如果内存不够用,这里也需要判断一下是否有可以释放的内存,如果没有,就不能执行命令,返回错误信息。

接下来会判断一些不能接收写命令的情况:

  • 服务器不能进行持久化

  • 作为master,没有足够的可用的slave

  • 此服务器为只读的slave,只有它的master可以接收写命令

在订阅模式中,只能接收指定的命令:(P)SUBSCRIBE / (P)UNSUBSCRIBE / PING / QUIT。

当slave和master失联时,只能接收有flag "t"的命令,例如,INFO,SLAVEOF等。

如果命令没有CMD_LOADING标志,并且当前服务器正在加载数据,则不能接收此命令。

对lua脚本的长度进行限制。

进行完上面的各种条件判断之后,才可以真正开始调用call()函数执行命令。

执行命令并返回

call()函数的参数是client类型的,取出cmd成员进行执行。

1/* Call the command. */
2dirty = server.dirty;
3start = ustime();
4c->cmd->proc(c);
5duration = ustime()-start;
6dirty = server.dirty-dirty;
7if (dirty < 0) dirty = 0;

如果是写命令,就会使服务器变"脏",也就是服务器需要标记一下内存中的某些页有了改变。这对于Redis的持久化来说非常重要,它可以知道这个命令影响了多少个key。命令执行完之后并没有结束,call函数还会做一些其他操作。例如记录日志,写AOF文件,向从节点同步命令等。

至于返回值,每个命令有各自的处理方法,我们后面在介绍。

到这里,Redis处理命令的过程也就完成了。

后面我们会再通过具体的命令来对这个过程做一个更清晰的介绍。

"Redis怎么执行命令"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

命令 函数 客户 客户端 处理 服务器 服务 内存 情况 数据 节点 过程 文件 缓冲区 缓冲 不同 接下来 事件 信息 内容 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全新一代密码技术 数据库原理基本表是什么 网络安全品牌 福建私有云空间解决方案服务器 aia友邦保险软件开发 数据库详细页设计 国家网络安全培训心得体会 数据库开发三大范式 莱西安卓软件开发哪家靠谱 小学生网络安全小论文 服务器为什么选择独立ip 组态软件开发程序 数据库判断字符串是纯数字的函数 数据库导出功能测试用例 网络技术与安全专业就业方向 10.2软件开发人员薪金 睿亁互联网科技有限公司 数据库添加数据字典 上海矩丰互联网科技有限公司 长穗偃麦草基因组数据库 登录系统数据库说明文档 傲智诺巨网络技术有限公司 组态软件开发程序 密码网络安全防护技术 网络安全大整治 专业放心的服务器安全防护 郑州工控软件开发价钱是多少 浪潮服务器价格成本分析 国家网络安全产业园动工 战术小队为什么没有服务器连接
0