Fork me on GitHub

Redis系列二Jedis

Jedis使用

添加依赖
1
2
3
4
5
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.0.0</version>
</dependency>

连接关闭

1
2
3
4
5
6
7
8
9
public class TestJedis
{
private Jedis jedis;
@Test
public void init()
{
jedis = new Jedis("127.0.0.1",6379); //主机、端口号
}
}
1
2
3
4
5
@Test
public void destory()
{
jedis.close();
}
五种数据类型
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
package jedis;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;

public class TestJedis
{
private Jedis jedis;
@Test
public void init()
{
jedis = new Jedis("127.0.0.1",6379);

//String
jedis.set("hello","world");
String value = jedis.get("hello");
System.out.println(value);
jedis.incr("counter");//自增

//hash
jedis.hset("myhash","z1","q1");
Long hset = jedis.hset("myhash", "z2", "q2");
jedis.hgetAll("myhash");

//list
jedis.rpush("mylist","1");
jedis.rpush("mylist","2");
jedis.rpush("mylist","3");
jedis.lrange("mylist",0,-1);

//set
jedis.sadd("myset","a");
jedis.sadd("myset","b");
jedis.sadd("myset","c");
jedis.smembers("myset");

//zset
jedis.zadd("myzset",99,"tom");
jedis.zadd("myzset",66,"peter");
jedis.zadd("myzset",33,"james");
}
}
Jedis连接池

优点 缺点
直连 1.简单方便2.适合少量长期连接场景 1.存在每次新建/关闭TCP开销2.资源无法控制,存在连接泄露的可能3.Jedis对象线程不安全
连接池 1.Jedis预先生成,降低开销使用2.连接池的形式保护和控制资源的使用 相对于直连,使用相对麻烦,尤其在资源的管理上需要很多参数来保证,一旦规划不合理也会出现问题
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
75
76
77
78
79
80
81
82
package jedis;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
* @author zqnh
* @date 2019/8/7 on 13:11.
*/
public final class RedisPool {

//Redis服务器IP
private static String ADDR = "127.0.0.1";
//Redis的端口号
private static Integer PORT = 6379;
//访问密码
private static String AUTH = "dsajdlkasjdaslkdjaslkdjaslkdjask";

//可用连接实例的最大数目,默认为8;
//如果赋值为-1,则表示不限制,如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)
private static Integer MAX_TOTAL = 1024;
//控制一个pool最多有多少个状态为idle(空闲)的jedis实例,默认值是8
private static Integer MAX_IDLE = 200;
//等待可用连接的最大时间,单位是毫秒,默认值为-1,表示永不超时。
//如果超过等待时间,则直接抛出JedisConnectionException
private static Integer MAX_WAIT_MILLIS = 10000;
private static Integer TIMEOUT = 10000;
//在borrow(用)一个jedis实例时,是否提前进行validate(验证)操作;
//如果为true,则得到的jedis实例均是可用的
private static Boolean TEST_ON_BORROW = true;
private static JedisPool jedisPool = null;


/**
* 静态块,初始化Redis连接池
*/
static {
try {
JedisPoolConfig config = new JedisPoolConfig();
/*注意:
在高版本的jedis jar包,比如本版本2.9.0,JedisPoolConfig没有setMaxActive和setMaxWait属性了
这是因为高版本中官方废弃了此方法,用以下两个属性替换。
maxActive ==> maxTotal
maxWait==> maxWaitMillis
*/
config.setMaxTotal(MAX_TOTAL);
config.setMaxIdle(MAX_IDLE);
config.setMaxWaitMillis(MAX_WAIT_MILLIS);
config.setTestOnBorrow(TEST_ON_BORROW);
jedisPool = new JedisPool(config,ADDR,PORT,TIMEOUT,AUTH);
} catch (Exception e) {
e.printStackTrace();
}

}

/**
* 获取Jedis实例
* @return
*/
public synchronized static Jedis getJedis(){
try {
if(jedisPool != null){
Jedis jedis = jedisPool.getResource();
return jedis;
}else{
return null;
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}

public static void returnResource(final Jedis jedis){
//方法参数被声明为final,表示它是只读的。
if(jedis!=null){
//jedis.close()取代jedisPool.returnResource(jedis)方法将3.0版本开始
jedis.close();
}
}
}