Spring缓存注解的使用@Cacheable、@CacheEvict、@CachePut

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即使方法异常未成功执行,缓存也执行了删除

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值