【Redis专题】redis客户端管理--client list
redis-cli 客户端API# 列出与redis服务器相连的所有客户端连接信息127.0.0.1:6379>client list具体指标描述:id:用户标识addr:用户ip+端口fd:socket的文件描述符name:客户端名字qbuff\qbuff-free:输入缓冲区的总容量和剩余容量(每个客户端缓冲区大小不能超过1g否则关闭客户端);缓冲区的作用是将命令进行临时保存,redis
·
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):
更多推荐
已为社区贡献1条内容
所有评论(0)