缓存流程
主启动类启动,CacheAutoConfiguration生效,导入相应组件 @Import({CacheConfigurationImportSelector}),顺序导入 RedisCacheConfiguration,SimpleCacheConfiguration ····
RedisCacheConfiguration生效,SimpleCacheConfiguration失效(基于内存的缓存管理),RedisCacheConfiguration创建RedisCacheManager 进行缓存管理,在程序启动时,会自动配置 spring.redis.host=localhost连接本机redis数据库,在RedisProperties中配置
自定义RedisCacheManager
将数据库查询结果以json格式序列化到redis中,并能够反序列化为json
```java @Configuration public class MyRedisConfig {
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory){
RedisSerializer<String> strSerializer = new StringRedisSerializer();
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()
.entryTtl(Duration.ofDays(1))
.serializeKeysWith(RedisSerializationContext.SerializationPair
.fromSerializer(strSerializer))
.serializeValuesWith(RedisSerializationContext.SerializationPair
.fromSerializer(jacksonSeial))
.disableCachingNullValues();
RedisCacheManager cacheManager = RedisCacheManager.builder(connectionFactory)
.cacheDefaults(config).build();
return cacheManager;
}} ```
缓存注解
```java @Service public class EmployeeService {
@Autowired
EmployeeMapper employeeMapper;
@Cacheable(cacheNames = {"emp"},condition = "#emp!=null")
public Employee getEmp(Integer id){
Employee emp = employeeMapper.getEmpById(id);
System.out.println("员工------------->"+id);
return emp;
}} ```
```markdown
@EnableCaching
- 开启基于注解的缓存@Cacheable
- 该注解标注的方法执行之前会先检查缓存中有没有这个数据,默认按照参数的值作为key去查询缓存,key默认使用keyGenerator生成
- cacheNames:缓存块的名字,默认作为key的前缀,如emp::1
- condition:在调用方法之前之后都能判断,若指定的条件成立,则缓存
- unless:在调用方法之后判断,若指定条件成立,则不缓存```
版权声明:本文为weixin_45519907原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。