【redis】redis客户端管理

1.client list 

client list命令能够列出与redis服务端连接的所有客户端连接信息。

192.168.1.7:6379> client list
id=243 addr=192.168.1.7:56452 fd=7 name= age=1228 idle=1226 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=keys
id=247 addr=192.168.1.7:56460 fd=8 name= age=30 idle=30 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=command
id=248 addr=192.168.1.7:56462 fd=9 name= age=27 idle=27 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=command
id=249 addr=192.168.1.7:56464 fd=10 name= age=25 idle=25 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=command
id=250 addr=192.168.1.7:56466 fd=11 name= age=5 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client

(1)标识 id,addr,fd,name 
id:客户端连接的唯一标识符。这个ID是随着redis的连接自增的,重启redis后会重置为0;
addr:客户端连接的IP和端口。
fd:socket的文件描述符,与lsof命令结果中的fd是同一个,如果fd=-1代表
当前客户端不是外部客户端,而是redis内部的伪装客户端。
name:客户端的名称,后面的client setName和client getName两个命令会对其进行说明。

(2)输入缓冲区:qbuf,qbuf-free 
redis为每个客户端分配了输入缓冲区,它的作用时将客户端的命令临时保存,
同时redis会从输入缓冲区拉取命令并执行,输入缓冲区为客户端发送命令到redis 
执行命令提供了缓冲功能。

client list中qbuf和qbuf-free分别代表这个缓冲区的总容量和剩余容量,
redis没有提供相应的配置来规定每个缓冲区的大小,输入缓冲区会根据输入 
内容大小的不同动态调整,只是要求每个客户端缓冲区的大小不能超过1G,
超过后客户端会被关闭。

输入缓冲区使用不当会产生两个问题。
(1)一旦某个客户端输入缓冲区超过1G,客户端将会被关闭。
(2)输入缓冲区不受maxmemory控制,假设一个redis实例设置了maxmemory为4G;
已经存储了2G数据,但是如果此时输入缓冲区使用3G,已经超出maxmemory限制,
可能会产生数据丢失,键值淘汰,OOM等情况。

输入缓冲区过大的原因。
输入缓冲区过大主要是因为redis的处理速度跟不上输入缓冲区的输入速度,
并且每次进入输入缓冲区的命令包含了大量bigkey,从而造成了换入缓冲区过大的情况。
还有一种情况是redis发送了阻塞,短期内不能处理命令,造成了客户端输入的命令
积压在了输入缓冲区。


--监控输入缓冲区有两种方法。
(1)通过定期执行client list命令,收集qbuf和qbuf-free找到异常的连接记录
并分析,最终得到出问题的客户端。
(2)通过info命令的info clients模块,找到最大的输入缓冲区。


192.168.1.7:6379> info clients
# Clients
connected_clients:5
client_longest_output_list:0
client_biggest_input_buf:0  --最大的输入缓冲区。
blocked_clients:0

--对比client list,info clients 
client list:能精准分析每个客户端定位问题。
执行速度较慢(尤其在连接数较多的情况下)频繁执行存在阻塞redis的可能。

info clients:
执行速度比client list快,分析过程较为简单。
不能精准定位到客户端 
不能显示所有输入缓冲区的总量,只能显示最大值。

(3)输出缓冲区 
obl,oll,omem 
redis为每个客户端分配了输出缓冲区,它的作用时保存命令执行的结果返回给客户端。
为redis和客户端交互返回结果提供缓冲。
与输入缓冲区不同的是,输出缓冲区的容量可以通过参数client-output-buffer-limit 
来进行设置,并且输出缓冲区做得更加细致,按照客户端的不同分为三种:
普通客户端,发布订阅客户端,slave客户端。

