1.首先我们先导入依赖
<!--springboot对redis依赖包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.5</version>
</dependency>
<--也可以用fastjson-->
2.编辑配置文件,这里我是用yml格式应用的
# Redis数据库索引(默认为0)
spring:
redis:
database: 0
# Redis服务器地址
host: 192.168.232.128
# Redis服务器连接端口
port: 6379
# Redis服务器连接密码(默认为空)
password:
# 连接池最大连接数(使用负值表示没有限制)
jedis:
pool:
max-active: 200
# 连接池最大阻塞等待时间(使用负值表示没有限制)
# max-wait: -1
# 连接池中的最大空闲连接
max-idle: 10
# 连接池中的最小空闲连接
min-idle: 0
# 连接超时时间(毫秒)
timeout: 10000
通常情况下这样就能使用了
@Controller
public class UserController {
@Resource
private UserService userService;
@Resource
private RedisTemplate redisTemplate;
@RequestMapping("/getUser")
public String getUser(HttpServletRequest request){
HttpSession session = request.getSession();
//去redis中拿数据
Object user1 = redisTemplate.opsForValue().get("user");
List<User> user = null;
//如果返回为NULL代表没有数据,那就去数据库拿,并且存入Redis中
if(user1==null){
System.out.println("捡来了");
user = userService.getUser();
redisTemplate.opsForValue().set("user",user);
session.setAttribute("user",user);
}else{
//如果有,就把从redis中拿到数据绑定到页面上
session.setAttribute("user",user1);
}
return "index";
}
}
文章写到这里,可以运行一下程序跑起来,看看有什么问题
虽然存取是没什么问题,但是这看着让人很难受,让我们翻阅Redis的源码发现RedisTemplate中有这么一段
这是由于默认序列化方式导致的,竟然发现了问题,现在就解决它
新建一个类RedisConfig
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
//使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
Jackson2JsonRedisSerializer<Object> redisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
redisSerializer.setObjectMapper(mapper);
template.setValueSerializer(redisSerializer);
//使用StringRedisSerializer来序列化和反序列化redis的key值
template.setKeySerializer(new StringRedisSerializer());
template.afterPropertiesSet();
return template;
}
}
如上代码所见,我们修改了key和value的序列化规则
然后再去测试就可以是正常的数据了