SpringBoot整合Redis使用@Cacheable、@CachePut和@CacheEvict注解方式

一,缓存注解

@Cacheable、@CachePut和@CacheEvict 这些都是org.springframework.cache.annotation包下的缓存注解。

1,@Cacheable

@Cacheable根据方法对其返回结果进行缓存,下次请求时,如果缓存存在,则直接读取缓存数据返回;如果缓存不存在,则执行方法,并把返回的结果存入缓存中。一般用在查询方法上。

注解属性:

SpringBoot整合Redis使用@Cacheable、@CachePut和@CacheEvict注解方式_第1张图片

常用属性:

value

缓存名,必填,它指定了你的缓存存放在哪块命名空间

cacheNames

与 value 差不多,二选一即可

key

可选属性,可以使用 SpEL 标签自定义缓存的key

2,@CachePut

@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。其他方法可以直接从响应的缓存中读取缓存数据,而不需要再去查询数据库。一般用在新增方法上。

常用属性:

value

缓存名,必填,它指定了你的缓存存放在哪块命名空间

cacheNames

与 value 差不多,二选一即可

key

可选属性,可以使用 SpEL 标签自定义缓存的key

3,@CacheEvict 

@CacheEvict是用来标注在需要清除缓存元素的方法或类上的。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作,使用该注解标志的方法,会清空指定的缓存。一般用在更新或者删除方法上,如果方法因为抛出异常而未能成功返回时也不会触发清除操作。

常用属性:

value

缓存名,必填,它指定了你的缓存存放在哪块命名空间

cacheNames

与 value 差不多,二选一即可

key

可选属性,可以使用 SpEL 标签自定义缓存的key

allEntries

是否清空所有缓存,默认为 false。如果指定为 true,则方法调用后将立即清空所有的缓存

beforeInvocation

是否在方法执行前就清空,默认为 false。如果指定为 true,则在方法执行前就会清空缓存

 

 二,redis和缓存注解

还有下载安装好redis服务器。

1,导入依赖

       
        
            org.springframework.boot
            spring-boot-starter-data-redis
        

        
        
            org.apache.commons
            commons-pool2
            2.6.0
        

2,配置redis服务器基本信息application.properties

spring.redis.host=192.168.10.155 #redis 地址
spring.redis.port=6379
spring.redis.database= 0
spring.redis.timeout=1800000

spring.redis.lettuce.pool.max-active=20
spring.redis.lettuce.pool.max-wait=-1
#最大阻塞等待时间(负数表示没限制)
spring.redis.lettuce.pool.max-idle=5
spring.redis.lettuce.pool.min-idle=0

3,启动类或者配置类上使用  @EnableCaching ,开启缓存

SpringBoot整合Redis使用@Cacheable、@CachePut和@CacheEvict注解方式_第2张图片

4,测试

@Service
public class OrdersServiceImpl extends ServiceImpl implements OrdersService {
    @Override
    @Cacheable(value="orders",key="'list'")//模式键名: orders::list
    public List getList() {
        List orders = baseMapper.selectList(null);
        return orders;
    }
}

Controller中访问路径: 

 Idea控制台查询:

SpringBoot整合Redis使用@Cacheable、@CachePut和@CacheEvict注解方式_第3张图片

 执行多次,也仅仅只有上面一条sql语句打印。

 

redis中:

 SpringBoot整合Redis使用@Cacheable、@CachePut和@CacheEvict注解方式_第4张图片

 

如果想让显示为“不乱码”的json格式,这时候需要配置

@Configuration
public class RedisConfig extends CachingConfigurerSupport {

    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate template = new RedisTemplate<>();
        RedisSerializer redisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        template.setConnectionFactory(factory);
        //key序列化方式
        template.setKeySerializer(redisSerializer);
        //value序列化
        template.setValueSerializer(jackson2JsonRedisSerializer);
        //value hashmap序列化
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        return template;
    }

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        RedisSerializer redisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        //解决查询缓存转换异常的问题
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        // 配置序列化(解决乱码的问题),过期时间600秒
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofSeconds(600))
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
                .disableCachingNullValues();
        RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
                .cacheDefaults(config)
                .build();
        return cacheManager;
    }
}

测试:

SpringBoot整合Redis使用@Cacheable、@CachePut和@CacheEvict注解方式_第5张图片

 测试@CacheEvict注解

    @CacheEvict(value="orders",key="'list'",beforeInvocation = true)//模式键名: orders::list
    public List getList() {
        List orders = baseMapper.selectList(null);
        return orders;
    }

 @CacheEvict,清空redis缓存数据,每次都会执行sql

    @Override
    @CachePut(value="orders",key="'list'")//模式键名: orders::list
    public Orders add(Orders orders) {
        int i = baseMapper.insert(orders);
        return orders;
    }

之前存储的是list集合,但是执行保存方法后,变为存储对象了。

@Override
@CachePut(value="orders",key="'list'")//模式键名: orders::list
public int add(Orders orders) {
    int i = baseMapper.insert(orders);
    return i;
}

这些注解只是将返回的结果缓存到redis中,无论结果是对象还是整数,但是返回结果觉得不能为空null,否则会报错!

 

 

5,说明

5-1,错误:

cannot be found on object of type 'org.springframework.cache.interceptor.CacheExpressionRootObject' - maybe not public or not valid?
缺少单引号

SpringBoot整合Redis使用@Cacheable、@CachePut和@CacheEvict注解方式_第6张图片

 5-2:,依赖spring-boot-starter-data-redis

spring缓存默认CacheManager创建的Cache缓存,但引入redis的starter后,CacheManager就变成了RedisCacheManger,而CacheManager就不生效了。改由RedisCacheManger操作RedisTemplate

RedisTemplate是默认使用jdk的序列化机制的。


不适用注解方式(使用RedisTemplate ):https://blog.csdn.net/qq_45315910/article/details/95093845

 

你可能感兴趣的:(Springboot,redis)