首頁 資料庫 Redis Jedis使用中常見的客戶端異常情況(總結)

Jedis使用中常見的客戶端異常情況(總結)

May 28, 2021 am 11:23 AM
jedis redis 資料庫

本篇文章跟大家介紹一下Redis常見客戶端異常匯總(Jedis篇)。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

Jedis使用中常見的客戶端異常情況(總結)

【導讀】Jedis是Redis的java版本的客戶端實作。在Redis客戶端的使用過程中,無論是客戶端使用不當或Redis服務端出現問題,客戶端都會反應出一些異常,本文分析了Jedis使用過程中常見的異常情況。 【相關推薦:Redis影片教學

一、無法從連線池取得到連線

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: java.util.NoSuchElementException: Timeout waiting for idle object
 at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:449)
登入後複製

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

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時(如下操作),就會拋出異常:

jedisPool.getResource().ping();

3.客戶端:存在慢查詢操作,這些慢查詢所持有的Jedis物件歸還速度會比較慢,造成池子滿了。

4.服務端:客戶端是正常的,但是Redis服務端由於一些原因造成了客戶端命令執行過程的阻塞,也會使得客戶端拋出這種異常。可以看到造成這個異常的原因是多方面的,不要被異常的表象所迷惑,而且並不存在萬能鑰匙能解決所有問題,開發和運維只能不斷加強對於Redis的理解,順藤摸瓜逐漸找到問題所在。

二、客戶端讀寫超時

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

redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out
登入後複製

造成該異常的原因也有以下幾種:

讀寫逾時設定的過短。
指令本身就比較慢。
客戶端與服務端網路不正常。
Redis本身發生阻塞。

三、客戶端連線逾時

Jedis在呼叫Redis時,如果出現了讀寫逾時後,會出現下面的例外:

redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect timed out
登入後複製

造成該異常的原因也有以下幾種:

連接逾時設定的過短。
Redis發生阻塞,造成tcp-backlog已滿,造成新的連線失敗。
客戶端與服務端網路不正常。

四、客戶端緩衝區異常

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

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配置之前章節已經介紹了)

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正在載入持久化文件,那麼就會收到下面的異常。

redis.clients.jedis.exceptions.JedisDataException: LOADING Redis is loading the dataset in memory
登入後複製

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

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

redis.clients.jedis.exceptions.JedisDataException: OOM command not allowed when used memory > &#39;maxmemory&#39;.
登入後複製

#八、客戶端連接數過大

############################################如果客戶端連線數超過了maxclients,新申請的連線就會出現如下例外:###
redis.clients.jedis.exceptions.JedisDataException: ERR max number of clients reached
登入後複製
###此時新的用戶端連線執行任何指令,回傳結果都是如下:###
127.0.0.1:6379> get hello
(error) ERR max number of clients reached
登入後複製

这个问题可能会比较棘手,因为此时无法执行Redis命令,一般来说可以从两个方面进行着手。

1.客户端:如果maxclients参数不是很小的话,应用方的客户端连接数基本不会超过maxclients,通常来看是由于应用方对于Redis客户端使用不当造成的。此时如果应用方是分布式结构的话,可以通过下线部分应用节点(例如占用连接较多的节点),使得Redis的连接数先降下来。从而让绝大部分节点可以正常运行,此时在再通过查找程序bug或者调整maxclients进行问题的修复。

2.服务端:如果此时客户端无法处理,而当前Redis为高可用模式(例如Redis Sentinel和Redis Cluster),可以考虑将当前Redis做故障转移。

此问题不存在确定的解决方式,但是无论从哪个方面进行处理,故障的快速恢复极为重要,当然更为重要的是找到问题的所在,否则一段时间后客户端连接数依然会超过maxclients。

附赠GenericObjectPoolConfig的重要属性

Jedis使用中常見的客戶端異常情況(總結)

原文地址:https://mp.weixin.qq.com/s?__biz=MjM5NTk0MTM1Mw==&mid=2650650677&idx=1&sn=cbb1cb9fefdf9641a4a7c775660114e8&chksm=bef9c6b3898e4fa5a31ac6e572dca4c20a37d6c1dcb41004d831b34300c5c9ae0ed8c3a1bb45&scene=21#wechat_redirect

作者:付磊
登入後複製

更多编程相关知识,请访问:编程教学!!

以上是Jedis使用中常見的客戶端異常情況(總結)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
centos redis如何配置Lua腳本執行時間 centos redis如何配置Lua腳本執行時間 Apr 14, 2025 pm 02:12 PM

