1. 程式人生 > >redis連線異常的解決方案

redis連線異常的解決方案

redis連線異常的解決方案

最近在做高併發架構,發現程式偶爾報錯:

redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
        at redis.clients.util.Pool.getResource(Pool.java:50) ~[Pool.class:na]
        at redis.clients.jedis.JedisPool.getResource(JedisPool.java:86) ~[JedisPool.class:na]
        at com.qingmayun.common.dbConfig.JedisManager.getDbJedis(JedisManager.java:56) ~[JedisManager.class:na]
        at com.qingmayun.common.dbConfig.PipelineManager.getDbPipeline(PipelineManager.java:21) [PipelineManager.class:na]
        at com.qingmayun.common.dbConfig.RedisDao.smsMonitWhenSend(RedisDao.java:1227) [RedisDao.class:na]
        at com.qingmayun.mqconsumer.channel.base.ChannelWatcher.sendMonit(ChannelWatcher.java:79) [ChannelWatcher.class:na]
        at com.qingmayun.mqconsumer.channel.base.proxy.SmsProxy.sendMsg(SmsProxy.java:71) [SmsProxy.class:na]
        at com.qingmayun.mqconsumer.TemplateSmsConsumer.sendTemplateSms(TemplateSmsConsumer.java:205) [TemplateSmsConsumer.class:na]
        at com.qingmayun.mqconsumer.TemplateSmsConsumer.access$100(TemplateSmsConsumer.java:50) [TemplateSmsConsumer.class:na]
        at com.qingmayun.mqconsumer.TemplateSmsConsumer$1.handleDelivery(TemplateSmsConsumer.java:82) [TemplateSmsConsumer$1.class:na]
        at com.rabbitmq.client.impl.ConsumerDispatcher$5.run(ConsumerDispatcher.java:144) [rabbitmq-client.jar:na]
        at com.rabbitmq.client.impl.ConsumerWorkService$WorkPoolRunnable.run(ConsumerWorkService.java:99) [rabbitmq-client.jar:na]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_71]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_71]
        at java.lang.Thread.run(Thread.java:745) [na:1.7.0_71]
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect timed out
        at redis.clients.jedis.Connection.connect(Connection.java:155) ~[Connection.class:na]
        at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:83) ~[BinaryClient.class:na]
        at redis.clients.jedis.BinaryJedis.connect(BinaryJedis.java:1643) ~[BinaryJedis.class:na]
        at redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:85) ~[JedisFactory.class:na]
        at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:861) ~[commons-pool2-2.3.jar:2.3]
        at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:435) ~[commons-pool2-2.3.jar:2.3]
        at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363) ~[commons-pool2-2.3.jar:2.3]
        at redis.clients.util.Pool.getResource(Pool.java:48) ~[Pool.class:na]
        ... 14 common frames omitted
Caused by: java.net.SocketTimeoutException: connect timed out
        at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.7.0_71]
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339) ~[na:1.7.0_71]
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200) ~[na:1.7.0_71]
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182) ~[na:1.7.0_71]
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.7.0_71]
        at java.net.Socket.connect(Socket.java:579) ~[na:1.7.0_71]
        at redis.clients.jedis.Connection.connect(Connection.java:149) ~[Connection.class:na]
        ... 21 common frames omitted

百度了redisCould not get a resource from the pooljava.net.SocketTimeoutException: connect timed out始終得不到理想答案。網路上的說法無非就是使用執行緒池,增加連線時長,增加執行緒池數量。已經照做了,但是並沒啥鳥用,壓力山大,再解決不了沒臉見人了。

自力更生吧,檢視cpu30%;記憶體,還剩很多;網路,同一臺機器;硬碟,讀寫無瓶頸;Redis配置,使用預設的最大10000連線,當前活動連線也就1K多;swap,並無使用,Redis也已經刪除資料重啟了;jvmXMX配置了4G,才使用1Gtcpdump,抓到了包,然而看不懂。網路上一個團隊說他們通過抓包最終找到了問題是他們顯示卡驅動不行,找供應商升級了驅動

......

