1. 程式人生 > >常見JedisConnectionException異常分析

常見JedisConnectionException異常分析

在Redis客戶端的使用過程中,無論是客戶端使用不當或者Redis服務端出現問題,客戶端會反應出一些異常,下面分析一下Jedis使用過程中常見的異常情況:

一.無法從連線池獲取到連線

JedisPool中的Jedis物件個數是有限的,預設是8個。這裡假設使用的預設配置,如果有8個Jedis物件被佔用,並且沒有歸還,如果呼叫者還要從JedisPool中借用Jedis,就需要進行等待(例如設定了maxWaitMillis>0),如果在maxWaitMillis時間內仍然無法獲取到Jedis物件就會丟擲如下異常。

Java程式碼  收藏程式碼
  1. redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool  
  2.     …  
  3. Caused by: java.util.NoSuchElementException: Timeout waiting for idle object  
  4.     at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:449)  

還有一種情況,就是設定了blockWhenExhausted=false,那麼呼叫者發現池子中沒有資源時,會立即丟擲異常不進行等待,下面的異常就是blockWhenExhausted=false時的效果。

Java程式碼  收藏程式碼
  1. redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool  
  2.     …  
  3. Caused by: java.util.NoSuchElementException: Pool exhausted  
  4.     at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:464)  

對於這個問題,需要重點討論的是為什麼連線池沒有資源了,造成沒有資源的可能的原因非常多

  • 1.客戶端:高併發下連線池設定過小,出現供不應求,所以會出現上面的錯誤,但是正常情況下只要比預設的最大連線數(8個)多一些即可,因為正常情況下JedisPool以及Jedis的處理效率足夠高。

  • 2.客戶端:沒有正確使用連線池,比如沒有進行釋放,例如下面程式碼所示:
    定義JedisPool,使用預設的連線池配置。

Java程式碼  收藏程式碼
  1. GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();  
  2. JedisPool jedisPool = new JedisPool(poolConfig, "127.0.0.1"6379);  
  3. //向JedisPool借用8次連線,但是沒有執行歸還操作。  
  4. for (int i = 0; i < 8; i++) {  
  5.     Jedis jedis = null;  
  6.     try {  
  7.     jedis = jedisPool.getResource();  
  8.     jedis.ping();  
  9.     } catch (Exception e) {  
  10.     e.printStackTrace();  
  11.     }  
  12. }  

當呼叫者再向連線池借用Jedis時(如下操作),就會丟擲異常:

Java程式碼  收藏程式碼
  1. jedisPool.getResource().ping();  
  • 3.客戶端:存在慢查詢操作,這些慢查詢持有的Jedis物件歸還速度會比較慢,造成池子滿了。
  • 4.服務端:客戶端是正常的,但是Redis服務端由於一些原因造成了客戶端命令執行過程的阻塞,也會使得客戶端丟擲這種異常。
    可以看到造成這個異常的原因是多個方面的,不要被異常的表象所迷惑,而且並不存在通用的解決方案,開發和運維只能不斷加強對於Redis的理解,順藤摸瓜逐漸找到問題所在。

二、 客戶端讀寫超時

Jedis在呼叫Redis時,如果出現了讀寫超時後,會出現下面的異常:

Java程式碼  收藏程式碼
  1. redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out  
造成該異常的原因也有以下幾種: 
  • 讀寫超時設定的過短。
  • 命令本身就比較慢。
  • 客戶端與服務端網路不正常。
  • Redis自身發生阻塞。

三 客戶端連線超時

Jedis在呼叫Redis時,如果出現了讀寫超時後,會出現下面的異常:

Java程式碼  收藏程式碼
  1. redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect timed out  
造成該異常的原因也有以下幾種: 
  • 連線超時設定的過短。
  • Redis發生阻塞,造成tcp-backlog已滿,造成新的連線失敗。
  • 客戶端與服務端網路不正常。

四、客戶端緩衝區異常

Jedis在呼叫Redis時,如果出現客戶端資料流異常,會出現下面的異常。

Java程式碼  收藏程式碼
  1. redis.clients.jedis.exceptions.JedisConnectionException: Unexpected end of stream.  
造成這個異常原因可能有如下幾種: 
  • 1.輸出緩衝區滿。例如將普通客戶端的輸出緩衝區設定為1M 1M 60:
