最近redis经常出现连接池满的问题,通过redis 的 client list命令查看返回数据,返回的数据样例为:
id=399784 addr=127.0.0.1:53818 fd=87 name= age=885 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=exec
id=399031 addr=127.0.0.1:35208 fd=56 name= age=10071 idle=8785 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=set
由于初次接触,不明白什么含义,特此做下记录:
id
: 唯一的64位的客户端ID(Redis 2.8.12加入)。addr
: 客户端的地址和端口fd
: 套接字所使用的文件描述符age
: 以秒计算的已连接时长idle
: 以秒计算的空闲时长flags
: 客户端 flagdb
: 该客户端正在使用的数据库 IDsub
: 已订阅频道的数量psub
: 已订阅模式的数量multi
: 在事务中被执行的命令数量qbuf
: 查询缓冲区的长度(字节为单位, 0 表示没有分配查询缓冲区)qbuf-free
: 查询缓冲区剩余空间的长度(字节为单位, 0 表示没有剩余空间)obl
: 输出缓冲区的长度(字节为单位, 0 表示没有分配输出缓冲区)oll
: 输出列表包含的对象数量(当输出缓冲区没有剩余空间时,命令回复会以字符串对象的形式被入队到这个队列里)omem
: 输出缓冲区和输出列表占用的内存总量events
: 文件描述符事件cmd
: 最近一次执行的命令
通过了解各个字段的含义,看得出中间有很多空闲的空连接,导致连接池满了,所以设置redis的连接池中最大的空闲连接数,继续观察。