Spring Boot Cache 笔记
2022-12-29 10:57:02 2 举报
AI智能生成
SpringBoot Cache 笔记
作者其他创作
大纲/内容
参考
Spring.io
Caching Data with Spring
Spring boot features Caching
Spring Integration Cache Abstraction
Others
Spring Caching
Spring Boot With Caffeine Cache
Spring Cache 抽象接口
org.springframework.cache.Cache
org.springframework.cache.CacheManager
org.springframework.boot.autoconfigure.cache.CacheManagerCustomizer
Dependency
org.springframework.boot:spring-boot-starter-cache
Caching Library
JSR-107 (JCache)
JSR-107 (JCache)
Configuration
CacheManager
Spring Boot 会自动配置一个CacheManager Bean
CacheManagerCustomizer
声明这个类的bean,可以在Spring Boot 初始化 CacheManager 之前进行调整。
Bean
a bean of type CacheManager
a CacheResolver named cacheResolver
Cache properties
spring
cache
type
By default, auto-detected according to the environment.
强制使用指定类型的cache provider
比如测试环境,通过设置为“none”,禁用cache
cache-names
jcache
# Only necessary if more than one provider is present
provider
com.acme.MyCachingProvider
config
classpath:acme.xml
ehcache
config
classpath:config/another-config.xml
infinispan
config
infinispan.xml
redis
cache-null-values
true
default
key-prefix
time-to-live
600_000
use-key-prefix
true
default
caffeine
参考
Caffeine Cache 进程缓存之王
spec
例如
maximumSize=500,expireAfterAccess=600s
将缓存的最大大小定义为500,并且生存时间为 10分钟。
参数
initialCapacity=[integer]
初始缓存长度
maximumSize=[long]
驱逐策略
最大缓存长度
当缓存超出这个容量的时候,会使用Window TinyLfu策略来删除缓存。
maximumWeight=[long]
驱逐策略
最大缓存权重
expireAfterAccess=[duration]
失效策略
最后一次写入或访问后经过固定时间过期
expireAfterWrite=[duration]
失效策略
最后一次写入后经过固定时间过期
refreshAfterWrite=[duration]
刷新策略
创建缓存或者最近一次更新缓存后经过固定的时间间隔,刷新缓存
必须实现 LoadingCache,否则报错 java.lang.IllegalStateException: refreshAfterWrite requires a LoadingCache
跟 expire 的区别是,指定时间过后 expire 是 remove 该 key,下次访问是同步去获取返回新值,而 refresh 则是指定时间后,不会 remove 该 key,下次访问会触发刷新,新值没有回来时返回旧值。
weakKeys
打开key的弱引用
weakValues
打开value的弱引用
softValues
打开value的软引用
recordStats
开发统计功能
caffeine是不缓存null值的
如果在load的时候返回null,caffeine将会把对应的key从缓存中删除
同时,loadAll返回的map里是不可以包含value为null的数据,否则将会报NullPointerException
过期策略
无界缓存
有界缓存
expireAfterWrite
expireAfterAccess
expireAfter
在expireAfter中需要自己实现Expiry接口,这个接口支持create,update,以及access了之后多久过期。
注意这个API和前面两个API是互斥的。
这里和前面两个API不同的是,需要你告诉缓存框架,他应该在具体的某个时间过期,也就是通过前面的重写create,update,以及access的方法,获取具体的过期时间。
更新策略
指在设定多长时间后会自动刷新缓存。
refreshAfterWrite
注意
expireAfterWrite 和 expireAfterAccess 同时存在时,以 expireAfterWrite 为准。
maximumSize 和 maximumWeight 不可以同时使用
weakValues 和 softValues 不可以同时使用
缓存配置级别
全局配置
可用于CacheManager,KeyGenerator。
Class-level 配置
使用@CacheConfig。
Operation-level 配置
使用注解的属性
Annotations
Spring Boot
@EnableCaching
启用缓存注解
Spring
@Cacheable
触发缓存填充。
properties
value
cacheNames 别名
value是必需的,它指定了你的缓存存放在哪块命名空间。
cacheNames
缓存名称。可以维护多个,用“,”分割。
key
缓存key的后缀。
支持SpEL表达式
如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合。
keyGenerator
表示指定key的生成器
与key互斥
cacheManager
表示指定缓存管理器,包含了缓存策略等相关配置
cacheResolver
与cacheManager互斥
sync
同步缓存
默认是false
当这个属性为true的时候,unless属性是不能使用的。
condition
条件缓存
如果true,则缓存该方法。
如果false,则其行为就好像该方法未被缓存。
指定复合条件的情况下才缓存。
可以通过SpEL表达式进行设置
unless
阻止缓存
当这个条件为true的时候,方法的返回值就不会被缓存。
unless表达式在调用方法后进行计算
注意
此类条件不应依赖于结果对象(即#result变量),因为这些条件需预先验证以确认排除。
@CachePut
更新缓存而不会干扰方法执行。
注意
此条件不应依赖于结果对象(即#result变量),因为这些条件已预先验证以确认排除
@CacheEvict
触发缓存逐出。
properties
allEntries
驱逐缓存中的所有条目
缺省为 false
缺省情况下,如果方法执行抛出异常,则不会清空缓存
如果指定为 true,则在方法还没有执行的时候就清空缓存
beforeInvocation
是否在方法执行前就清空
缺省为 false
缺省情况下,如果方法执行抛出异常,则不会清空缓存
如果指定为 true,则在方法还没有执行的时候就清空缓存
注意
void方法可以与@CacheEvict- 一起使用,因为方法充当触发器,返回值将被忽略(因为它们不与缓存交互)。
@Caching
重新组合要在方法上应用的多个缓存操作。
@CacheConfig
是一个类级别的注释,并有助于简化缓存配置
在 class-level 共享一些通用的 cache-related 配置
cacheNames
注意
Spring Cache 使用基于动态生成子类的代理机制来对方法的调用进行切面,如果缓存的方法是内部调用而不是外部引用,会导致代理失败,切面失效。
JCache
(JSR-107)
(JSR-107)
@CacheResult
@CachePut
@CacheRemove
@CacheRemoveAll
@CacheDefaults
@CacheKey
@CacheValue
Spring vs JSR-107 Annotations
Cache Providers
Generic
通用缓存
Configuration Beans
org.springframework.cache.Cache
JCache(JSR-107)
EhCache 3, Hazelcast, Infinispan, and others
Bean
org.springframework.cache.jcache.JCacheCacheManager
EhCache 2.x
Config path
classpath: ehcache.xml
默认
spring.cache.ehcache.config=classpath:config/another-config.xml
自定义指定路径
Ehcache 3.x 完全符合 JSR-107 标准,不需要专门的支持。
Bean
org.springframework.cache.ehcache.EhCacheCacheManager
org.springframework.cache.ehcache.EhCacheManagerFactoryBean
Hazelcast
If a HazelcastInstance has been auto-configured, it is automatically wrapped in a CacheManager.
Infinispan
infinispan-spring-boot
Couchbase
Redis
Bean
RedisCacheManager
RedisCacheConfiguration
修改默认配置
RedisCacheManagerBuilderCustomizer
更多的自定义配置
Caffeine
Caffeine 是针对 Guava 缓存的 Java 8 rewrite
取代了对Guava的支持
Dependency
com.github.ben-manes.caffeine:Caffeine
Bean
org.springframework.cache.caffeine.CaffeineCacheManager
com.github.benmanes.caffeine.cache.CacheLoader
由于是全局配置,因此需要使用泛型,自动配置将忽略任何其他通用类型。
缓存创建顺序
spring.cache.caffeine.spec
Bean
com.github.benmanes.caffeine.cache.CaffeineSpec
Bean
com.github.benmanes.caffeine.cache.Caffeine
Simple
默认
Bean
org.springframework.cache.support.SimpleCacheManager
基于ConcurrentHashMap实现的
None
禁用缓存
0 条评论
下一页