# Spring 整合 Redis ( XML配置方式)
### 一、项目说明
### 1.1 Redis客户端
关于 spring 整合 Redis 本用例提供两种整合方法:
+ **Jedis**: 官方推荐的 java 客户端,能够胜任 Redis 的大多数基本使用;
+ **Redisson**:也是官方推荐的客户端,比起 Redisson 提供了更多高级的功能,如分布式锁、集合数据切片等功能。同时提供了丰富而全面的中英文版本的说明文档。
Redis 所有语言官方推荐的客户端可以在 [客户端](http://www.redis.cn/clients.html) 该网页查看,其中官方推荐的客户端使用了:star:进行标注:
### 1.2 可视化软件
推荐使用 **Redis Desktop Manager** 作为可视化查看工具,可以直观看到存储的数据及其序列化的情况。
### 1.3 项目结构
+ Jedis 和 Redisson 的配置和单元测试分别位于 resources 和 test 下对应的包中,其中集群的配置文件以 cluster 结尾。所有配置按需在 `springApplication.xml` 用 import 标签导入。
+ 实体类 Programmer 用于测试 Redisson 序列化与反序列化。
**springapplication.xml 文件:**
```xml
```
### 1.4 基本依赖
除了 Spring 的基本依赖外,需要导入 Jedis 和 Redisson 对应的客户端依赖:
```xml
redis.clients
jedis
3.0.0
org.redisson
redisson
3.9.1
io.netty
netty-all
4.1.32.Final
```
## 二、Spring 整合 Jedis
### 2.1 新建配置文件
```properties
redis.host=127.0.0.1
redis.port=6379
# 连接超时时间
redis.timeout=2000
# 最大空闲连接数
redis.maxIdle=8
# 最大连接数
redis.maxTotal=16
```
### 2.2 单机配置
```xml
```
### 2.3 集群配置
```xml
```
### 2.4 单机版本测试用例
+ 需要注意的是,对于 Jedis 而言,单机版本和集群版本注入的实例是不同的;
+ Jedis 本身并不支持序列化于反序列化操作,如果需要存储实体类,需要序列化后存入,而 Redisson 本身就支持序列化于反序列化操作,详见下文)。
```java
@RunWith(SpringRunner.class)
@ContextConfiguration({"classpath:springApplication.xml"})
public class JedisSamples {
@Autowired
private Jedis jedis;
@Test
public void Set() {
jedis.set("hello", "spring");
}
@Test
public void Get() {
String s = jedis.get("hello");
System.out.println(s);
}
@Test
public void setEx() {
String s = jedis.setex("spring", 10, "我会在 10 秒后过期");
System.out.println(s);
}
}
```
### 2.5 集群版本测试用例
```java
@RunWith(SpringRunner.class)
@ContextConfiguration({"classpath:springApplication.xml"})
public class JedisClusterSamples {
@Autowired
private JedisCluster jedisCluster;
@Test
public void Set() {
jedisCluster.set("hello", "spring");
}
@Test
public void Get() {
String s = jedisCluster.get("hello");
System.out.println(s);
}
@Test
public void setEx() {
String s = jedisCluster.setex("spring", 10, "我会在 10 秒后过期");
System.out.println(s);
}
}
```
## 三、Spring 整合 Redisson
### 2.1 单机配置
```xml
```
### 2.2 集群配置
```xml
```
### 2.3 存储基本类型测试用例
需要注意的是,对于 Redisson 而言, 单机和集群在使用的时候注入的都是 RedissonClient,这和 Jedis 是不同的。
```java
@RunWith(SpringRunner.class)
@ContextConfiguration({"classpath:springApplication.xml"})
public class RedissonSamples {
@Autowired
private RedissonClient redissonClient;
@Test
public void Set() {
// key 存在则更新 不存在则删除
RBucket rBucket = redissonClient.getBucket("redisson");
rBucket.set("firstValue");
}
@Test
public void Get() {
// key 存在则更新 不存在则删除
RBucket rBucket = redissonClient.getBucket("redisson");
System.out.println(rBucket.get());
}
@Test
public void SetEx() {
// key 存在则更新 不存在则删除
RBucket rBucket = redissonClient.getBucket("redissonEx");
rBucket.set("我在十秒后会消失", 10, TimeUnit.SECONDS);
}
@After
public void close() {
redissonClient.shutdown();
}
}
```
### 2.4 存储实体对象测试用例
```java
@RunWith(SpringRunner.class)
@ContextConfiguration({"classpath:springApplication.xml"})
public class RedissonObjectSamples {
@Autowired
private RedissonClient redissonClient;
@Test
public void Set() {
RBucket rBucket = redissonClient.getBucket("programmer");
rBucket.set(new Programmer("xiaoming", 12, 5000.21f, new Date()));
// Redisson 默认采用 Jackson 将对象进行序列化和反序列化
// 存储结果: {"@class":"com.heibaiying.bean.Programmer","age":12,"birthday":["java.util.Date",1545714986590],"name":"xiaoming","salary":5000.21}
}
@Test
public void Get() {
RBucket rBucket = redissonClient.getBucket("programmer");
System.out.println(rBucket.get());
}
@After
public void close() {
redissonClient.shutdown();
}
}
```