client-output-buffer-limit [class] [hard limit] [soft limit][soft seconds]
[class]:客户端类型:normal:普通客户端,slave:slave客户端,pubsub:发布订阅客户端。
[hard limit]如果客户端使用的输出缓冲区大于[hard limit],客户端会被立即关闭。
[soft limit]和[soft seconds]:如果客户端使用的输出缓冲区超过了[soft limit]
并且持续了[soft seconds]秒,客户端会被立即关闭。 

默认配置:
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等情况。 

输出缓冲区由两部分组成,固定缓冲区(16K)和动态缓冲区,其中固定缓冲区返回比较
小的执行结果。而动态缓冲区返回比较大的结果:例如大的字符串,hgetall,
smembers等命令的结果。
固定缓冲区使用的是字节数组,动态缓冲区使用的是列表。当固定缓冲区写满后会
将redis新的返回结果存放在动态缓冲区的队列中,队列中的每个对象就是每个返回结果。

client list中的obl代表固定缓冲区的长度,oll代表动态缓冲区列表的长度,
omem代表使用的字节数。

监控输出缓冲区的方法依然有两种:
通过定期执行client list命令,收集obl,oll,omem找到异常的连接记录并分析,
最终找到可能出问题的客户端。
通过info 命令的info clients模块,找到输出缓冲区列表最大对象数。

192.168.1.7:6379> info clients
# Clients
connected_clients:5
client_longest_output_list:0 --输出缓冲区列表最大对象数。
client_biggest_input_buf:0
blocked_clients:0

client_longest_output_list输出缓冲区列表最大对象数。
相比输入缓冲区,输出缓冲区出现异常的概率会比较大。
--如何预防输出缓冲区异常。
监控,并设置阈值,超过阀值及时处理。
限制普通用户客户端输出缓冲区的[hard limit][soft limit][soft seconds]
把错误扼杀在摇篮中。
client-output-buffer-limit normal 20mb 10mb 120 

适当增大slave的输出缓冲区的[hard limit][soft limit][soft seconds]
如果master节点写入较大,slave客户端的输出缓冲区可能会比较大,一旦slave 
客户端连接因为输出缓冲区溢出被kill,会造成复制重连。
限制容易让缓冲区增加的命令,例如,高并发下的monitor就是一个危险的命令。
及时监控内存,一旦发现内存抖动频繁,可能就是输出缓冲区过大。

(4)客户端存活状态
client list中的age 和idle分别代表当前客户端已经连接段时间和最近一次的空闲时间。
age=idle说明连接上来一直就是空闲状态。

客户端的限制maxclients 和timeout 
redis提供了maxclients参数来限制最大客户端了连接数,一旦连接数超过
maxclients,新的连接将被拒绝。maxclients默认值10000,可以通过info clients;
来查询redis的连接数。

--检查当前的配置。
192.168.1.7:6379> config get maxclients
1) "maxclients"
2) "10000"

192.168.1.7:6379> config set maxclients 50
OK
192.168.1.7:6379> config rewrite
OK
192.168.1.7:6379> config get maxclients
1) "maxclients"
2) "50"
--可以将适合孩子持久化到配置文件中。
[root@oracle1 redis6379]# more redis6379.conf 
port 6379
logfile "/data/redis6379/redis.log"
dir "/data/redis6379"
daemonize yes
bind 192.168.1.7
# Generated by CONFIG REWRITE
slowlog-log-slower-than 20000
slowlog-max-len 1000
#requirepass myredis
#masterauth myredis
maxclients 50

一般来说maxclients=10000在大部分场景下已经绝对够用,但是某些情况下
由于业务方使用不当可能存在大量idle连接,无论是从网络连接的成本
还是超过maxclients的后果来说都不是什么好事,因此redis提供了
timeout,单位秒,空闲超过这个时间超过这个自动断开。

192.168.1.7:6379> config get timeout
1) "timeout"
2) "0"
--默认是0,即永久连接。

--设置空闲5分钟,就自动断开。
192.168.1.7:6379> config set timeout 300
OK
192.168.1.7:6379> config rewrite 
OK

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值