深入了解Redis連接數(shù)問題的現(xiàn)象和解法
1. 前言
一般情況 Redis 連接數(shù)問題并不常見,但是當你業(yè)務(wù)服務(wù)增加、對 Redis 的依賴持續(xù)增強的過程中,可能會遇到很多 Redis 的問題,這個時候,Redis 連接數(shù)可能就成了一個常見的問題。
簡單定義
:因各種原因,程序?qū)edis的連接數(shù)激增,超過Redis服務(wù)器能夠承受的上線,從而程序無法正常訪問Redis進而引發(fā)功能異常的問題。
Redis連接數(shù)問題并不常見,但現(xiàn)在系統(tǒng)對 Redis 依賴較強,并且也是解決各系統(tǒng)性能的利器,連接數(shù)打爆造成的Redis暫時不可用會影響正常功能,至少系統(tǒng)性能急劇下降,影響較大。
在本章節(jié),希望能夠帶大家了解Redis連接數(shù)問題的現(xiàn)象和解法。
2. 背景知識
Redis原生支持長短連接,但與我們使用數(shù)據(jù)庫類似,大多數(shù)Redis客戶端/中間件都使用了連接池來管理對Redis服務(wù)器的連接,從而達到連接復(fù)用、提高IO效率的效果(連接池的概念與作用不再贅述)。
無論是Jedis還是Lettuce,都默認支持了連接池的配置,池中連接都是長連接。
通常我們使用Redis可能有幾種場景:
1)用作緩存
,若丟失,程序可以自動或手動重建,不影響業(yè)務(wù)正確性,但極有可能影響性能;
2)用作存儲,若丟失即是業(yè)務(wù)數(shù)據(jù)的丟失,較難恢復(fù),一般為不重要的數(shù)據(jù),業(yè)務(wù)上應(yīng)有預(yù)案;
3)用作分布式鎖
,若丟失則可能造成數(shù)據(jù)一致性問題;
4)用作阻塞隊列,若丟失則可能造成業(yè)務(wù)數(shù)據(jù)的丟失,需要有相應(yīng)的校驗與補償措施。
提倡使用1、3,不提倡使用2、4。
特別是4阻塞隊列,雖不禁止,但對Redis連接占用極為嚴重
,應(yīng)作為最后之舉,之前應(yīng)該尋求使用其他消息隊列中間件、內(nèi)存處理等方案。
3. 問題處理
3.1 如何感知連接數(shù)過多
1)使用INFO命令:Redis提供了 INFO 命令來獲取Redis服務(wù)器的各種信息和統(tǒng)計。其中,connected_clients字段表示當前已連接的客戶端數(shù)量。
redis-cli info | grep connected_clients
2)使用CLIENT LIST命令:這個命令可以列出所有連接到Redis服務(wù)器的客戶端信息。
redis-cli client list
3)使用CONFIG GET maxclients命令:可以獲取Redis服務(wù)器允許的最大客戶端連接數(shù)。
redis-cli config get maxclients
4)監(jiān)控工具:搭建監(jiān)控工具,通過圖像走勢更能直觀的展現(xiàn)連接數(shù)使用情況。如Prometheus、Grafana、Redis exporter等,來實時監(jiān)控Redis的連接數(shù),大致流程是:
- 在Redis服務(wù)端部署 如Prometheus,用來抓取數(shù)據(jù) redis 服務(wù)端數(shù)據(jù),還是主要通過 INFO 等指令抓取
- 配置 Prometheus 從 Redis exporter 抓取數(shù)據(jù)
- 配置 Grafana 的數(shù)據(jù)源 Prometheus,用來展示數(shù)據(jù)
如果你發(fā)現(xiàn)Redis的連接數(shù)過多,可能需要檢查你的應(yīng)用是否正確地關(guān)閉了不再使用的連接,或者是否有必要增加Redis服務(wù)器的最大連接數(shù)。
3.2 常見原因
1)生產(chǎn)容量規(guī)劃不合理,較多數(shù)量的應(yīng)用機器但沒有申請匹配容量的Redis服務(wù)器;
2)正常發(fā)布時,舊節(jié)點摘流后一段時間內(nèi),其連接池尚未完全斷開,而同時新的節(jié)點又啟動開始連接,使得Redis服務(wù)器面對了成倍的連接請求;
3)碰到某種連接異常時,程序反復(fù)重試,連接激增;
4)過度使用阻塞隊列;
5)使用第三方工具連上Redis,工具本身設(shè)計不完善(例如scan所有key)引起生產(chǎn)問題。
3.3 如何止損
問題發(fā)生時首先可以考慮采取如下措施進行止損:
1)若判斷為上述第1、2種原因,首先考慮應(yīng)用縮容
2)若判斷為上述第3、4種原因,首先考慮重啟應(yīng)用(且避免進入原因2,參照下方解決方案2)
3)若判斷為上述第5種原因,立即停止工具的使用
4)與此同時,服務(wù)器端請運維幫忙清理連接、Redis擴容、切從等
3.4 長效解決方案
1)新功能上線、新活動應(yīng)對時,合理規(guī)劃生產(chǎn)容量,一定數(shù)量的應(yīng)用機器應(yīng)該匹配相應(yīng)容量的Redis服務(wù)器
2)正常發(fā)布時,舊節(jié)點摘流、新節(jié)點啟動兩者的時間間隔需要適當控制,不宜太快,以免依賴資源打滿
3)應(yīng)用代碼中謹慎重試
4)慎重將Redis用作阻塞隊列,應(yīng)作為最后之舉,之前應(yīng)該尋求使用其他消息隊列中間件、內(nèi)存處理等方案
5)禁止使用第三方工具連上Redis
以上就是深入了解Redis連接數(shù)問題的現(xiàn)象和解法的詳細內(nèi)容,更多關(guān)于Redis連接數(shù)問題的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
RedisTemplate序列化設(shè)置的流程和具體步驟
在使用 Redis 作為緩存數(shù)據(jù)庫時,我們通常會使用 RedisTemplate 來簡化與 Redis 進行交互的操作,而其中一個重要的配置項就是序列化設(shè)置,它決定了數(shù)據(jù)在存儲到 Redis 中時的格式,本文將介紹如何進行 RedisTemplate 的序列化設(shè)置,以及一些常見的序列化方案2024-11-11Redis中Redisson布隆過濾器的學(xué)習(xí)
布隆過濾器是一個非常長的二進制向量和一系列隨機哈希函數(shù)的組合,可用于檢索一個元素是否存在,本文就詳細的介紹一下Redisson布隆過濾器,具有一定的參考價值,感興趣的可以了解一下2022-05-05