Redis丟失訂閱消息和client-output-buffer-limit屬性配置說明

最近使用Redis緩存行情數據,發現程序運行一段時間後,出現subscribe線程再也不可以接收到訂閱的行情數據,發現是由Redis的輸出緩衝機制致使的。redis

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

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

經過CONFIG GET *查看,能夠找到客戶端輸出緩衝區的默認配置:服務器

167) "client-output-buffer-limit"
168) "normal 0 0 0 slave 268435456 67108864 60 pubsub 33554432 8388608 60"
  • 1
  • 2
  1. 對於普通客戶端來講,限制爲0,也就是不限制。由於普通客戶端一般採用阻塞式的消息應答模式,何謂阻塞式呢?如:發送請求,等待返回,再發送請求,再等待返回。這種模式下,一般不會致使Redis服務器輸出緩衝區的堆積膨脹;
  2. 對於Pub/Sub客戶端(也就是發佈/訂閱模式),大小限制是8M,當輸出緩衝區超過8M時,會關閉鏈接。持續性限制是,當客戶端緩衝區大小持續60秒超過2M,則關閉客戶端鏈接;
  3. 對於slave客戶端來講,大小限制是256M,持續性限制是當客戶端緩衝區大小持續60秒超過64M,則關閉客戶端鏈接。

上述三種規則都是能夠修改的。能夠經過CONFIG SET 命令設置或者直接修改redis.conf線程

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

相關文章
相關標籤/搜索