redis Client命令

最后更新:2020-04-15

CLIENT LIST 返回所有连接到服务器的客户端信息和统计数据

127.0.0.1:6379> client list
id=10227 addr=27.38.49.148:32595 fd=105 name= age=26102951 idle=26102951 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=info
id=10230 addr=27.38.49.148:32025 fd=117 name= age=26102920 idle=26102920 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=info
id=10229 addr=27.38.49.148:31852 fd=116 name= age=26102951 idle=26102951 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=info
id=10245 addr=27.38.49.148:32080 fd=124 name= age=26102768 idle=26102768 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=info

下面是各字段的含义::

  • id: 唯一的64位的客户端ID(Redis 2.8.12加入)。
  • addr: 客户端的地址和端口
  • fd: 套接字所使用的文件描述符
  • age: 以秒计算的已连接时长
  • idle: 以秒计算的空闲时长
  • flags: 客户端 flag,后面描述
  • db: 该客户端正在使用的数据库 ID
  • sub: 已订阅频道的数量
  • psub: 已订阅模式的数量
  • multi: 在事务中被执行的命令数量
  • qbuf: 输入缓冲区的长度(字节为单位, 0 表示没有分配输入缓冲区)
  • qbuf-free: 输入缓冲区剩余空间的长度(字节为单位, 0 表示没有剩余空间)
  • obl: 输出缓冲区(固定缓冲区)的长度(字节为单位, 0 表示没有分配输出缓冲区)
  • oll: 输出缓冲区列表(动态缓冲区列表)包含的对象数量(当输出缓冲区没有剩余空间时,命令回复会以字符串对象的形式被入队到这个队列里)
  • omem: 输出缓冲区和输出列表占用的内存总量
  • events: 文件描述符事件
  • cmd: 最近一次执行的命令

输入缓存区 redis会为每个客户端分配输入缓冲区,它的作用是将客户端发送的命令临时保存,同时redis会从输入缓冲区拉取命令并执行。

  • 一旦某个客户端的输入缓冲区超过1G,客户端将会被关闭
  • 输入缓冲区不受maxmemory控制,如果输入缓冲区+实际存储数据超过了maxmemory,可能会产生数据丢失、键值淘汰、OOM等情况

输入缓冲区过大主要是因为redis的处理速度跟不上输入缓冲区的输入速度,且每次进入输入缓冲区的命令包含了大量的bigkey。还有一种情况是redis发送了阻塞,短期内不能处理命令,造成了客户端输入的命令积压在输入缓冲区 除了client list外还可以通过 info clients找到最大是输入缓冲区

127.0.0.1:6379> info clients
# Clients
connected_clients:237
client_longest_output_list:0
client_biggest_input_buf:0 //最大的输入缓冲区
blocked_clients:0

输出缓冲区 redis为每个客户端分配了输出缓冲区,用于保存命令执行的结果返回给客户端,为redis与客户端的交互返回结果提供缓冲。根据客户端的不同,输入缓冲区分为三种:

  • normal 普通客户端
  • slave slave客户端
  • pubsub 发布订阅客户端

可以通过client-output-buffer-limit参数来设置输出缓冲区

client-output-buffer-limit <class> <hard limit> <soft limit> <soft seconds>
  • class 客户端类型 normal slave pubsub
  • hard limit 如果客户端使用的输出缓冲区打印hard limit,客户端会被立即关闭
  • soft limit和 soft seconds 如果客户端使用的输出缓冲区超过了soft limit并且持续了soft seconds秒,客户端会被立即关闭

redis的默认设置是

client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60

输出缓冲区也不受maxmemory控制,如果输出缓冲区+实际存储数据超过了maxmemory,可能会产生数据丢失、键值淘汰、OOM等情况。 输出缓冲区由两部分组成:固定缓冲区(16KB)和动态缓冲区,其中固定缓冲区返回比较小的执行结果,动态缓冲区返回毕竟大的结果。 固定缓冲区使用的是字节数组,动态缓冲区使用的列表。当固定缓冲区存满后会将redis新的返回结果存放在动态缓冲区的队列中,队列中的每个对象就是每个返回结果。

除了client list外还可以通过 info clients找到最大是输入缓冲区

127.0.0.1:6379> info clients
# Clients
connected_clients:237
client_longest_output_list:0//最大的输出缓冲区
client_biggest_input_buf:0 
blocked_clients:0

相比输入缓冲区,输出缓冲区出现异常的概率更大,预防方法如下:

  • 按上面的方法监控
  • 限制普通客户端饿输出缓冲区
  • 适当增大slave的输出缓冲区,如果master节点写入较大,slave客户端的输出缓冲区可能会比较大,一旦slave的客户端被kill,会造成重连
  • 限制容易让输出缓冲区增大的命令,例如高并发下的monitor命令
  • 及时监控内存的抖动

限制客户端连接数 maxclients参数,默认值10000

127.0.0.1:6379> info clients
# Clients
connected_clients:237 //连接数
client_longest_output_list:0
client_biggest_input_buf:0 
blocked_clients:0

设置连接的最大空闲时间 timeout参数 默认值0 一旦客户端连接的idel超过了timeout,连接将会自动关闭

检测TCP连接活性 tcp-keepalive参数,为0不检测

客户端flag 客户端 flag 可以由以下部分组成:

  • O: 客户端是 MONITOR 模式下的附属节点(slave)
  • S: 客户端是一般模式下(normal)的附属节点
  • M: 客户端是主节点(master)
  • x: 客户端正在执行事务
  • b: 客户端正在等待阻塞事件
  • i: 客户端正在等待 VM I/O 操作(已废弃)
  • d: 一个受监视(watched)的键已被修改, EXEC 命令将失败
  • c: 在将回复完整地写出之后,关闭链接
  • u: 客户端未被阻塞(unblocked)
  • U: 通过Unix套接字连接的客户端
  • r: 客户端是只读模式的集群节点
  • A: 尽可能快地关闭连接
  • N: 未设置任何 flag
Edgar

Edgar
一个略懂Java的小菜比