2.1 准备工作

首先我们在Linux中开启redis服务:

1
2
3
wxs@ubuntu:/usr/local/redis/src$ ./redis-server ../redis.conf 
wxs@ubuntu:/usr/local/redis/src$ ps auxc | grep redis
wxs 5278 0.0 0.4 51828 8408 ? Ssl 20:12 0:00 redis-server

上一节中我们只是在Linux主机中简单的测试了下 Redis 的使用,但是那样并没有什么实际用处,我们可以在程序中去远程的访问 Redis。

我们以 Java 为例,想要在 Java 程序中使用 Redis,首先我们需要借助第三方库 jedis,导入需要的包:

为了方便测试,还需导包:

2.2 第一个Jedis程序

导完包后,我们编写第一个 Jedis 程序,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import org.junit.Test;

import redis.clients.jedis.Jedis;

/**
* @className JedisTest.java
* @author jitwxs
* @version 创建时间:2018年2月27日 下午8:21:10
*/
public class JedisTest {
@Test
public void test1() {
// 1.获得连接对象。参数为redis所在的服务器地址及端口号
Jedis jedis = new Jedis("192.168.111.152", 6379);

// 2.获得数据
String userName = jedis.get("userName");
System.out.println(userName);

jedis.close();
}
}

是不是十分简单,首先我们获取到了 Jedis 的实例,需要传入的参数也是十分易懂,即运行 Redis 的主机的 IP 地址和 Redis 的端口号。然后直接使用 get 方法就获取到了 userName 的 value 值。

运行程序,如果你没有导入上面的 hamcrest-all 包的话,可能会出现这个错误:

导入后,运行结果如下:

很不幸,再次出现了错误,错误原因是说连接被拒绝,这是因为我们的 Redis 的配置文件中默认只允许本机访问,停 止Redis 服务,修改配置文件:

1
2
wxs@ubuntu:/usr/local/redis/src$ ./redis-cli shutdown
wxs@ubuntu:/usr/local/redis/src$ sudo vim ../redis.conf

将配置文件中的 bind 参数修改为0.0.0.0,即所有主机都能访问:

重新启动 Redis,并运行 Java 程序:

我这里已经能够成功取出值了,如果这个时候你还是出现了错误,且错误信息是连接超时(connention timeout…),可能是因为Linux主机没有开放 Redis 的端口,导致我们远程连接被拒绝。以 iptables 为例:

1
wxs@ubuntu:~$sudo iptables -A INPUT -p tcp –dport 6379 -j ACCEPT #开放本机6379端口

2.3 Jedis连接池

每使用一次就 new 一个 Jedis 实例感觉不是很靠谱,Jedis 和数据库连接库一样,都有连接池,即 JedisPool ,它的配置很简单。配置好连接池后以后直接从连接池中取 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
@Test
public void test2() {
//1. 创建Jedis连接池配置(包含许多配置,这里只配置了3个)
JedisPoolConfig poolConfig = new JedisPoolConfig();
// 设置最小和最大闲置个数
poolConfig.setMinIdle(5);
poolConfig.setMaxIdle(10);
// 设置连接池最大个数
poolConfig.setMaxTotal(30);

//2. 创建Jedis连接池
JedisPool pool = new JedisPool(poolConfig,"192.168.111.152", 6379);

//3. 从连接池中获取Jedis对象
Jedis jedis = pool.getResource();

//4.操纵数据
jedis.set("age", "20");
System.out.println(jedis.get("age"));

//5.关闭资源
jedis.close();
pool.close();
}

2.4 封装成工具类

上面完成了 Redis 的基本使用,我们可以把上面的 Redis 连接池封装成一个工具类,其他地方的代码直接调用工具类来执行即可。

首先在 src 下面新建一个配置文件 redis.properties,把一些配置信息存储在配置文件中:

redis.properties
1
2
3
4
5
6
7
8
#Redis连接信息
redis.ip = 192.168.111.152
redis.port = 6379

#Redis配置信息
redis.minIdle = 5
redis.maxIdle = 10
redis.maxTotal = 30

新建 JedisUtils.java:

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
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
* @className JedisUtils.java
* @author jitwxs
* @version 创建时间:2018年2月27日 下午11:56:55
*/
public class JedisUtils {
private static JedisPool jedisPool = null;

/**
* 获取连接
* @author jitwxs
* @version 创建时间:2018年2月28日 上午12:06:00
* @return
*/
public static Jedis getJedis() {
if(jedisPool == null) {
initJedisPool();
}
return jedisPool.getResource();
}

/**
* 关闭连接
* @author jitwxs
* @version 创建时间:2018年2月28日 上午12:06:59
* @param jedis
*/
public static void closeJedis(Jedis jedis) {
jedis.close();
}

private static void initJedisPool() {
InputStream in = JedisUtils.class.getClassLoader().getResourceAsStream("redis.properties");
Properties properties = new Properties();
try {
properties.load(in);
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMinIdle(Integer.parseInt(properties.getProperty("redis.minIdle")));
poolConfig.setMaxIdle(Integer.parseInt(properties.getProperty("redis.maxIdle")));
poolConfig.setMaxTotal(Integer.parseInt(properties.getProperty("redis.maxTotal")));

jedisPool = new JedisPool(poolConfig, properties.getProperty("redis.ip"),
Integer.parseInt(properties.getProperty("redis.port")));
} catch (IOException e) {
System.out.println("载入配置文件错误");
e.printStackTrace();
}
}
}

编写测试用例,运行程序:

1
2
3
4
5
6
@Test
public void test3() {
Jedis jedis = JedisUtils.getJedis();
System.out.println(jedis.get("age"));
JedisUtils.closeJedis(jedis);
}