redis client連接數過多,大量空閑連接無法釋放
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: 最近一次執行的命令
優化方案
- 1,通過ip排查對應的service服務,查看是否可以進行優化。
- 2,config get timeout
命令查看空閑超時時間
0 默認不開啟 - 3,config set timeout 60 //建議為0,有用分布式鎖的情況下,看業務場景
配置默認空閑超時時間為60s - 4,config rewrit 保存
可在redis.conf 配置文件中添加重啟生效。
最近在遷移redis集群,至於數據就是通過之前說的redis-migrate-tool工具做的同步遷移,遷移完成后,程序也修改了redis連接地址,但是redis服務端連接卻沒有釋放,這個問題就是因為redis默認timeout沒有做修改,無論連接是否空閑,長期保持連接狀態。
下面是檢查配置步驟:
登陸redis集群
[root@db-2-19 ~]# redis-cli -h 127.0.0.1 -p 1000 -c10.10.2.19:1000> auth 123456
查看redis的配置timeout(當客戶端閑置多長時間后關閉連接,如果指定為0,表示關閉該功能)
127.0.0.1:1000> config get timeout
配置超時
127.0.0.1:1000> config set timeout 0 //默認
查看連接狀態
[root@db-2-19 ~]# lsof -i:1000[root@db-2-19 ~]# netstat -antp | grep 1000
注:如果是集群模式,那么每個節點都得需要修改。
##redis客戶端連接數
redis通過監聽一個TCP端口或socket的方式接收來自客戶端的連接,
當與客戶端建立連接后,redis內部會進行如下操作:
(1)客戶端socket會被設置為非阻塞模式,因為redis在網絡時間處理上采用的是非阻塞多路復用模型;
(2)然后為這個socket設置TCP_NODELAY屬性,禁用Nagle算法;
(3)然后創建一個可讀的文件事件用於監聽這個客戶端socket的數據發送。
##redis連接數與最大連接數
1.查看
方法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.設置、修改
1. 在2.6之后版本,可以修改最大連接數配置,默認10000,可以在redis.conf配置文件中修改
... # maxclients 10000 ... 2.config set maxclients num 可以設置redis允許的最大連接數 127.0.0.1:6379> CONFIG set maxclients 10 OK 127.0.0.1:6379> 3.啟動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