在CentOS系統上,您可以通過修改Redis配置文件或使用Redis命令來限制Lua腳本的執行時間,從而防止惡意腳本佔用過多資源。方法一:修改Redis配置文件定位Redis配置文件:Redis配置文件通常位於/etc/redis/redis.conf。編輯配置文件:使用文本編輯器(例如vi或nano)打開配置文件:sudovi/etc/redis/redis.conf設置Lua腳本執行時間限制:在配置文件中添加或修改以下行,設置Lua腳本的最大執行時間(單位:毫秒)

MySQL:世界上最受歡迎的數據庫的簡介 MySQL:世界上最受歡迎的數據庫的簡介 Apr 12, 2025 am 12:18 AM

MySQL是一種開源的關係型數據庫管理系統,主要用於快速、可靠地存儲和檢索數據。其工作原理包括客戶端請求、查詢解析、執行查詢和返回結果。使用示例包括創建表、插入和查詢數據,以及高級功能如JOIN操作。常見錯誤涉及SQL語法、數據類型和權限問題,優化建議包括使用索引、優化查詢和分錶分區。

為什麼要使用mysql?利益和優勢 為什麼要使用mysql?利益和優勢 Apr 12, 2025 am 12:17 AM

選擇MySQL的原因是其性能、可靠性、易用性和社區支持。 1.MySQL提供高效的數據存儲和檢索功能,支持多種數據類型和高級查詢操作。 2.採用客戶端-服務器架構和多種存儲引擎,支持事務和查詢優化。 3.易於使用,支持多種操作系統和編程語言。 4.擁有強大的社區支持,提供豐富的資源和解決方案。

redis計數器怎麼實現 redis計數器怎麼實現 Apr 10, 2025 pm 10:21 PM

Redis計數器是一種使用Redis鍵值對存儲來實現計數操作的機制,包含以下步驟:創建計數器鍵、增加計數、減少計數、重置計數和獲取計數。 Redis計數器的優勢包括速度快、高並發、持久性和簡單易用。它可用於用戶訪問計數、實時指標跟踪、遊戲分數和排名以及訂單處理計數等場景。

甲骨文在商業世界中的作用 甲骨文在商業世界中的作用 Apr 23, 2025 am 12:01 AM

Oracle不僅是數據庫公司,還是雲計算和ERP系統的領導者。 1.Oracle提供從數據庫到雲服務和ERP系統的全面解決方案。 2.OracleCloud挑戰AWS和Azure,提供IaaS、PaaS和SaaS服務。 3.Oracle的ERP系統如E-BusinessSuite和FusionApplications幫助企業優化運營。

如何優化debian readdir的性能 如何優化debian readdir的性能 Apr 13, 2025 am 08:48 AM

在Debian系統中,readdir系統調用用於讀取目錄內容。如果其性能表現不佳,可嘗試以下優化策略:精簡目錄文件數量:盡可能將大型目錄拆分成多個小型目錄,降低每次readdir調用處理的項目數量。啟用目錄內容緩存:構建緩存機制,定期或在目錄內容變更時更新緩存,減少對readdir的頻繁調用。內存緩存(如Memcached或Redis)或本地緩存(如文件或數據庫)均可考慮。採用高效數據結構:如果自行實現目錄遍歷,選擇更高效的數據結構(例如哈希表而非線性搜索)存儲和訪問目錄信

MySQL與其他數據庫:比較選項 MySQL與其他數據庫:比較選項 Apr 15, 2025 am 12:08 AM

MySQL適合Web應用和內容管理系統,因其開源、高性能和易用性而受歡迎。 1)與PostgreSQL相比,MySQL在簡單查詢和高並發讀操作上表現更好。 2)相較Oracle,MySQL因開源和低成本更受中小企業青睞。 3)對比MicrosoftSQLServer,MySQL更適合跨平台應用。 4)與MongoDB不同,MySQL更適用於結構化數據和事務處理。

centos redis如何配置慢查詢日誌 centos redis如何配置慢查詢日誌 Apr 14, 2025 pm 04:54 PM

在CentOS系統上啟用Redis慢查詢日誌,提升性能診斷效率。以下步驟將指導您完成配置:第一步:定位並編輯Redis配置文件首先,找到Redis配置文件,通常位於/etc/redis/redis.conf。使用以下命令打開配置文件:sudovi/etc/redis/redis.conf第二步:調整慢查詢日誌參數在配置文件中,找到並修改以下參數:#慢查詢閾值(毫秒)slowlog-log-slower-than10000#慢查詢日誌最大條目數slowlog-max-len

See all articles