常見JedisConnectionException異常分析
在Redis客戶端的使用過程中,無論是客戶端使用不當或者Redis服務端出現問題,客戶端會反應出一些異常,下面分析一下Jedis使用過程中常見的異常情況:
一.無法從連線池獲取到連線
JedisPool中的Jedis物件個數是有限的,預設是8個。這裡假設使用的預設配置,如果有8個Jedis物件被佔用,並且沒有歸還,如果呼叫者還要從JedisPool中借用Jedis,就需要進行等待(例如設定了maxWaitMillis>0),如果在maxWaitMillis時間內仍然無法獲取到Jedis物件就會丟擲如下異常。
Java程式碼- redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
- …
- Caused by: java.util.NoSuchElementException: Timeout waiting for idle object
- at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:449)
還有一種情況,就是設定了blockWhenExhausted=false,那麼呼叫者發現池子中沒有資源時,會立即丟擲異常不進行等待,下面的異常就是blockWhenExhausted=false時的效果。
Java程式碼- redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
- …
- Caused by: java.util.NoSuchElementException: Pool exhausted
- at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:464)
對於這個問題,需要重點討論的是為什麼連線池沒有資源了,造成沒有資源的可能的原因非常多
1.客戶端:高併發下連線池設定過小,出現供不應求,所以會出現上面的錯誤,但是正常情況下只要比預設的最大連線數(8個)多一些即可,因為正常情況下JedisPool以及Jedis的處理效率足夠高。
2.客戶端:沒有正確使用連線池,比如沒有進行釋放,例如下面程式碼所示:
定義JedisPool,使用預設的連線池配置。
- GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
- JedisPool jedisPool = new JedisPool(poolConfig, "127.0.0.1", 6379);
- //向JedisPool借用8次連線,但是沒有執行歸還操作。
- for (int i = 0; i < 8; i++) {
- Jedis jedis = null;
- try {
- jedis = jedisPool.getResource();
- jedis.ping();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
當呼叫者再向連線池借用Jedis時(如下操作),就會丟擲異常:
Java程式碼- jedisPool.getResource().ping();
- 3.客戶端:存在慢查詢操作,這些慢查詢持有的Jedis物件歸還速度會比較慢,造成池子滿了。
- 4.服務端:客戶端是正常的,但是Redis服務端由於一些原因造成了客戶端命令執行過程的阻塞,也會使得客戶端丟擲這種異常。
可以看到造成這個異常的原因是多個方面的,不要被異常的表象所迷惑,而且並不存在通用的解決方案,開發和運維只能不斷加強對於Redis的理解,順藤摸瓜逐漸找到問題所在。
二、 客戶端讀寫超時
Jedis在呼叫Redis時,如果出現了讀寫超時後,會出現下面的異常:
Java程式碼- redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out
- 讀寫超時設定的過短。
- 命令本身就比較慢。
- 客戶端與服務端網路不正常。
- Redis自身發生阻塞。
三 客戶端連線超時
Jedis在呼叫Redis時,如果出現了讀寫超時後,會出現下面的異常:
Java程式碼- redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect timed out
- 連線超時設定的過短。
- Redis發生阻塞,造成tcp-backlog已滿,造成新的連線失敗。
- 客戶端與服務端網路不正常。
四、客戶端緩衝區異常
Jedis在呼叫Redis時,如果出現客戶端資料流異常,會出現下面的異常。
Java程式碼- redis.clients.jedis.exceptions.JedisConnectionException: Unexpected end of stream.
- 1.輸出緩衝區滿。例如將普通客戶端的輸出緩衝區設定為1M 1M 60:
- 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程式碼- 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程式碼- redis.clients.jedis.exceptions.JedisDataException: LOADING Redis is loading the dataset in memory
七、Redis使用的記憶體超過maxmemory配置
Jedis呼叫Redis執行寫操作時,如果Redis的使用記憶體大於maxmemory的設定,會收到下面的異常,此時應該調整maxmemory並找到造成記憶體增長的原因(maxmemory之前章節已經介紹了)
Java程式碼- redis.clients.jedis.exceptions.JedisDataException: OOM command not allowed when used memory > 'maxmemory'.
八、客戶端連線數過大
如果客戶端連線數超過了maxclients,新申請的連線就會出現如下異常:
Java程式碼- redis.clients.jedis.exceptions.JedisDataException: ERR max number of clients reached
此時新的客戶端連線執行任何命令,返回結果都是如下:
Java程式碼- 127.0.0.1:6379> get hello
- (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)、易用