Spring Cache + Caffeine实现本地缓存
Caffeine简介
Caffeine是一个高性能,高命中率,低内存占用,near optimal 的本地缓存,简单来说它是 Guava Cache 的优化加强版
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
</dependency>
开启缓存
@EnableCaching
注解开启使用缓存管理功能
注入
方式一
-
新建一个枚举类
public enum Caches {
CACHE_ACCESS_TOKEN(10, 7200);
/** 最大数量 */
private Integer maxSize;
/** 过期时间 秒 */
private Integer ttl;
Caches() {
}
Caches(Integer maxSize, Integer ttl) {
this.maxSize = maxSize;
this.ttl = ttl;
}
public Integer getMaxSize() {
return maxSize;
}
public Integer getTtl() {
return ttl;
}
}
-
注入到IOC容器
/**
* 本地缓存
* @return
*/
方式二
使用
可以使用spring提供的@Cacheable、@CachePut、@CacheEvict等注解来方便的使用caffeine缓存
问题
使用@Cacheable
缓存不起作用
失效场景
-
在私有方法上加缓存
-
类内部方法调用加缓存
失效原因
Spring cache
的实现原理是基于AOP
的动态代理实现的:即都在方法调用前后去获取方法的名称、参数、返回值,然后根据方法名称、参数生成缓存的key(自定义的key例外),进行缓存。
AOP
不支持对private
私有方法的拦截,所以也就不支持私有方法上的Spring Cache
注解。
this
调用不是代理对象的调用, 所以AOP
失效,注解失效。
解决办法
-
方法用
public
限定符修饰; -
类内部方法调用加缓存时可以用
SpringContextUtil
获取当前Bean
,由它来调用
工具类
SpringContextUtil
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库