当前位置: 首页 > 知识库问答 >
问题:

Redis.clients.jedis.exceptions.JedisException:无法从池中获取资源

叶健柏
2023-03-14

Redis.Properties

#jedisPoolConfig
redis.minIdle=100
redis.maxIdle=500
redis.maxTotal=50000 
redis.maxWaitMillis=10000  
redis.testOnBorrow=true


#jedisPool
redis.host=192.168.13.169
redis.port=6379
redis.timeout=3000

redis.port2=6380

#redis-sentinel
redis.sentinel=192.168.13.169:26379
redis.master=mymaster

spring-redis.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:p="http://www.springframework.org/schema/p"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans.xsd">

<!--properties配置-->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>classpath:redis.properties</value>
        </list>
    </property>
    <property name="ignoreUnresolvablePlaceholders" value="true"/>
</bean>

<!-- 连接池配置信息 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
    <property name="maxIdle" value="${redis.maxIdle}" />
    <property name="maxTotal" value="${redis.maxTotal}" />
    <property name="maxWaitMillis" value="${redis.maxWaitMillis}" />
    <property name="testOnBorrow" value="${redis.testOnBorrow}" />
</bean>

<!--初级版:单实例-->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool" scope="singleton">
    <constructor-arg name="poolConfig" ref="jedisPoolConfig" />
    <constructor-arg name="host" value="${redis.host}" />
    <constructor-arg name="port" value="${redis.port}" type="int" />
</bean>

<!--主从-->
<bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool">
    <constructor-arg index="0" ref="jedisPoolConfig" />
    <constructor-arg index="1">
        <list>
            <bean class="redis.clients.jedis.JedisShardInfo">
                <constructor-arg name="host" value="${redis.host}" />
                <constructor-arg name="port" value="${redis.port}" />
                <constructor-arg name="timeout" value="${redis.timeout}" />
                <constructor-arg name="name" value="master" />
            </bean>
            <bean class="redis.clients.jedis.JedisShardInfo">
                <constructor-arg name="host" value="${redis.host}" />
                <constructor-arg name="port" value="${redis.port2}" />
                <constructor-arg name="timeout" value="${redis.timeout}" />
                <constructor-arg name="name" value="slave1" />
            </bean>
        </list>
    </constructor-arg>
</bean>

<!--sentinel模式-->
<bean id="redisSentinelConfiguration" class="org.springframework.data.redis.connection.RedisSentinelConfiguration">
    <constructor-arg name="master" value="${redis.master}" />
    <constructor-arg name="sentinelHostAndPorts">
        <set>
            <value>${redis.sentinel}</value>
        </set>
    </constructor-arg>
</bean>

<!--Jedis连接池-->
<bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true">
    <property name="hostName" value="${redis.host}"/>
    <constructor-arg ref="redisSentinelConfiguration" />
    <constructor-arg ref="jedisPoolConfig" />
</bean>

<!-- redis template definition -->
<bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate" p:connection-factory-ref="jedisConnFactory"/>

<bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/>

代码

控制器

@Controller
public class JedisController {
......
@Autowired
private RedisService redisService;
@RequestMapping(value = "test2")
@ResponseBody
public String test2(){
    redisService.set("key2","v2");
    return redisService.get("key1");
}
......
}
@Service
public class RedisService extends BinaryRedisService {
public RedisService() {}

public String set(final String key, final String value) {
    return (String)this.execute(new Function<ShardedJedis, String>() {
        public String callBack(ShardedJedis shardedJedis) {
            return shardedJedis.set(key, value);
        }
    });
}
......
}

public class BinaryRedisService {
@Autowired
protected ShardedJedisPool shardedJedisPool;

public BinaryRedisService() {
}

protected <T> T execute(Function<ShardedJedis, T> fun) {
    ShardedJedis shardedJedis = null;
    T t = null;

    try {
        shardedJedis = this.shardedJedisPool.getResource();
        t = fun.callBack(shardedJedis);
    } catch (Exception var8) {
        var8.printStackTrace();
    } finally {
        if(null != shardedJedis) {
            shardedJedis.close();
        }

        return t;
    }
}
......
}

共有1个答案

弓方伟
2023-03-14

您需要确保a)Redis正在运行b)它能够接受来自远程主机的连接,c)如果您启用了密码保护,请在代码中提供密码。

为了确保它能够接受来自远程主机的连接,您必须查看redis.conf文件。找到带有绑定地址的行(应该类似于:bind127.0.0.1)并注释掉它(这样它就可以接受来自所有远程主机的请求-不建议用于生产,但可以用于测试),或者添加您希望Redis服务接受连接的远程IP。

 类似资料:
  • 我正在运行多个工作线程(大约10个)来访问redis Q的数据。 我正在使用infinte timeout For Jedis客户端。 但我仍然收到错误“无法从池中获取资源”。stacktrace如下所示。

  • 大家好,我正在尝试使用Java建立redis服务器。我的Redis服务器是linux服务器,ulimit无限。 这里是创建连接的spring bean 公共类JedisService实现IJedisService,InitializingBean,DisposableBean{private JedisPool JedisPool;

  • 我每5分钟运行一次批处理作业,我不希望其他节点运行同一个作业,因此我使用绝地锁将一个对象锁定5分钟。这样,如果另一个节点试图运行同一个作业,它们就不会得到锁。工作是在获得锁后开始的,当我试图从Redis读取它时,我得到以下异常情况: 这是我的密码 spring启动应用程序。属性文件 作业在开始时执行以下代码以获得锁 之后,redis仓库类试图读取特定模式的值... 这就是我在日志中看到的完全例外。

  • 我成功地获得了20个请求的响应,但无法获得其余10个请求的响应。我面临的问题是,在前20个请求使用了20个连接之后,其余的10个请求无法从池中获得jedis连接,因此我得到以下例外情况: 我已经在网上搜索,但没有找到解决办法。有人能帮我吗?

  • 问题内容: 我已经在几个线程中看到了答案,但对我却没有解决,而且由于我的问题偶尔发生,因此问这个问题是否有人有任何想法。 我正在使用jedis版本2.8.0,Spring Data Redis版本1.7.5。和redis服务器版本2.8.4用于我们的缓存应用程序。 我有多个缓存保存在redis中,并且从redis获得请求。我正在使用spring数据redis API保存和获取数据。 所有保存和获取

  • 我使用的是jedis版本2.8.0和Spring Data redis版本1.7.5。和redis服务器版本2.8.4。 我有多个缓存得到保存在redis和获取请求是从redis完成的。我正在使用spring data redis API来保存和获取数据。 所有的save和get都可以正常工作,但偶尔geting会低于exception: 我的redis配置类: 有没有人面对过这个问题或者对此有任