spring cache
基本概念
spring从3.1开始定义了Cache
、CacheManager
接口来统一不同的缓存技术,并使用JCache(JSR-107)
注解来简化开发。
cache
接口的实现包括RedisCache
、EhCahceCache
、ConcurrentMapCache
等。
每次调用需要缓存功能的方法时,spring会检查指定参数的指定的目标方法是否已经被调用过。如果有就直接从缓存中获取方法调用后的结果,如果没有就调用方法并缓存结果后返回给用户,下次调用直接从缓存中获取。
缓存注解的说明
-
@Cacheable
:触发将数据保存到缓存的操作 -
@CacheEvict
:触发将数据从缓存中删除的操作 -
@CachePut
:不影响方法执行更新缓存 -
@Caching
:组合以上多个操作 -
@CacheConfig
:在类级别共享缓存的相同配置
项目整合cache步骤
-
引入
spring-boot-start-cache
和spring-boot-starter-redis
依赖 -
使用
@EnableCaching
注解开启缓存功能 -
编写配置文件
spring.cache.type=redis
# 过期时间。毫秒为单位,设置为1小时
spring.cache.redis.time-to-live=3600000
# key的前缀,如果指定了前缀就用我们指定的前缀,如果没有就默认使用缓存的名字作为前缀
#spring.cache.redis.key-prefix=CACHE_
#是否使用前缀
spring.cache.redis.use-key-prefix=true
# 是否缓存空值。防止缓存穿透
spring.cache.redis.cache-null-values=true
默认使用jdk
进行序列化(可读性差),默认ttl
为-1永不过期,自定义序列化方式需要编写配置类。
使用示例
/**
* 更新本表及关联表,保证冗余字段的数据一致性
* @CacheEvict:失效模式
* 1. 同时进行多种缓存操作:@Caching
* 2. 指定删除某个分区下的所有数据:@CacheEvict(value = "category",allEntries = true)
* 3. 存储同一个类型的数据,都可以指定成同一个分区。分区名默认就是缓存的前缀。
*/
// @Caching(evict = {
// @CacheEvict(value = "category",key = "'getLevel1Categorys'"),
// @CacheEvict(value = "category",key = "'getCatalogJson'")
// })