缓存:SpringCache,@Cacheable细节


  /**
     * @Cacheable: 代表当前方法的结果需要缓存 并指定缓存名字 【缓存名字最好分区加以区分】
     * 如果缓存中有,不用调用方法,如果没有,调用方法,把方法中的结果放入缓存。
     *
     *  缓存的 key值 是默认自动生成的
     *  缓存的 value值 默认使用jdk序列化机制,将序列化后的数据进行存储
     *  默认ttl时间 -1
     *
     *  自定义:
     *      1.指定生成缓存使用的; key属性指定,接收一个SpEL表达式,具体内容看注释,也可直接指定。
     *      2.指定缓存数据存活时间    [配置文件中修改]  spring.cache.redis.time-to-live=1000 意思就是存活一秒。
     *      3.将数据保存为json格式
     *
     *  sync = true: --- 开启同步锁
     *
     */
    @Cacheable(value = {"category"}, key = "#root.method.name", sync = true)
    @Override
    public List getLevel1Categorys() {
        return baseMapper.selectList(new QueryWrapper().eq("cat_level", 1));
        // 测试能否缓存null值
//        return null;
    }

package com.atguigu.gulimall.product.config;

import org.springframework.boot.autoconfigure.cache.CacheProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;


@EnableConfigurationProperties(CacheProperties.class)
@EnableCaching
@Configuration
public class MyCacheConfig {



    /**
     * 这里配置了之后,配置文件中 TTL设置没用上,原因是什么呢?
     *
     * 原来和配置文件绑定的配置类是这样子的:
     * @ConfigurationProperties(prefix = "spring.cache")
     * public class CacheProperties
     *
     * 现在要让这个配置文件生效    : @EnableConfigurationProperties(CacheProperties.class)
     *
     */
    @Bean
    RedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties){

        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();

        // 设置kv的序列化机制
        config = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()));
        config = config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
        
        CacheProperties.Redis redisproperties = cacheProperties.getRedis();

        // 设置配置
        if(redisproperties.getTimeToLive() != null){
            config = config.entryTtl(redisproperties.getTimeToLive());
        }
        if(redisproperties.getKeyPrefix() != null){
            config = config.prefixKeysWith(redisproperties.getKeyPrefix());
        }
        if(!redisproperties.isCacheNullValues()){
            config = config.disableCachingNullValues();
        }
        if(!redisproperties.isUseKeyPrefix()){
            config = config.disableKeyPrefix();
        }
        return config;
    }

}

其他配置:

spring.cache.redis.key-prefix=CACHE_
spring.cache.redis.use-key-prefix=true

上面一个是说配置缓存的key的前缀,如果指定就用指定的,没指定就用缓存的名字作为前缀。缓存的名字,就是cachable注解里面的value指定的值

下面的是 说,使用key的前缀,默认是true。也可以更改成false,不使用前缀。

spring.cache.redis.cache-null-values=true
这个就是说,是否缓存空值。