SpringBoot整合Redis
SpringBoot整合Redis简单的主要分为以下步骤:
1.添加redis依赖(redis启动器)
<!--redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.0.4.RELEASE</version>
</dependency>
2.添加redis配置
spring:
redis:
database: 0
host: 127.0.0.1
port: 6379
jedis:
pool:
max-active: 100
max-idle: 10
max-wait: 100000
timeout: 5000
如果有密码的还需要配置密码
3.启动本地Redis,具体下载教程参考Redis下载启动
4.编写简单测试方法查看是否可以正常存取
在测试类中注入RedisTemplate,并进行简单测试:
@Autowired
private RedisTemplate<String, String> redisTemplate;
@Test
public void testRedisString() {
redisTemplate.opsForValue().set("myKey", "myValue");
System.out.println(redisTemplate.opsForValue().get("myKey"));
}
使用Redis可视化管理工具查看会发现:
此时已经成功存入到Redis中了,上面存入到的值是一个字符串,但如果先要存入一个对象怎么办呢?多数想法下会想到把RedisTemplate<String, String>的类型改成RedisTemplate<String, Object>就可以了,没错,事实就是这么干的。
我们只需要注入
@Autowired
private RedisTemplate<String, String> redisTemplate;
即可,但是会发现报了个错误:
鼠标悬浮会发现提示没有这个Bean,原来是RedisTemplate并没有提供这种类型的(RedisTemplate<String, Object>)Bean,如果想要注入,需要用@Resource注解,该注解可以注入RedisTemplate,这样就可以接着使用RedisTemplate<String, Object>
此时新建一个类,实现序列化:
public class User implements Serializable {
private String name;
private int age;
public User() {
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
紧接着编写测试方法:
@Test
public void testRedisObject() {
User user = new User("fanhuaIIIIII", 12);
redisTemplate.opsForValue().set("myUser", user);
System.out.println(redisTemplate.opsForValue().get("myUser"));
}
此时测试执行通过,可视化工具中查看发现:
可以发现存入的对象出现了乱码,这是什么原因呢?
我们知道,在Java中,一切皆对象,如果想要将对象存储,则需要将对象序列化。RedisTemplate<String, String>则是提供了序列化的配置,这也就是为什么存字符串未出现乱码,而存对象出现乱码的原因。追踪RedisTemplate<String, String>的源码发现这样一段代码:
public StringRedisTemplate() {
setKeySerializer(RedisSerializer.string());
setValueSerializer(RedisSerializer.string());
setHashKeySerializer(RedisSerializer.string());
setHashValueSerializer(RedisSerializer.string());
}
这就是RedisTemplate<String, String>提供的序列化的设置,而RedisTemplate提供的是JdkSerializationRedisSerializer序列化,如果我们想实现RedisTemplate<String, Object>的序列化,则需要手动设置,提供两种方式:
第一种
在测试方法中使用redisTemplate之前,先实现Redis键值的序列化设置
@Test
public void testRedisObject() {
// redis的键采用String的序列化方式
redisTemplate.setKeySerializer(new StringRedisSerializer());
// redis的值采用jackson的序列化方式
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
User user = new User("fanhuaIIIIII", 12);
redisTemplate.opsForValue().set("myUser", user);
System.out.println