redis中Could not get a resource from the pool異常及解決方案
描述
這個錯誤產(chǎn)生的前提是這樣的,將數(shù)據(jù)存入redis(新安裝的)中,在通過連接池獲取jedis實例時,產(chǎn)生如下錯誤( Could not get a resource from the pool)。
分析
由于是新安裝的redis,配置文件沒有更改,低級的錯誤浪費不少時間,寫一篇文章,讓同樣犯這種錯誤的朋友別再浪費時間。
解決
更改配置文件 redis.conf 中兩處
1.將 bind 127.0.0.1 注釋掉
2.將 protected-mode 改為 no
| bind 127.0.0.1 | protected-mode |
|---|---|
| 默認(rèn)情況bind=127.0.0.1只能接受本機的訪問請求不寫的情況下,無限制接受任何ip地址的訪問 | 如果開啟了protected-mode,那么在沒有設(shè)定bind ip且沒有設(shè)密碼的情況下,Redis只允許接受本機的相應(yīng) |


運行代碼
//創(chuàng)建jedis配置文件對象 val jedisPoolConfig = new JedisPoolConfig() //添加配置信息 jedisPoolConfig.setMaxTotal(100) jedisPoolConfig.setMaxIdle(20) jedisPoolConfig.setMinIdle(0) jedisPoolConfig.setBlockWhenExhausted(true) jedisPoolConfig.setMaxWaitMillis(500) jedisPoolConfig.setTestOnBorrow(true) //創(chuàng)建連接池對象 var jedisPool:JedisPool = new JedisPool(jedisPoolConfig,"linux1",6379) //獲取實例 jedisPool.getResource
報錯內(nèi)容
ERROR --- [ Executor task launch worker for task 15] org.apache.spark.executor.Executor (line: 91) : Exception in task 7.0 in stage 2.0 (TID 15)
redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
at redis.clients.util.Pool.getResource(Pool.java:53)
at redis.clients.jedis.JedisPool.getResource(JedisPool.java:226)
at com.atguigu.bigdata.sparkmall.common.RedisUtil$.getJedisClient(RedisUtil.scala:26)
at com.atguigu.bigdata.sparkmall.realtime.Req7TimeAdvertClickTrendApplication$$anonfun$main$1$$anonfun$apply$2.apply(Req7TimeAdvertClickTrendApplication.scala:54)
at com.atguigu.bigdata.sparkmall.realtime.Req7TimeAdvertClickTrendApplication$$anonfun$main$1$$anonfun$apply$2.apply(Req7TimeAdvertClickTrendApplication.scala:53)
at org.apache.spark.rdd.RDD$$anonfun$foreachPartition$1$$anonfun$apply$29.apply(RDD.scala:926)
at org.apache.spark.rdd.RDD$$anonfun$foreachPartition$1$$anonfun$apply$29.apply(RDD.scala:926)
at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:1951)
at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:1951)
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87)
at org.apache.spark.scheduler.Task.run(Task.scala:99)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:322)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.ConnectException: Connection refused: connect
at redis.clients.jedis.Connection.connect(Connection.java:207)
at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:93)
at redis.clients.jedis.BinaryJedis.connect(BinaryJedis.java:1767)
at redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:106)
at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:868)
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:435)
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363)
at redis.clients.util.Pool.getResource(Pool.java:49)
... 14 more
Caused by: java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at redis.clients.jedis.Connection.connect(Connection.java:184)
... 21 more
其他原因
1.最大鏈接數(shù)量超標(biāo),資源未回收jedis.close();//釋放資源
2.壓根redis服務(wù)沒有起 (很多人是這種)
3.可能是linux防火墻問題造成的 檢查網(wǎng)絡(luò)是否暢通
4.檢查IP地址或端口是否錯誤
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Redis動態(tài)熱點數(shù)據(jù)緩存策略設(shè)計
本文主要介紹了Redis動態(tài)熱點數(shù)據(jù)緩存策略設(shè)計,包括熱點數(shù)據(jù)識別、動態(tài)緩存、多級緩存、預(yù)加載機制、更新策略以及監(jiān)控告警等,具有一定的參考價值,感興趣的可以了解一下2025-01-01
Redis數(shù)據(jù)庫的應(yīng)用場景介紹
這篇文章主要介紹了Redis數(shù)據(jù)庫的應(yīng)用場景介紹,本文講解了MySql+Memcached架構(gòu)的問題、Redis常用數(shù)據(jù)類型、Redis數(shù)據(jù)類型應(yīng)用和實現(xiàn)方式、Redis實際應(yīng)用場景等內(nèi)容,需要的朋友可以參考下2015-06-06

