我们的应用程序使用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
检查您是否有通过代码访问redis的权限
在你的绝地说唱机中,绝地是作为一个类变量创建的,只需实例化一次。请在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的时间。有什么想法吗?