redis-cli 客户端API

# 列出与redis服务器相连的所有客户端连接信息
127.0.0.1:6379>client list 

具体指标描述:

  • id:用户标识
  • addr:用户ip+端口
  • fd:socket的文件描述符
  • name:客户端名字
  • qbuff\qbuff-free:输入缓冲区的总容量和剩余容量(每个客户端缓冲区大小不能超过1g否则关闭客户端);缓冲区的作用是将命令进行临时保存,redis会从缓存中拉取命令执行;若Redis的处理速度跟不上输入缓冲区的输入速度,并且每次进入输入缓冲区的命令包含了大量bigkey;还有就是Redis发生了阻塞,短期内不能处理命令,造成客户端输入的命令积压在了输入缓冲区,造成了输入缓冲区过大。典型的:info memory 查看时,出现used memory > max memory 
  • obl\oll\omem:输出缓冲区, 保存命令执行结果返回客户端,为redis与客户端交互提供缓冲,输出缓冲区的容量可以通过参数client-output-buffer-limit设置,同样,输出缓冲区过大,也会有可能会产生数据丢失、键值淘汰、OOM等情况
  • obl:固定缓冲区的长度(16KB)
  • oll:动态缓冲区列表的长度(有配置决定)
  • omem:数据使用缓冲区的字节数
  • age:当前客户端已经连接的时间
  • idle:当前客户端空闲的时间,如果该值等于age的时间,说明该链接一直属于空闲状态,为异常连接
  • flag:当前客户端类型,s-slave,n=normal,o-正在执行monitor命令

redis客户端的其他操作:

# 查看当前客户端连接情况
client list 
# 给客户端设置name属性,可唯一定位客户端来源
client setName xxx 
# 查看name属性
client getName 
# 杀掉某各客户端
client kill ip:port  
# 阻塞客户端毫秒数 
client pause timeout
# 监控redis(所有客户端)正在执行的命令,及其损耗redis性能
monitor 

监控输入缓冲区异常的方法:

  • 通过定期执行client list命令,收集qbuf和qbuf-free找到异常的连接记录并分析,最终找到可能出问题的客户端。
  • 通过info命令的info clients模块,找到最大的输入缓冲区,例如下面命令中的其中client_biggest_input_buf代表最大的输入缓冲区,例如可以设置超过10M就进行报警:

监控输出缓冲区的方法:

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

redis客户端连接设置--maxclients 和 timeout,可通过以下命令查看修改

127.0.0.1:6379> info clients
127.0.0.1:6379> config get maxclients
127.0.0.1:6379> config get timeout
127.0.0.1:6379> config set maxclients 5000
127.0.0.1:6379> config set timeout 30  (秒)

一般来说maxclients=10000在大部分场景下已经绝对够用,但是某些情况由于业务方使用不当(例如没有主动关闭连接)可能存在大量idle连接,无论是从网络连接的成本还是超过maxclients的后果来说都不是什么好事,因此Redis提供了timeout(单位为秒)参数来限制连接的最大空闲时间,一旦客户端连接的idle时间超过了timeout,连接将会被关闭,例如设置timeout为30秒(Redis默认的timeout是0,也就是不会检测客户端的空闲)

# timeout设置非0的话,将Redis的loglevel设置成debug级别,可以如下表示空闲连接了xxs,客户端被Redis关闭:
Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException:
Unexpected end of stream.
12885:M 26 Aug 08:46:40.085 - Closing idle client

所以,在实际开发和运维中,需要将timeout设置成大于0,例如可以设置为300秒,同时在客户端使用上添加空闲检测和验证等等措施,例如JedisPool使用common-pool提供的三个属性:minEvictableIdleTimeMillis、testWhileIdle、timeBetweenEvictionRunsMillis:

  • minEvictableIdleTimeMillis 资源池中资源的最小空闲时间(单位为毫秒),达到此值后空闲资源将被移除。默认值为180000(即3分钟)可根据自身业务决定,一般默认值即可,也可以考虑使用 setMinEvictableIdleTimeMillis(60000)。
  • testWhileIdle 是否在空闲资源监测时通过ping命令监测连接有效性,无效连接将被销毁。默认false建议 setTestWhileIdle(true)。
  • timeBetweenEvictionRunsMillis 空闲资源的检测周期(单位为毫秒)默认为-1(不检测) 建议设置,周期自行选择如 setTimeBetweenEvictionRunsMillis(30000):

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