Java程式碼  收藏程式碼
  1. config set client-output-buffer-limit "normal 1048576 1048576 60 slave 268435456 67108864 60 pubsub 33554432 8388608 60"  
 

如果使用get命令獲取一個bigkey(例如3M),就會出現這個異常。

  • 2.長時間閒置連線被服務端主動斷開,可以查詢timeout配置的設定以及自身連線池配置是否需要做空閒檢測。
  • 3.不正常併發讀寫:Jedis物件同時被多個執行緒併發操作,可能會出現上述異常。

五、Lua指令碼正在執行

如果Redis當前正在執行Lua指令碼,並且超過了lua-time-limit,此時Jedis呼叫Redis時,會收到下面的異常。對於如何處理這類問題(Lua lua-time-limit配置之前章節已經介紹了)

Java程式碼  收藏程式碼
  1. redis.clients.jedis.exceptions.JedisDataException: BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE  

六、Redis正在載入持久化檔案

Jedis呼叫Redis時,如果Redis正在載入持久化檔案,那麼會收到下面的異常。

Java程式碼  收藏程式碼
  1. redis.clients.jedis.exceptions.JedisDataException: LOADING Redis is loading the dataset in memory  

七、Redis使用的記憶體超過maxmemory配置

Jedis呼叫Redis執行寫操作時,如果Redis的使用記憶體大於maxmemory的設定,會收到下面的異常,此時應該調整maxmemory並找到造成記憶體增長的原因(maxmemory之前章節已經介紹了)

Java程式碼  收藏程式碼
  1. redis.clients.jedis.exceptions.JedisDataException: OOM command not allowed when used memory > 'maxmemory'.  

八、客戶端連線數過大

如果客戶端連線數超過了maxclients,新申請的連線就會出現如下異常:

Java程式碼  收藏程式碼
  1. redis.clients.jedis.exceptions.JedisDataException: ERR max number of clients reached  

此時新的客戶端連線執行任何命令,返回結果都是如下: 

Java程式碼  收藏程式碼
  1. 127.0.0.1:6379> get hello  
  2. (error) ERR max number of clients reached  
 
  •  1.客戶端:如果maxclients引數不是很小的話,應用方的客戶端連線數基本不會超過maxclients,通常來看是由於應用方對於Redis客戶端使用不當造成的。此時如果應用方是分散式結構的話,可以通過下線部分應用節點(例如佔用連線較多的節點),使得Redis的連線數先降下來。從而讓絕大部分節點可以正常執行,此時在再通過查詢程式bug或者調整maxclients進行問題的修復。這個問題可能會比較棘手,因為此時無法執行Redis命令,一般來說可以從兩個方面進行著手。
  • 2.服務端:如果此時客戶端無法處理,而當前Redis為高可用模式(例如Redis Sentinel和Redis Cluster),可以考慮將當前Redis做故障轉移。

相關推薦

【redis】常見JedisConnectionException異常分析

最近專案開發中用到了Redis, 選擇了官網推薦的java client Jedis。 Redis常用命令學習:http://redis.io/commands Redis官方推薦Java客戶端Jedis(包含了所有Redis命令的實現):https://github.

常見JedisConnectionException異常分析

在Redis客戶端的使用過程中,無論是客戶端使用不當或者Redis服務端出現問題,客戶端會反應出一些異常,下面分析一下Jedis使用過程中常見的異常情況:一.無法從連線池獲取到連線JedisPool中的Jedis物件個數是有限的,預設是8個。這裡假設使用的預設配置,如果有8個Jedis物件被佔用,並且沒有歸還

Java中常見異常分析

JavaException: 1、Error 2、RuntimeException執行時異常 3、Exception 4、throw使用者自定義異常 異常類分兩大型別:Error類代表了編譯和系統的錯誤,不允許捕獲;Exception類代表了標準Java庫方法所激發的異常。

Android常見異常分析