哥只是一個java小屌而已,基本的問題查查還行,太深了還真沒那個水平,而且據說還可能是redis版本或者相容性這種讓人徹底無語的原因。

自己寫了個小程式for迴圈開2000個執行緒去連線池拿連線,拿到後休息10秒,列印成功和失敗。多次測試發現,前面1800+的連線總能拿成功,後面就失敗了,失敗量隨機的,而且RP爆發的一次竟然全部獲取成功了。執行緒數改到1000RP好的時全部成功,最常見的還是後面幾十個失敗。看來執行緒數多一些少一些也總有一些拿不到連線。記得一句話,JVM線上程很多的時候不穩定,而且網路偶爾丟包或者中斷那麼幾毫秒還是很常見的,作為程式設計師需要考慮這種極端的環境,而不要太相信機器太相信邏輯。

好,改造了下獲取連線的程式碼。

	public static Jedis getJedis()
	{
		int timeoutCount = 0;
		while (true) // 如果是網路超時則多試幾次
		{
			try
			{
				Jedis jedis = RedisPool.getResource();
				return jedis;
			} catch (Exception e)
			{
				// 底層原因是SocketTimeoutException,不過redis已經捕捉且丟擲JedisConnectionException,不繼承於前者
				if (e instanceof JedisConnectionException || e instanceof SocketTimeoutException)
				{
					timeoutCount++;
					log.warn("getJedis timeoutCount={}", timeoutCount);
					if (timeoutCount > 3)
					{
						break;
					}
				}else
				{
					log.warn("jedisInfo。NumActive=" + RedisPool.getBalancePool().getNumActive() + ", NumIdle="
							+ RedisPool.getNumIdle() + ", NumWaiters="
							+ RedisPool.getNumWaiters() + ", isClosed="
							+ RedisPool.isClosed());
					log.error("getJedis error", e);
					break;
				}
			}
		}
		return null;
	}


同時,連線池的獲取超時時間改成5秒(預設2秒)。扔到伺服器一跑,再無ERROR。偶爾會列印getJedis timeoutCount=1,極少數getJedis timeoutCount=2。領盒飯去了。



相關推薦

DBCP連線池出現連線異常解決方案

1.properties檔案獲取出錯,將配置檔案重新刪掉再加入一個同名檔案覆蓋 2.關閉配置檔案  避免被Myeclipse佔用; //工具包 package com.account.dao.util; import java.io.InputStream; import

redis連線異常解決方案

redis連線異常的解決方案 最近在做高併發架構,發現程式偶爾報錯: redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool

java.net.SocketException四大異常解決方案

常用方法 下場 不知道 -i keep 至少 通訊 star 程序員 java.net.SocketException如何才能更好的使用呢?這個就需要我們先要了解有關這個語言的相關問題。希望大家有所幫助。那麽我們就來看看有關java.net.SocketException的

springmvc 全局異常解決方案

his let pre 普通 public .com tro 相同 extends 系統中異常包括兩類:預期異常和運行時異常RuntimeException,前者通過捕獲異常從而獲取異常信息,後者主要通過規範代碼開發、測試通過手段減少運行時異常的發生。 系統的dao、ser

Android Studio更改工程名異常解決方案 :can't rename root module

包括 extern ext 相關 文件名 post roo 手動 修改文件 在修改Android Studio 中 project的名字時 ,提示 “can’t rename root module”。 這是因為Android S

“SYSTEM.DATA.SQLCLIENT.SQLCONNECTION”的類型初始值設定項引發異常---解決方案

conf mach med microsoft fault .sql def nec -s “System.Data.SqlClient.SqlConnection”的類型初始值設定項引發異常 問題出在了 .net 的C:\WINDOWS\Microsoft.NET\F

Redis安裝異常解決辦法

命令 alloc error: 說明 文件中 密碼登錄 from nload size $ wget http://download.redis.io/releases/redis-4.0.11.tar.gz $ tar xzf redis-4.0.11.tar.gz $

Redis穿透問題解決方案

