redis服务端连接却没有释放,这个问题就是因为redis默认timeout没有做修改,无论连接是否空闲,长期保持连接状态。
- redis client list 查看连接数
相关参数解释
Redis CLIENT LIST命令用于返回所有连接到服务器的客户端信息和统计数据。 返回值 bulk-string-reply: 一个独特的字符串,格式如下: 每个已连接客户端对应一行(以 LF 分割) 每行字符串由一系列 属性=值(property=value) 形式的域组成,每个域之间以空格分开。 下面是各字段的含义:: 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: 最近一次执行的命令
优化方案
- 通过ip排查对应的service服务,查看是否可以进行优化。
- config get timeout
命令查看空闲超时时间
0 默认不开启 - config set timeout 60
建议为0,有用分布式锁的情况下,看业务场景
- 配置默认空闲超时时间为60s
- config rewrit 保存
可在redis.conf 配置文件中添加重启生效。
- 检查配置步骤
#1. 登陆redis集群 redis-cli -h 127.0.0.1 -p 1000 -c10.10.2.19:1000> auth 123456 #2. 查看redis的配置timeout(当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能) config get timeout #3. 配置超时 config set timeout 0 # 默认 #4. 查看连接状态 lsof -i:1000 netstat -antp | grep 1000 # 如果是集群模式,那么每个节点都得需要修改。
- redis连接数与最大连接数
方法1. 在redis-cli命令行使用:info clients可以查看当前的redis连接数
127.0.0.1:6379> info clients #Clients connected_clients:621 client_longest_output_list:0 client_biggest_input_buf:0 blocked_clients:0 127.0.0.1:6379>
方法2:config get maxclients 可以查询redis允许的最大连接数
127.0.0.1:6379> CONFIG GET maxclients ##1) "maxclients" ##2) "10000" 127.0.0.1:6379>
- 设置、修改
- 在2.6之后版本,可以修改最大连接数配置,默认10000,可以在redis.conf配置文件中修改
maxclients 10000 - config set maxclients num 可以设置redis允许的最大连接数
127.0.0.1:6379> CONFIG set maxclients 10 OK 127.0.0.1:6379>
- 启动redis.service服务时加参数–maxclients 100000来设置最大连接数限制
redis-server --maxclients 100000 -f /etc/redis.conf
- redis-cli命令控制行中获取客户端信息命令
CLIENT LIST获取客户端列表 CLIENT SETNAME 设置当前连接点redis的名称 CLIENT GETNAME 查看当前连接的名称 CLIENT KILL ip:port 杀死指定连接
CLIENT LIST ##id=3 addr=127.0.0.1:36588 fd=5 name= age=7 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 CLIENT SETNAME js ##OK CLIENT LIST ##id=3 addr=127.0.0.1:36588 fd=5 name=js age=37 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 CLIENT GETNAME ##"js" CLIENT KILL id 3 ##(integer) 0
# 查看redis连接数 netstat -nap|grep redis |wc -l # 查看redis信息连接 redis -info # redis 监控 redis -monitor