這個還是比較常見的,也就是比較對開發有用的部分。
1.無法從連線池獲取到連線
jedispool中的jedis物件個數是有限的,預設是8個。這裡假設使用的默 認配置,如果有8個jedis物件被占用,並且沒有歸還,此時呼叫者還要從 jedispool中借用jedis,就需要進行等待(例如設定了maxwaitmillis>0),如 果在maxwaitmillis時間內仍然無法獲取到jedis物件就會丟擲如下異常:
redis.clients.jedis.exceptions.jedisconnectionexception: could not get a resource from the pool … caused by: j**a.util.nosuchelementexception: timeout waiting for idle object at org.apache.commons.pool2.impl.genericobjectpool.borrowobject(genericobjectpool. j**a:449)
還有一種情況,就是設定了blockwhenexhausted=false,那麼呼叫者發現 池子中沒有資源時,會立即丟擲異常不進行等待,下面的異常就是 blockwhenexhausted=false時的效果:
redis.clients.jedis.exceptions.jedisconnectionexception: could not get a resource from the pool … caused by: j**a.util.nosuchelementexception: pool exhausted at org.apache.commons.pool2.impl.genericobjectpool.borrowobject(genericobjectpool. j**a:464)
可能的原因:
客戶端:
1. 客戶端:高併發下連線池設定過小,出現供不應求,所以會出現上面 的錯誤,但是正常情況下只要比預設的最大連線數(8個)多一些即可,因 為正常情況下jedispool以及jedis的處理效率足夠高。
2. 客戶端:沒有正確使用連線池,比如沒有進行釋放
3. 客戶端:存在慢查詢操作,這些慢查詢持有的jedis物件歸還速度會比 較慢,造成池子滿了。
服務端:
服務端:客戶端是正常的,但是redis服務端由於一些原因造成了客戶 端命令執行過程的阻塞,也會使得客戶端丟擲這種異常。
2.客戶端讀寫超時
造成該異常的原因也有以下幾種:
·讀寫超時間設定得過短。
·命令本身就比較慢。
·客戶端與服務端網路不正常。
·redis自身發生阻塞。
客戶端連線超時
-1. 連線超時設定得過短
-2. redis發生阻塞,造成tcp-backlog已滿,造成新的連線失敗。
-3. 客戶端與服務端網路不正常。
客戶端緩衝區異常
造成這個異常的原因可能有如下幾種:
1)輸出緩衝區滿。例如將普通客戶端的輸出緩衝區設定為1m,如果使用get命令獲取乙個bigkey(例如3m),就會出現這個異常。
2)長時間閒置連線被服務端主動斷開
不正常併發讀寫:jedis物件同時被多個執行緒併發操作,可能會出現 上述異常
5.lua指令碼正在執行
如果redis當前正在執行lua指令碼,並且超過了lua-time-limit,此時jedis呼叫redis時,會收到下面的異常。
這個時候使用kill script
redis正在載入持久化檔案
jedis呼叫redis時,如果redis正在載入持久化檔案
redis使用的記憶體超過maxmemory配置
jedis執行寫操作時,如果redis的使用記憶體大於maxmemory的設定,會 收到下面的異常,此時應該調整maxmemory並找到造成記憶體增長的原因
客戶端連線數過大
如果客戶端連線數超過了maxclients,新申請的連線就會出現如下異常
解決方案:
客戶端:如果maxclients引數不是很小的話,應用方的客戶端連線數基 本不會超過maxclients,通常來看是由於應用方對於redis客戶端使用不當造 成的。此時如果應用方是分布式結構的話,可以通過下線部分應用節點(例 如占用連線較多的節點),使得redis的連線數先降下來。從而讓絕大部分 節點可以正常執行,此時再通過查詢程式bug或者調整maxclients進行問題的修復
服務端: 如果此時客戶端無法處理,而當前redis為高可用模式(例如 redis sentinel和redis cluster),可以考慮將當前redis做故障轉移。
下一節redis 常見案例分析。
Redis 客戶端連線
redis 通過監聽乙個 tcp 埠或者 unix socket 的方式來接收來自客戶端的連線,當乙個連線建立後,redis 內部會進行以下一些操作 在 redis2.4 中,最大連線數是被直接硬編碼在 裡面的,而在2.6版本中這個值變成可配置的。maxclients 的預設值是 10000,你也可...
Redis 客戶端連線
在 redis2.4 中,最大連線數是被直接硬編碼在 裡面的,而在2.6版本中這個值變成可配置的。maxclients 的預設值是 10000,你也可以在 redis.conf 中對這個值進行修改。config getmaxclients 1 maxclients 2 10000 以下例項我們在服務...
Redis 客戶端連線
redis 客戶端連線 redis 通過監聽乙個 tcp 埠或者 unix socket 的方式來接收來自客戶端的連線,當乙個連線建立後,redis 最大連線數 在redis2.4 中,最大連線數是被直接硬編碼在 裡面的,而在 2.6版本中這個值變成可配置的。maxclients 的預設值是 100...