Spring缓存注解的使用@Cacheable、@CachePut、@CacheEvict、
Spring Cache缓存注解,起到数据缓存的作用,在缓存的基本使用中简化了步骤,在调用方法的时候,将参数和返回结果作为键值对存放在缓存中,下次再次请求的时候,如果缓存中存在就直接获取结果,不用再次请求数据库,增大数据库的压力。(刚接触感觉跟redis没啥区别,使用中也确实没感觉出来啥区别)
使用范围:controller,service,dao中的方法上面都可以添加注解(其他类上我没试过),也确实生效了,如果失效去百度吧很多人出一样问题
redis的搭配使用
让cache中的数据放入redis中,从redis中拿取数据,搭配使用:
1.springboot的启动类中开启缓存,@EnableCaching
2.配置redis
spring.redis.database=0
spring.redis.host=xxx.sss.www
spring.redis.port=6379
spring.redis.password=xxxxxxxx
spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.max-wait=-1ms
spring.redis.lettuce.pool.max-idle=5
spring.redis.lettuce.pool.min-idle=0
spring.redis.lettuce.shutdown-timeout=10000
3.redis配置类的生成
redis配置类
@Configuration
public class RedisConfig extends CachingConfigurationSelector {
/**
* @Description RedisTemplate配置类
* 默认使用jdk自带的序列化,存值会出现/0Xab/0xac/00 乱码前缀
* 修改序列化器,使用阿里的FastJson2JsonRedisSerializer
* @param connectionFactory
* @return
*/
@Bean(name = {"redisTemplate"})
public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory connectionFactory) {
RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(connectionFactory);
Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
serializer.setObjectMapper(mapper);
//value对象的序列化显示
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(serializer);
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(serializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
@Bean
public RedisCacheManager redisCacheManager(RedisTemplate redisTemplate) {
RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisTemplate.getConnectionFactory());
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer()));
return new RedisCacheManager(redisCacheWriter, redisCacheConfiguration);
}
}
@Cacheable注解
添加了该注解的方法在没有查到缓存的情况下,将参数和返回结果作为key-value存储到缓存中,下次相同请求缓存中存在则直接使用缓存,不走数据库的查询;
参数:(我在这里展示家中常备的参数,其他自己寻找也不难的)
参数名 | 作用 |
---|---|
value | 存储在哪个cache缓存中,需要命名区分 |
key | 存储的key,通常以参数为准 |
condition | 缓存条件,即触发缓存需要什么条件,比如age>20的才进行缓存记录 |
这里key通常引用参数列表是有两种,需要加#引用,一种直接取变量,一种是拿实体类中的某个变量进行处理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UAIK0hzz-1622509750022)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210520172547762.png)]
@CachePut注解
执行的方法不会去检查缓存中是否存在,而是每次执行方法的时候都去将结果存放进缓存中,参数和@Cacheable中的一样
@CacheEvict注解
执行的方法会去删除相应的缓存,参数新出现的两个属性allEntries和beforeInvocation。
allEntries 代表相应cache下的所有缓存删除
t注解
执行的方法会去删除相应的缓存,参数新出现的两个属性allEntries和beforeInvocation。
allEntries 代表相应cache下的所有缓存删除
beforeInvocation,代表在方法执行成功前执行,改为true即使方法异常未成功执行,缓存也执行了删除