缓存: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 ListgetLevel1Categorys() { 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
这个就是说,是否缓存空值。