/* 常見的異常: 1. NullPointerException 原因: 呼叫值為null的物件的方法或屬性 2. ClassCastException 原因: 執行強制轉換, 但型別匹配

Java常見記憶體溢位異常分析

http://www.importnew.com/14604.html http://blog.csdn.net/znb769525443/article/details/50853712 簡介 Java虛擬機器規範規定JVM的記憶體分為了好幾塊,比如堆,棧,程式計數

常見JedisConnectionException 異常

最近在使用redis出現以下的異常: 1.redis.clients.jedis.exceptions.JedisConnectionException: java.net.ConnectException: Connection timed out

Hibernate/JPA常見異常分析與解決

1. ClassNotFoundException: org.hibernate.hql.ast.HqlToken??? (1)產生環境:SpringMVC3.0.5+com.springsource.org.hibernate-3.3.2.GA+SpringDM1.2.1?

線上服務mcelog負載異常分析處理流程

線上服務mcelog負載異常分析處理流程一、問題概述:Nginx服務器,HP,有冗余,其中一臺服務器mcelog負載比較高,日誌秒級別,已經影響了此服務器業務。tail -f /var/log/mcelog#註意看此信息是不斷循環,註意看Transaction:Memory scrubbing error M

jar包中File 文件找不到的異常分析與解決

http ont blog except .... 我們 too 格式 結果 源鏈接: http://hxraid.iteye.com/blog/483115#comments 我們常常在代碼中讀取一些資源文件(比如圖片,音樂,文本等等)。在單獨運行的時候這些簡單的處理

中小企業OA辦公管理軟件選型的常見問題歸納分析

OA辦公系統 OA辦公管理軟件 承元OA 企業信息化選擇OA辦公管理軟件實現高效辦公是必然趨勢,它可以大大提高企業的效率,節省成本,輔助提升企業的管理水平。但是如何進行選擇,選擇哪個品牌的產品和廠商的服務也成了一個難題。下面我們就相關問題進行分析:

web安全掃描問題(常見的)分析以及解決方式

檢測 掃描 安全問題這是我上午掃描的一個網站很多地方地方不懂 在網上查了嚴重問題有Session fixtion,vulnerable javascript library..1.什麽是session fixation攻擊 Session fixation有人翻譯成“Session完成攻擊”,實際上fixat

SylixOS 之epoll異常分析

sylixos1. SylixOS epoll介紹 SylixOS為了兼容Linux的epoll,創建了epoll的兼容子系統,並支持了epoll的部分功能。SylixOS epoll兼容子系統是由select子系統模擬出來的,所以效率沒有select高。2. epoll異常分析2.1epoll異常場景

【Java基礎】Java常見異常

java exception Java常見的異常1. java.lang.NullPointerException (空指針異常)調用了未經初始化的對象或者是不存在的對象2. java.lang.ClassNotFoundException 指定的類不存在3. java.lang.NumberForm

數組中常見異常

array 就會 lean ava 下標 print nds 找到 數組下標 數組中常見的異常有:1、數組下標越界異常 2、數組空指針異常,其中空指針異常又分為3種,代碼示例如下: public class Exception1 { public static vo

JavaScript常見筆試題分析

可能 span 筆試題 typeof font 筆試 asc scrip function 1.Javascript的typeof可能返回的結果有哪些?   答:共6種,具體為number ,boolean,string,undefined,function,object(

SpirngMVC AOP 用註解方式配置切面及IllegalArgumentException: error at ::0 formal unbound in pointcut 異常分析

ppi point exc sig 配方 mea oca 代碼 ger MEAVN代碼 <!-- springAOP核心包 --> <dependency> <groupId>org.springframework<

Mysql主從復制以及常見錯誤問題分析

ase min transacti 無法 bin ger datadir mysql主從 mysql配置 Mysql主從復制以及常見錯誤問題分析一、主從復制簡介:1、mysql

Linux共享內存使用常見陷阱與分析

round 先後 將不 有效 準則 虛擬內存 分享 ebs 大於 所謂共享內存就是使得多個進程可以訪問同一塊內存空間,是最快的可用IPC形式。是針對其他通信機制運行效率較低而設計的。往往與其它通信機制,如 信號量結合使用,來達到進程間的同步及互斥。其他進程能把同一段共享內存

常見的密碼分析

最常見的密碼分析https://github.com/berzerk0/Probable-Wordlists 其中的密碼可以用來做暴力破解字典進行攻擊https://github.com/berzerk0/Probable-Wordlists/blob/master/Real-Passwords/Top207

質量屬性的六個常見屬性場景分析

分別是 能力 關系 從大到小 度量 進行 現在 統一 易用性   六個最常見的系統質量屬性分別是:可用性(Availability)、可修改性(Modifiability)、性能(Performance)、安全性(Security)、可測試性(Testability)、易用