快取穿透  快取穿透是指使用者查詢資料,在資料庫沒有,自然在快取中也不會有。這樣就導致使用者查詢的時候,在快取中找不到,每次都要去資料庫再查詢一遍,然後返回空。這樣請求就繞過快取直接查資料庫,這也是經常提的快取命中率問題。 解決的辦法就是:如果查詢資料庫也為空,直接設定一個預設值存放到快取,這樣第二次到緩

redis make異常解決

redis make 異常處理 進行編譯時出錯 1. 未安裝c編譯器錯誤 錯誤資訊 [[email protected]_0_16_centos src]# make cd src && make all make[1]: cd “/usr/local/redi

dubbo multicast 連線失敗解決方案

一、異常資訊 Exception in thread "main" com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method sayHello in the service com.demo.service.DemoSer

樹莓派3B的WiFi中文亂碼問題無法連線_解決方案

   相信很多樹莓派小白都會遇到這個煩人的問題,我當時查到的解決方案就是百度排行第一的一篇”簡書”裡的文章, 而且最可惡的是:你新增內容之後,sudo reboot 重啟的樹莓派wifi直接搜尋不到任何wifi資訊,這讓人很是頭大。 所以這個坑呢,我替你們踩過大家就不要重蹈覆轍了。 至於踩過並繼續尋找出

Android TabLayout在與viewpager AppBarLayout一起使用時出現tab選中後下劃線滑動緩慢,卡頓異常解決方案

今天早上剛測試發現的一個問題,之前沒有注意到,特別尷尬感覺,之前經常使用TabLayout和viewpager聯動切換碎片,異常的情況如下圖展示: 佈局程式碼如下: <?xml version="1.0" encoding="utf-8"?> <android.s

一次詭異的redis連線異常

一、異常出現  啟動jar包報異常,異常資訊如下,簡單分析後初步定位為redis連線異常。 2018-10-23 15:24:00.781 ERROR kmessage [main] [org.springframework.boot.SpringApplication] - Ap

spring配置 no matching editors or conversion strategy found 異常解決方案

spring 配置中遇到該問題,可以通過注入的方式解決,程式碼如下:  <tx:annotation-driven transaction-manager="myTxManager" proxy-target-class="true"/> 總結:Spring注入的是介面,關

Mysql連線異常解決方法

1、解決:Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone valu 報錯資訊為: Caused by: com.mysql.cj.exceptions

MySQL8.0的jdbc連線異常解決,連不上解決辦法

1.首先,安裝MySQL的時候選擇下面那種加密方式,否則第三方軟體不能連線資料庫,比如navicat連線不上。 2.以下兩種方式可以獲得Connection物件,一種是通過Driver物件的connect方法,一種是DriverManager的方法,建議使用後者。 3.在這裡注意以下,註冊驅

防火牆內JVisualVM連線jstatd解決方案

    jstatd啟動後會開啟兩個埠,其中一個埠可通過引數“-p”指定,如果不指定預設為1099,另一個是一個隨機埠,不能引數指定: # netstat -lpnt|grep jstatd tcp &

這可能是史上最全 Redis 高可用解決方案總結

一、常見使用方式 Redis 的幾種常見使用方式包括: Redis 單副本; Redis 多副本(主從); Redis Sentinel(哨兵); Redis Cluster; Redis 自研。 二、各種使用方式的優缺點 1、Redis 單副本 Redis

GLSurfaceView在recyclerview中做itemview豎向滑動時出現遮蓋其他控制元件滑出螢幕的詭異異常解決方案

這幾天遇到了一個需求,recyclerview中的itemview都是圓角矩形的視訊itemview,然後歷盡千辛萬苦找到了實現視訊圓角的解決方案,但卻發現又進入了另一個坑,一個非常詭異的異常,如下圖

Android 修改系統字型大小,導致頁面展示異常解決方案

Android系統預設是允許修改系統本身的字型大小的,導致頁面展示異常。 頁面展示異常是因為系統字型大小影響到了程式中字型的單位sp,所以解決此問題的方案1是,將佈局中字型大小的單位sp換成dp 解決方案2:重寫Activity或Application中的getResou