赞
踩
首先导入redis相关jar,我这里使用的是gradle构建.
implementation("org.springframework.boot:spring-boot-starter-data-redis")
maven请使用:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
启动本地redis
直接在yml中配置host即可,其他默认
spring:
redis:
host: 127.0.0.1
实体类实例化Serializable接口,并进行缓存测试
public class Employee implements Serializable
首次请求
清空控制台并再次请求
没有输出任何信息,接下来通过redis可视化查看缓存
此时缓存已经存到了redis中,但是经过转码,可视化效果并不好,那是因为redis默认使用的是 JdkSerializationRedisSerializer 进行的序列化.
接下来看源码,为什么会导入redis的jar就会默认使用redis进行作为缓存及redis默认使用的序列化方式和自定义Redis序列化
断点 -> 详细跳转步骤
由上篇文章(SpringBoot默认缓存使用和源码剖析)可知缓存配置的加载顺序是
进入org.springframework.boot.autoconfigure.cache.RedisCacheConfiguration
根据类上注解判断该类可以执行,并在IoC中创建了CacheManager
继续向下翻看,可以看出默认使用的是jdk序列化
因为执行顺序,接下来看SpringBoot默认的缓存SimpleCache,此时不成立,所以该类不能被执行
自定义Redis序列化
@Configuration
public class RedisConfig {
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
// 分别创建String和JSON格式序列化对象,对缓存数据key和value进行转换
//key
RedisSerializer<String> strSerializer = new StringRedisSerializer();
//value
Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);
// 解决查询缓存转换异常问题
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jacksonSeial.setObjectMapper(om);
// 定制缓存数据序列化方式及时效
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
//设置缓存数据的有效期为 1 天
.entryTtl(Duration.ofDays(1))
//key的序列化方式为String
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(strSerializer))
//value的序列化方式为JSON
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jacksonSeial))
.disableCachingNullValues();
return RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(config).build();
}
}
清空redis缓存.再次启动并测试查看
end
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。