【Redis】Jedis与Jedis连接池
·
目录
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;
@Before
public void setUp() throws Exception {
//1.建立连接
jedis = new Jedis("192.168.30.134",6379);
//2.设置密码
jedis.auth("123321");
//3.选择库
jedis.select(0);
}
@Test
public void testString() {
//存入数据
String result = jedis.set("name","虎哥");
System.out.println("result = "+result);
//获取数据
String name = jedis.get("name");
System.out.println("name = "+name);
}
@Test
public 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);
}
@After
public 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);
//设置最长等待时间,ms
poolConfig.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;
@Before
public void setUp() throws Exception {
//1.建立连接
// jedis = new Jedis("192.168.30.134",6379);
jedis = JedisConnectionFactory.getJedis();
//2.设置密码
jedis.auth("123321");
//3.选择库
jedis.select(0);
}
@Test
public void testString() {
//存入数据
String result = jedis.set("name","虎哥");
System.out.println("result = "+result);
//获取数据
String name = jedis.get("name");
System.out.println("name = "+name);
}
@Test
public 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);
}
@After
public 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()来释放资源,避免内存泄漏。 - 性能调优:合理配置连接池的空闲连接数、最大连接数、最大等待时间等参数,以适应具体的业务需求。
更多推荐


所有评论(0)