1. 程式人生 > >Redis學習(八) Redis丟失訂閱訊息分析與處理和client-output-buffer-limit屬性配置說明

Redis學習(八) Redis丟失訂閱訊息分析與處理和client-output-buffer-limit屬性配置說明

Redis快取行情資料,發現程式執行一段時間後,出現subscribe執行緒不再能夠接收到訂閱的行情資料,發現是由Redis的輸出緩衝機制導致的。

Redis為了解決輸出緩衝區訊息大量堆積的隱患,設定了一些保護機制,主要採用兩種限制措施:

  • 大小限制,當某一客戶端緩衝區超過設定值後直接關閉連線;
  • 持續性限制,當某一客戶端緩衝區持續一段時間佔用過大空間時關閉連線。

通過CONFIG GET *檢視,可以找到客戶端輸出緩衝區的預設配置:

167) "client-output-buffer-limit"
168) "normal 0 0 0 slave 268435456 67108864 60 pubsub 33554432 8388608 60"  

對於普通客戶端來說,限制為0,也就是不限制。因為普通客戶端通常採用阻塞式的訊息應答模式,何謂阻塞式呢?如:傳送請求,等待返回,再發送請求,再等待返回。這種模式下,通常不會導致Redis伺服器輸出緩衝區的堆積膨脹;

  1. 對於Pub/Sub客戶端(也就是釋出/訂閱模式),大小限制是8M,當輸出緩衝區超過8M時,會關閉連線。持續性限制是,當客戶端緩衝區大小持續60秒超過2M,則關閉客戶端連線;
  2. 對於slave客戶端來說,大小限制是256M,持續性限制是當客戶端緩衝區大小持續60秒超過64M,則關閉客戶端連線。

上述三種規則都是可以修改的。可以通過CONFIG SET 命令設定或者直接修改redis.conf

config set client-output-buffer-limit pubsub 0 0 0 #將hard limit和soft limit同時置0,關閉該限制。