jedis是操作redis的常用工具,但其存在线程安全的问题。为了解决此问题,jedis常常与commons-pool一起使用,采用线程池的技术解决线程安全问题
首先是导入相关的依赖
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-pool2 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.4.2</version>
</dependency>
然后就是创建一个工具类,通过该工具类获取线程池对象JedisPool
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisUtil {
private static JedisPool pool;
//最大线程数
private static final int TOTAL = 20;
//最大空闲数
private static final int DLE = 2;
//连接超时时间
private static final int TIME_OUT = 6000;
/**
* 创建jedispool对象
* @param ip 服务器ip地址
* @param port redis进程的端口号
* @return
*/
public static JedisPool open(String ip, int port){
if(pool==null){
//通过config配置参数
JedisPoolConfig config = new JedisPoolConfig();
//设置最大线程数,一个线程对应一个jedis对象
config.setMaxTotal(TOTAL);
//设置最大空闲数
config.setMaxIdle(DLE);
//设置检查项为true,表示取出的redis对象可用
config.setTestOnBorrow(true);
//创建pool对象
pool = new JedisPool(config,ip,port,TIME_OUT);
}
return pool;
}
/**
* 关闭pool对象
*/
public static void close(){
if(pool!=null){
pool.close();
}
}
}
在代码中即可通过该工具类获取redis对象
String ip = "127.0.0.1";
int port = 6379;
Jedis jedis = JedisUtil.open(ip,port).getResource();
释放jedis对象返回连接池
jedis.close();
最后就是关于jedis对象的创建和释放建议在try-catch-finally语句块中执行,就可以保证资源的释放