最近在使用redis连接池的时候出现很多问题,现在记下来,也给正在研究的同仁们一点建议;
我使用的是redis-2.4.18,连接池使用的是JedisPool;
在使用过程中,发现redis报各种异常,socket closed,类型转换异常,Could not get a resource from the pool等等;总之没有消停过。
经过一个多星期的整理,发现主要是以下原因导致了这些异常:
1.redis连接池的回收机制;
这应该算是jedis的异常,使用完redis之后,必须将连接进行合理的回收。
回收分为2种:
1.正常回收
returnResource
2.异常回收
returnBrokenResource
回收代码如下:
Jedis redisWhile = null;
try{
redisWhile = RedisFactory.newRedis();
//redis操作
}catch(Exception ex){
if(redisWhile!=null){
RedisFactory.returnDestoryRedis(redisWhile);
}
ex.printStackTrace();
}finally{
RedisFactory.returnRedisPool(redisWhile);
}
每一次使用redis都要try catch;
2.redis的连接不能跨线程
这个当时坑了我很久,一个方法中如果使用了redis连接,那么在收回这个连接之前,代码中不能请求其他的redis连接;
Jedis redisWhile = null;
try{
redisWhile = RedisFactory.newRedis();
test(); //如果这个方法中也包含了redis连接池的请求,那么你悲催了
}catch(Exception ex){
if(redisWhile!=null){
RedisFactory.returnDestoryRedis(redisWhile);
}
ex.printStackTrace();
}finally{
RedisFactory.returnRedisPool(redisWhile);
}
如果保持这两点,那么调试下来应该能解决很多异常了。
分享到:
相关推荐
linux中安装redis和jedis及jedispool; redis安装所遇到的问题;
2. 资源返还:使用完Jedis实例后,需要返还给JedisPool,以便池子中的连接对象可以被其他客户端使用。 四、RedisUtil工具类 为了解决jedispool连redis高并发卡死的问题,我们可以使用RedisUtil工具类,该工具类...
JedisPool jedisPool = new JedisPool(poolConfig, "localhost", 6379); ``` 4. 从连接池获取Jedis实例进行操作: ```java Jedis jedis = jedisPool.getResource(); try { jedis.set("key", "value"); ...
为了避免这些问题,可以使用 JedisPool,JedisPool 是一个线程安全的网络连接池。可以用 JedisPool 创建一些可靠 Jedis 实例,可以从池中拿到 Jedis 的实例。 Jedis 的基本操作 Jedis 提供了多种基本操作,包括...
在这个例子中,我们首先创建了一个JedisPoolConfig实例,设置了连接池的最大和最小连接数,然后用这个配置创建了JedisPool。在main方法中,我们从池中获取一个Jedis实例,进行set和get操作,最后确保Jedis实例被正确...
3. 初始化`JedisPool`:使用`JedisPoolConfig`创建一个`JedisPool`实例,指定Redis服务器的地址、端口、密码等信息。 4. 从`JedisPool`中获取`Jedis`实例:在需要操作Redis时,从池中借用一个`Jedis`对象。 5. 使用...
解决这个问题的一种常见策略是使用Jedis的连接池JedisPool,它提供了更高效和可控的资源管理机制。 JedisPool的工作原理是维护一个Jedis实例的池,当需要与Redis交互时,可以从池中借用一个实例,使用完毕后归还给...
在本节中,我们讨论了如何优雅地使用Jedis进行Redis操作,重点是结合JedisPool来确保资源的高效利用和避免线程安全问题。同时,我们也提到了try-with-resources语句的使用以及通过自定义封装来强制资源归还的高级...
jedisPool = new JedisPool(poolConfig, "localhost", 6379); } public static Jedis getConnection() { return jedisPool.getResource(); } public static void releaseConnection(Jedis jedis) { if ...
在这个例子中,我们首先配置了JedisPoolConfig,然后创建了JedisPool实例。在main方法中,我们从池中获取一个Jedis实例,执行Redis操作,完成后将其归还到池中。 总的来说,"jedis-2.1.0.jar+commons-pool-1.6.jar...
标题中的"jedis-2.1.0.jar"和"commons-pool-1.5.4.jar"分别指的是两个Java库文件,它们是用于在Java应用程序中与...在实际使用中,需要考虑连接池的配置、异常处理以及版本兼容性等问题,以确保系统的稳定性和性能。
pool = new JedisPool(config, "localhost", 6379); } public static void main(String[] args) { try (Jedis jedis = pool.getResource()) { // 使用Jedis实例执行Redis操作 jedis.set("key", "value"); ...
4. **使用JedisPool**:在需要使用Jedis时,从池中borrow一个实例,执行操作后返回给连接池,而不是直接关闭。 四、连接池的优势 1. **性能提升**:避免了频繁创建和销毁连接的开销,提高了应用的响应速度。 2. **...
在上述代码中,我们首先创建了一个`JedisPoolConfig`实例,并设置了连接池的相关配置,然后使用这个配置和Redis服务器的地址、端口创建了`JedisPool`。在主方法中,我们从连接池中获取一个Jedis实例,执行Redis操作...
4. **多线程安全:** Jedis对象不是线程安全的,因此在多线程环境中,每个线程应使用自己的Jedis实例或从JedisPool获取。这避免了线程间的共享状态问题。 5. **支持Pipeline和事务:** 通过Pipeline,Jedis可以批量...
5. 使用连接池:在实际应用中,推荐使用连接池,如JedisPool,提高性能和资源利用率。 ```java JedisPoolConfig config = new JedisPoolConfig(); JedisPool pool = new JedisPool(config, "localhost", 6379); ...
在代码中,首先创建一个`JedisPoolConfig`实例,然后使用这个配置创建`JedisPool`。下面是一个简单的示例: ```java JedisPoolConfig poolConfig = new JedisPoolConfig(); poolConfig.setMaxTotal(100); // 最大...
在上面的代码中,我们首先获取了一个JedisPool对象,然后使用getResource()方法获取一个可用的Jedis资源。接着,我们使用该资源执行Redis操作,并在finally块中释放资源。 三、释放资源 释放资源是使用Jedis连接池...
JedisPool jedisPool = new JedisPool(poolConfig, "localhost", 6379); Jedis jedis = jedisPool.getResource(); // 使用Jedis进行操作 jedis.set("key", "value"); // 使用完后归还连接 jedis.close(); ...
### Java操作Redis的知识点 #### 一、Jedis与线程安全问题 在Java中使用Redis时,开发者可能会遇到一个常见的...通过以上分析可以看出,合理地使用`JedisPool`能够有效地避免线程安全问题,并提高Redis操作的性能。