Redis 提供了一些操作客户端(client)的命令,比如查询所有已连接到服务器的客户端数量,控制客户端的连接状态(关闭或者挂起)等。通过客户命令我们可以轻松的实现对客户端的管理、控制。
Redis 服务器通过监听 TCP 端口的方式来接受客户端的连接。当一个连接建立后,Redis 会自动执行以下过程:
Redis 使用命令的格式向客户端输入数据,这个数据量是非常小的。当向客户端输入命令后,我们希望能快速的得到服务器的应答,也就是低延时性,但如果开启了Nagle算法就会出现频繁延时的现象,导致用户体验极差。
TCP_NODELAY 控制是否开启 Nagle 算法,该算法可以提高广域网传输效率,减少分组的报文个数,适合传输体量较大的数据。
Redis 的底层是一个单线程模型,单线程指的是使用一个线程来处理所有的网络事件请求,这样就避免了多进程或者多线程切换导致的 CPU 消耗,而且也不用考虑各种锁的问题。
Redis 为了充分利用单线程,加快服务器的处理速度,它采用 IO 多路复用模型来处理客户端与服务端的连接,这种模型有三种实现方式,分别是 select、poll、epoll。Redis 正是采用 epoll 的方式来监控多个 IO 事件。当客户端空闲时,线程处于阻塞状态;当一个或多个 IO 事件触发时(客户端发起网路连接请求),线程就会从阻塞状态唤醒,并同时使用epoll来轮询触发事件,并依次提交给线程处理。
注意:“多路”指的是多个网络连接,“复用”指的是复用同一个线程。多路 IO 复用技术可以让单个线程高效的处理多个连接请求。
在 Redis 配置文件中,有一个maxclients的配置项,它指定了连接到 Redis 服务器的最大客户端数量。其默认值是 10000。配置项如下所示:
127.0.0.1:6379> config get maxclients 1) "maxclients" 2) "10000" #更改最大连接数量 127.0.0.1:6379> config set maxclients 20000 OK 127.0.0.1:6379> config get maxclients 1) "maxclients" 2) "20000"
命令 | 说明 |
---|---|
CLIENT LIST | 以列表的形式返回所有连接到 Redis 服务器的客户端。 |
CLIENT SETNAME | 设置当前连接的名称。 |
CLIENT GETNAME | 获取通过 CLIENT SETNAME 命令设置的服务名称。 |
CLIENT PAUSE | 挂起客户端连接,将所有客户端挂起指定的时间(以毫秒为计算)。 |
CLIENT KILL | 关闭客户端连接。 |
CLIENT ID | 返回当前客户端 ID。 |
CLIENT REPLY | 控制发送到当前连接的回复,可选值包括 on|off|skip。 |
下面看一组简单的使用示例,如下所示:
127.0.0.1:6379> CLIENT ID (integer) 2557 127.0.0.1:6379> CLIENT LIST id=2556 addr=127.0.0.1:64684 fd=30 name= age=2422 idle=339 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=client id=2557 addr=127.0.0.1:49502 fd=43 name= age=537 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 obl=0 oll=0 omem=0 events=r cmd=client 127.0.0.1:6379> CLIENT REPLY ON OK 127.0.0.1:6379> CLIENT SETNAME "www.cdsy.xyz" OK 127.0.0.1:6379> CLIENT GETNAME "www.cdsy.xyz" 127.0.0.1:6379> CLIENT KILL 127.0.0.1:49502 OK