redis(8)——客户端

来源:互联网 发布:windows安装器安装xp 编辑:程序博客网 时间:2024/06/06 05:49

一、客户端的数据结构

        对于每个与服务器进行连接的客户端,服务器都为这些客户端建立了相应的redis.h/redisClient结构(客户端状态),这个结构保存了客户端当前的状态信息,以及执行相关功能时需要用到的数据结构,其中包括:

        客户端的套接字描述符。客户端状态的fd属性记录了客户端正在使用的套接字描述符,根据套接字的不同区分客户端为伪客户端还是普通客户端。

        客户端的名字。在默认情况下,一个连接到服务器的客户端是没有名字的。

        客户端的标志值(flag ):客户端的标志属性flags记录了客户端的角色(role ),以及客户端目前所处的状态。

        指向客户端正在使用的数据库的指针,以及该数据库的号码。

        客户端当前要执行的命令、命令的参数、命令参数的个数,以及指向命令实现函数的指针。

        客户端的输人缓冲区:用于保存客户端发送的命令请求。

        客户端的输出缓冲区:执行命令所得的命令回复会被保存在客户端状态的输出缓冲区里面,每个客户端都有两个输出缓冲区可用,一个缓冲区的大小是固定的(保存那些长度比较小的回复),另一个缓冲区的大小是可变的(保存那些长度比较大的回复)

        客户端的复制状态信息,以及进行复制所需的数据结构。

        客户端执行BRPOP,BLPOP等列表阻塞命令时使用的数据结构。

        客户端的事务状态,以及执行WATCH命令时用到的数据结构。

        客户端执行发布与订阅功能时用到的数据结构。

        客户端的身份验证标志。

        客户端的创建时间,客户端和服务器最后一次通信的时间,以及客户端的输出缓冲区大小超出软性限制(soft limit)的时间。

二、创建和关闭普通客户端

1、创建普通客户端

        如果客户端是通过网络连接与服务器进行连接的普通客户端,那么在客户端使用connect函数连接到服务器时,服务器就会调用连接事件处理器,为客户端创建相应的客户端状态,并将这个新的客户端状态添加到服务器状态结构clients链表的末尾。


2、关闭普通客户端

        一个普通客户端可以因为多种原因而被关闭:

        如果客户端进程退出或者被杀死,那么客户端与服务器之间的网络连接将被关闭,从而造成客户端被关闭。

        如果客户端向服务器发送了带有不符合协议格式的命令请求,那么这个客户端也会被服务器关闭。

        如果客户端成为了CLIENTKILL命令的目标,那么它也会被关闭。

        如果用户为服务器设置了timeout配置选项,那么当客户端的空转时间超过timeout选项设置的值时,客户端将被关闭。不过timeout选项有一些例外情况:如果客户端是主服务器(打开了REDIS_MASTER标志),从服务器(打开了REDIS_SLAVE标志),正在被BLPOP等命令阻塞(打开了REDIS_BLOCKED标志),或者正在执行SUBSCRIBE, PSUBSCRIBE等订阅命令,那么即使客户端的空转时间超过了timeout选项的值,客户端也不会被服务器关闭。

        如果客户端发送的命令请求的大小超过了输入缓冲区的限制大小(默认为1 GB ),那么这个客户端会被服务器关闭。

        如果要发送给客户端的命令回复的大小超过了输出缓冲区的限制大小,那么这个客户端会被服务器关闭。

3、关闭伪客户端

        lua_client伪客户端在服务器运行的整个生命期中会一直存在,只有服务器被关闭时,这个客户端才会被关闭。

        服务器在载入AOF文件时,会创建用于执行AOF文件包含的Redis命令的伪客户端,并在载入完成之后,关闭这个伪客户端。


原创粉丝点击