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

绝地武士:无法从泳池中获取资源

丘向荣
2023-03-14

我们的应用程序使用Jedis-2.2.1并连接到Redis-2.6,以下是我如何获得jedis资源:

protected static JedisWrapper getRedisUserWrite(String UDID) {
        if (redisUserWritePools.get(0) == null) init();

        int hash = hash(UDID);
        Jedis jedis = redisUserWritePools.get(hash).getResource();
        jedis.select(dbs.get("redisUserWritePools" + hash));

        return new JedisWrapper(jedis, redisUserWritePools.get(hash));
    }

这是我的绝地说唱者(统一资源管理):

public class JedisWrapper {
    private Jedis jedis;
    private JedisPool pool;

    public JedisWrapper(Jedis jedis, JedisPool pool) {
        this.jedis = jedis;
        this.pool = pool;
    }

    public Jedis get(){
        return this.jedis;
    }

    public void returnResource() {
        if(null != this.jedis){
            this.pool.returnResource(this.jedis);
        }
    }

    public void returnBrokenResource() {
        if(null != this.jedis) {
            this.pool.returnBrokenResource(this.jedis);
        }
        this.jedis = null;
    }
}

JedisWrapper是Jedis实例的容器,下面是我如何使用它:

private static void cacheSDKIDs(String UDID, String[] SDKIDs) {

        JedisWrapper wrapper = getRedisUserWrite(UDID);
        try {
            if (SDKIDs != null) {
                wrapper.get().del(UDID);
                wrapper.get().sadd(UDID, SDKIDs);
            }
        } catch (JedisConnectionException e) {
            e.printStackTrace();
            wrapper.returnBrokenResource();
        }catch (Exception e) {
            e.printStackTrace();
        } finally {
            wrapper.returnResource();
        }
    }

请注意,SKDIDs可能非常大(例如可以达到最大8KB)。

每次我重启我们的应用程序,所有的redis连接都是正常的,但是几个小时后,无法从池中获取资源异常出来了。频率变得越来越高,然后所有到Redis的连接都断开了,可以创建新的连接。

以下是我的配置:

<bean id = "redisConfig" class="redis.clients.jedis.JedisPoolConfig">
    <property name="maxActive"  value="400" />
    <property name="maxIdle" value="100" />
    <property name="minIdle" value="20" />
    <property name="maxWait" value="4000" />
    <property name="testOnBorrow"  value="true"/>
    <property name="testOnReturn" value="true" />
  </bean>

异常堆栈跟踪:

Caused by: redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
    at redis.clients.util.Pool.getResource(Pool.java:40)
    at com.xxxice.redis.BaseRedis.getRedisUserWrite(BaseRedis.java:158)
    at com.xxx.service.redis.DeviceRedis.cacheSDKIds(DeviceRedis.java:128)
    at com.xxx.redis.DeviceRedis.cacheDevice(DeviceRedis.java:65)
    at com.xxx.service.DeviceService.update(DeviceService.java:88)
    at com.xxx.controller.Devices.update(Devices.java:25)
    ... 32 more
Caused by: java.util.NoSuchElementException: Timeout waiting for idle object
    at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1174)
    at redis.clients.util.Pool.getResource(Pool.java:38)
    ... 37 more

共有2个答案

荣轶
2023-03-14

检查您是否有通过代码访问redis的权限

居英资
2023-03-14

在你的绝地说唱机中,绝地是作为一个类变量创建的,只需实例化一次。请在getJedis方法中声明,然后问题就会解决

 类似资料:
  • 我使用的是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配置类: 有没有人面对过这个问题或者对此有任

  • 我已经通过了很多环节,比如绝地,无法获得绝地连接:无法从池中获得资源,无法获得绝地连接;无法从池中获取资源,但仍获取以下错误。 我在Spring Batch中使用Spring Data Redis,从mysql读取数据并写入redis DB。似乎有些连接错误。 下面的错误仅供参考。 我正在使用下面的简单配置。

  • 我试图从绝地人才库中回收资源时出错了。代码如下。

  • 根据我的理解,使用JOhm和Jedis,可以在Redis中存储/检索java类对象。我有一个问题是,JOhm是否也将java对象保存在内存中,以便下次需要该对象(与key相关联)时,从内存返回该对象,而不是每次都从Redis读取该对象?

  • 我为数据可视化工具开发了一个插件。现在我想在它里面使用redis。当我在另一个项目(不在我的插件中)中尝试下面的redis代码时,效果很好。 但当我在插件中使用绝地武士时,我得到了由java引起的和错误。为了把我的插件安装到这个数据可视化工具上。我需要创建一个jar文件,我这样做了,它在不添加jedit部分的情况下运行良好。 我正在使用IntelliJ Idea,我创建了一个工件,并从顶部菜单中的

  • 所以,我有两个应用程序使用绝地武士。它们都连接到同一台服务器,其中一个监听发布以检查是否写入了某些内容。好吧,经过大约10个小时的持续使用和装载,设置/获取/发布/订阅等,绝地武士们返回了破碎的管道。我不知道为什么,因为我在绝地武士中有超时到0的时间。有什么想法吗?