redis client list 詳解

參考:
https://www.jianshu.com/p/70f3b68a7fd7

redis 連接的屬性
id=437332863 addr=10.59.72.159:60339 fd=1728 name= age=11 idle=11 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=del
id=369651758 addr=10.28.85.47:49508 fd=4040 name= age=2111614 idle=2111613 flags=N db=4 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=select

redis client命令輸出的是每一行代表一個客戶端的信息,每行包含10多個屬性。

id ·id:客戶端連接的唯一標識,這個id是隨着Redis的連接自增的,重啓Redis後會重置爲0。

·addr:客戶端連接的ip和端口。

·fd:socket的文件描述符,與lsof命令結果中的fd是同一個(可以看到連接的狀態),如果fd=-1代表當前客戶端不是外部客戶端,而是Redis內部的僞裝客戶端。

·name:客戶端的名字,後面的client setName(客戶端執行設置我這個連接的名字)和client getName(可以查看客戶端設置的名字)兩個命令會對其進行說明。

2)輸入緩衝區:qbuf、qbuf-free
Redis爲每個客戶端分配了輸入緩衝區,它的作用是將客戶端發送的命令臨時保存,同時Redis從會輸入緩衝區拉取命令並執行,輸入緩衝區爲客戶端發送命令到Redis執行命令提供了緩衝功能,如圖4-5所示。
client list中qbuf和qbuf-free分別代表這個緩衝區的總容量和剩餘容量,Redis沒有提供相應的配置來規定每個緩衝區的大小,輸入緩衝區會根據輸入內容大小的不同動態調整,只是要求每個客戶端緩衝區的大小不能超過1G,超過後客戶端將被關閉

(3)輸出緩衝區:obl、oll、omem

Redis爲每個客戶端分配了輸出緩衝區,它的作用是保存命令執行的結果返回給客戶端,爲Redis和客戶端交互返回結果提供緩衝,如圖4-7所示。
與輸入緩衝區不同的是,輸出緩衝區的容量可以通過參數client-output-buffer-limit來進行設置,並且輸出緩衝區做得更加細緻,按照客戶端的不同分爲三種:普通客戶端、發佈訂閱客戶端、slave客戶端,如圖4-8所示。

應的配置規則是:

client-output-buffer-limit

和輸入緩衝區相同的是,輸出緩衝區也不會受到maxmemory的限制,如果使用不當同樣會造成maxmemory用滿產生的數據丟失、鍵值淘汰、OOM等情況。

(4)客戶端的存活狀態

client list中的age和idle分別代表當前客戶端已經連接的時間和最近一次的空閒時間

當城市// 5) 關閉jedis連接 jedis.close(); 或者redis-cli中使用quit退出後,連接消失(被關閉了)

Redis默認的timeout是0,也就是不會檢測客戶端的空閒 127.0.0.1:6379> config set timeout 30

和一般來說maxclients=10000在大部分場景下已經絕對夠用,但是業務繁忙的時候會有問題。

Redis的默認配置給出的timeout=0,在這種情況下客戶端基本不會出現上面的異常,這是基於對客戶端開發的一種保護。例如很多開發人員在使用JedisPool時不會對連接池對象做空閒檢測和驗證,如果設置了timeout>0,可能就會出現上面的異常,對應用業務造成一定影響,但是如果Redis的客戶端使用不當或者客戶端本身的一些問題,造成沒有及時釋放客戶端連接,可能會造成大量的idle連接佔據着很多連接資源,一旦超過maxclients;後果也是不堪設想。所在在實際開發和運維中,需要將timeout設置成大於0,例如可以設置爲300秒,同時在客戶端使用上添加空閒檢測和驗證等等措施

(6)客戶端類型

client list中的flag是用於標識當前客戶端的類型,例如flag=S代表當前客戶端是slave客戶端、flag=N代表當前是普通客戶端,flag=O代表當前客戶端正在執行monitor命令,表4-4列出了11種客戶端類型。

3.client kill

client kill ip:port

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章