1、引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
2、配置
spring:
cache:
type: redis
redis:
time-to-live: 60000
key-prefix: CACHE_
use-key-prefix: true
cache-null-values: true # 是否缓存空值
3、配置序列化
@EnableConfigurationProperties(CacheProperties.class)
@EnableCaching // 开启缓存
@Configuration
public class MyCacheConfig {
@Bean
RedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties) {
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
config = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()));
config = config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(
new GenericJackson2JsonRedisSerializer()));
// 以下代码保证在 application.yml 里设置的配置生效
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;
}
}
4、使用
// 代表当前方法的结果需要缓存
@Cacheable(value = {"category"}, key = "'level1Categorys'")
@Cacheable(value = {"category"}, key = "#root.method.name") // key 命令为方法名
@Cacheable(value = {"category"}, key = "'getLevel1Categorys'", sync = true) // sync 通过 synchronized 加锁解决缓存击穿问题
// 使缓存失效
@CacheEvict(value = "category", key = "'getLevel1Categorys'")
// 多个操作
@Caching(evict = {
@CacheEvict(value = "category", key = "'getLevel1Categorys'"),
@CacheEvict(value = "category", key = "'getCatalogJson'")
})
// 删除整个分区
@CacheEvict(value = "category", allEntries = true)
// 双写模式
@CachePut