一、輸入緩沖區概念
Redis為每個客戶端分配了輸入緩沖去,它的作用是將客戶端發送的命令臨時保存,同時Redis會到輸入緩沖區拉取命令並執行,輸入緩沖區為客戶端發送命令道Redis執行命令提供了緩沖功能。qbuf代表了輸入緩沖區的大小,qbuf-free代表輸入緩沖區的剩余容量。輸入緩沖區會根據輸入內容的大小動態調整,每個客戶端的輸入緩沖區大小不能超過1G。超過后客戶端將被關閉。
二、輸入緩沖區過大的危害
(1)一旦客戶端的輸入緩沖區超過1G,客戶端將會被關閉
(2) 輸入緩沖區不受maxmemory的控制,假設一個Redis設置了maxmemory為4G,已經存儲了2G數據,但是如果此時輸入緩沖區使用了3GB,已經超過了maxmemeory限制,可能會產生數據丟失,鍵值淘汰,OOM等情況。
三.、引起輸入緩沖區過大的原因
(1) redis的處理速度跟不上輸入緩沖區的輸入速度,並且每次進入輸入緩沖區的命令包含大量的bigkey,從而造成了輸入緩沖區過大的情況。
(2) redis發生了阻塞,短期內不能處理命令。造成客戶端命令積壓在輸入緩沖區,導致輸入緩沖區過大。
四. 監控輸入緩沖區異常的方法
4.1
client list
通過定期執行client list命令,收集qbuf和qbuf-free找到異常的連接記錄並分析,最終可能出問題的客戶端。
10.3.34.101:6378> client list id=10521 addr=10.3.34.101:39696 fd=5name= age=4017 idle=41 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=rcmd=client id=10533 addr=10.3.34.101:48896 fd=6name= age=6 idle=0 flags=N db=0 sub=0 psub=0 multi=-1qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client
4.2
info clients
通過info命令的info clients模塊,找到最大的輸入緩沖區
10.3.34.101:6378> info clients # Clients connected_clients:2 client_longest_output_list:0 client_biggest_input_buf:0 blocked_clients:0
4.3 client list與infoclients監控輸入緩沖區的優劣勢

CLIENT LIST 詳解
redis> CLIENT LIST addr=127.0.0.1:43143 fd=6 age=183 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 addr=127.0.0.1:43163 fd=5 age=35 idle=15 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=ping addr=127.0.0.1:43167 fd=7 age=24 idle=6 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=get
可用版本 >= 2.4.0
時間復雜度 O(N) , N 為連接到服務器的客戶端數量。 返回值 命令返回多行字符串,這些字符串按以下形式被格式化: 每個已連接客戶端對應一行(以 LF 分割) 每行字符串由一系列 屬性=值 形式的域組成,每個域之間以空格分開 以下是域的含義: addr : 客戶端的地址和端口 fd : 套接字所使用的文件描述符 age : 以秒計算的已連接時長 idle : 以秒計算的空閑時長 flags : 客戶端 flag (見下文) db : 該客戶端正在使用的數據庫 ID sub : 已訂閱頻道的數量 psub : 已訂閱模式的數量 multi : 在事務中被執行的命令數量 qbuf : 查詢緩沖區的長度(字節為單位, 0 表示沒有分配查詢緩沖區) qbuf-free : 查詢緩沖區剩余空間的長度(字節為單位, 0 表示沒有剩余空間) obl : 輸出緩沖區的長度(字節為單位, 0 表示沒有分配輸出緩沖區) oll : 輸出列表包含的對象數量(當輸出緩沖區沒有剩余空間時,命令回復會以字符串對象的形式被入隊到這個隊列里) omem : 輸出緩沖區和輸出列表占用的內存總量 events : 文件描述符事件(見下文) cmd : 最近一次執行的命令 客戶端 flag 可以由以下部分組成: O : 客戶端是 MONITOR 模式下的附屬節點(slave) S : 客戶端是一般模式下(normal)的附屬節點 M : 客戶端是主節點(master) x : 客戶端正在執行事務 b : 客戶端正在等待阻塞事件 i : 客戶端正在等待 VM I/O 操作(已廢棄) d : 一個受監視(watched)的鍵已被修改, EXEC 命令將失敗 c : 在將回復完整地寫出之后,關閉鏈接 u : 客戶端未被阻塞(unblocked) A : 盡可能快地關閉連接 N : 未設置任何 flag 文件描述符事件可以是: r : 客戶端套接字(在事件 loop 中)是可讀的(readable) w : 客戶端套接字(在事件 loop 中)是可寫的(writeable)
見地址:https://blog.csdn.net/sunhuiliang85/article/details/75102191
見中文官網:http://redisdoc.com/server/index.html
