【Redis】Jedis与Jedis连接池
目录
1. Jedis 单实例连接
2. Jedis 连接池(JedisPool)
3. JedisPool 与 Jedis 的区别
4. JedisPool 线程安全
6. 使用 JedisPool 的注意事项
1. Jedis 单实例连接
在最简单的用法中,Jedis 提供了直接与 Redis 服务器连接的方式。这适合于单线程应用或者当你不需要频繁地进行 Redis 操作时。
示例代码:
package com.heima.test;
import com.heima.jedis.util.JedisConnectionFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;import java.util.Map;public class JedisTest {private Jedis jedis;@Beforepublic void setUp() throws Exception {//1.建立连接jedis = new Jedis("192.168.30.134",6379);//2.设置密码jedis.auth("123321");//3.选择库jedis.select(0);}@Testpublic void testString() {//存入数据String result = jedis.set("name","虎哥");System.out.println("result = "+result);//获取数据String name = jedis.get("name");System.out.println("name = "+name);}@Testpublic void testHash() {//插入hash数据jedis.hset("user:1","name","Jack");jedis.hset("user:1","age","21");//获取数据Map<String, String> map = jedis.hgetAll("user:1");System.out.println(map);}@Afterpublic void tearDown() throws Exception {if(jedis != null){jedis.close();}}
}
存在问题:
- 性能问题:每次操作 Redis 都会建立和销毁连接,导致性能开销较大。
- 线程安全问题:在多线程环境中,如果每个线程都创建一个 Jedis 实例,它们会共享底层的连接资源,可能会导致并发问题。
2. Jedis 连接池(JedisPool
)
为了提高性能并解决连接管理的问题,Jedis 提供了 连接池。JedisPool
用于管理 Redis 连接,并允许多个线程共享连接,而无需每次都创建新的连接。Jedis 连接池通常在高并发环境下使用。
使用 JedisPool
的好处:
- 连接复用:JedisPool 允许你从池中获取连接并在操作完成后返回池中,而不需要每次都建立新连接。
- 性能提升:通过复用连接,避免了频繁创建和销毁连接的开销。
- 线程安全:连接池本身是线程安全的,可以在多个线程之间共享连接。
示例代码:
package com.heima.jedis.util;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisPool;public class JedisConnectionFactory {private static final JedisPool jedisPool;static {//配置连接池JedisPoolConfig poolConfig = new JedisPoolConfig();//设置最大连接数poolConfig.setMaxTotal(8);//设置最大空闲连接数poolConfig.setMaxIdle(8);//设置最小空闲连接数poolConfig.setMinIdle(0);//设置最长等待时间,mspoolConfig.setMaxWaitMillis(1000);//创建连接池对象jedisPool = new JedisPool(poolConfig,"192.168.30.134",6379,1000,"123321");}public static Jedis getJedis(){return jedisPool.getResource();}
}
package com.heima.test;
import com.heima.jedis.util.JedisConnectionFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;import java.util.Map;public class JedisTest {private Jedis jedis;@Beforepublic void setUp() throws Exception {//1.建立连接
// jedis = new Jedis("192.168.30.134",6379);jedis = JedisConnectionFactory.getJedis();//2.设置密码jedis.auth("123321");//3.选择库jedis.select(0);}@Testpublic void testString() {//存入数据String result = jedis.set("name","虎哥");System.out.println("result = "+result);//获取数据String name = jedis.get("name");System.out.println("name = "+name);}@Testpublic void testHash() {//插入hash数据jedis.hset("user:1","name","Jack");jedis.hset("user:1","age","21");//获取数据Map<String, String> map = jedis.hgetAll("user:1");System.out.println(map);}@Afterpublic void tearDown() throws Exception {if(jedis != null){jedis.close();}}
}
3. JedisPool 与 Jedis 的区别
- Jedis:单个 Redis 连接,通常适用于简单或低并发的场景。每次操作 Redis 都需要建立一个新的连接,开销较大,尤其是在高并发环境中。
- JedisPool:一个 Redis 连接池,适用于高并发场景。连接池中的连接可以被多个线程共享,减少了连接的创建和销毁的开销,同时连接池可以有效管理连接资源。
4. JedisPool 线程安全
- 线程安全:
JedisPool
本身是线程安全的,这意味着你可以在多个线程中共享同一个连接池。每个线程通过getResource()
获取一个连接,操作完成后,使用jedis.close()
将连接归还池中。 - 连接复用:多个线程共享同一个连接池,避免了频繁创建和销毁连接的性能开销。
6. 使用 JedisPool 的注意事项
- 连接池的大小:连接池的大小应根据系统负载和 Redis 服务器的并发处理能力进行调整。可以通过配置
setMaxTotal
来控制连接池的大小。 - 关闭连接池:在应用程序关闭时,要调用
jedisPool.close()
来释放资源,避免内存泄漏。 - 性能调优:合理配置连接池的空闲连接数、最大连接数、最大等待时间等参数,以适应具体的业务需求。