Redis 连接池
# 110.Redis 连接池
Jedis 自带一个连接池:Jedispool,本文就来讲解下如何使用连接池。
# 使用连接池
使用连接池的步骤很简单:
- 创建
JedisPool
连接池对象 - 调用方法
getResource()
方法获取 Jedis 连接
@Test
public void helloJedisPool(){
JedisPool jedisPool = new JedisPool();
Jedis jedis = jedisPool.getResource();
jedis.set("hello", "world");
jedis.close(); //归还到连接池中
}
1
2
3
4
5
6
7
2
3
4
5
6
7
# 配置连接池
刚刚的例子中,我们创建连接池的时候,并没有传递配置,使用的默认配置。
而关于连接池的配置有很多,例如:
- 最大连接数
- 最多有多少个空闲的连接
- 等待连接的最大时间
- ......
我们可以创建一个连接池配置对象,并设置好上述参数;然后再创建连接池对象。
@Test
public void JedisPoolConfig(){
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(50); //连接实例的最大连接数
config.setMaxIdle(10); //控制一个 pool 最多有多少个状态为 idle(空闲的)的 jedis 实例,默认是 8
JedisPool jedisPool = new JedisPool(config, "localhost", 6379);
jedisPool.close();
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
更多配置:
#redis服务器的IP
redis.ip=xxxxxx
#redis服务器的Port
redis.port=6379
#最大活动对象数
redis.pool.maxTotal=1000
#最大能够保持idel状态的对象数
redis.pool.maxIdle=100
#最小能够保持idel状态的对象数
redis.pool.minIdle=50
#当池内没有返回对象时,最大等待时间
redis.pool.maxWaitMillis=10000
#当调用borrow Object方法时,是否进行有效性检查
redis.pool.testOnBorrow=true
#当调用return Object方法时,是否进行有效性检查
redis.pool.testOnReturn=true
#“空闲链接”检测线程,检测的周期,毫秒数。如果为负值,表示不运行“检测线程”。默认为-1.
redis.pool.timeBetweenEvictionRunsMillis=30000
#向调用者输出“链接”对象时,是否检测它的空闲超时;
redis.pool.testWhileIdle=true
# 对于“空闲链接”检测线程而言,每次检测的链接资源的个数。默认为3.
redis.pool.numTestsPerEvictionRun=50
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# Jedis 工具类
为了方便,我们可以做一个 Jedis 工具类,供项目中获取 Redis 连接:
package com.peterjxl.util;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisPoolUtils {
private static JedisPool jedisPool;
//服务器 IP 地址
private static String ADDR = "127.0.0.1";
//端口
private static int PORT = 6379;
//密码
private static String AUTH = "123456";
//连接实例的最大连接数
private static int MAX_ACTIVE = 1024;
//控制一个 pool 最多有多少个状态为 idle(空闲的)的 jedis 实例,默认值也是 8。
private static int MAX_IDLE = 200;
//等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出 JedisConnectionException
private static int MAX_WAIT = 10000;
//连接超时的时间
private static int TIMEOUT = 10000;
// 在 borrow 一个 jedis 实例时,是否提前进行 validate 操作;如果为 true,则得到的 jedis 实例均是可用的;
private static boolean TEST_ON_BORROW = true;
//数据库模式是 16 个数据库 0~15
public static final int DEFAULT_DATABASE = 0;
//初始化 Redis 连接池
static {
try {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(MAX_ACTIVE);
config.setMaxIdle(MAX_IDLE);
config.setMaxWaitMillis(MAX_WAIT);
config.setTestOnBorrow(TEST_ON_BORROW);
jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT,AUTH,DEFAULT_DATABASE);
} catch (Exception e) {
e.printStackTrace();
}
}
//获取 Jedis 实例
public synchronized static Jedis getJedis() {
try {
if (jedisPool != null) {
Jedis resource = jedisPool.getResource();
System.out.println("redis--服务正在运行: "+resource.ping());
return resource;
} else {
return null;
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
//释放资源
public static void returnResource(final Jedis jedis) {
if(jedis != null) {
jedisPool.returnResource(jedis);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
上次更新: 2024/10/1 21:14:36