概述
本文针对实际业务开发过程中遇到的 热点数据缓存 问题,引入了 caffeine 中的 LoadingCache 对象,并分析了具体的使用场景,最后将使用的完整过程中的关键代码罗列出来,具体内容如下
- caffeine 说明和 maven 依赖
- 使用场景分析
- 缓存对象的初始化
- 缓存数据的加载
- 缓存的使用
caffeine 说明和 maven 依赖
- caffeine 提供了基于 内存 的缓存机制,没有持久化到磁盘的功能,意味着一旦应用关闭或者重启,内存中的缓冲对象需要全部重新加载
- maven 依赖如下:
1 | <dependency> |
使用场景分析
- 数据存在数据库中,在短期内会大量访问,比如 10qps,减少对数据库的查询,提高响应速度,提高用户体验
- 数据不会频繁变化,修改后期望 1 s 后缓存中的数据失效
- 可以限制数据库的访问频率,比如最大每秒一次(只要缓存不失效就不会访问数据库)
- 需要缓存的数据量不能太大
缓存对象的初始化
通过 @PostConstruct
修饰的方法来初始化缓存对象
- SwitchCache
- 通过
@PostConstruct
修饰的方法来初始化缓存对象 - 通过
expireAfterWrite(1, TimeUnit.SECONDS)
设置缓存写入后 1s 后失效,相当于限制了最多每秒访问一次数据库
1 | package com.ckjava.kqc.kone.cache; |
通过 @Configuration
创建 bean 初始化 LoadingCache 对象
或者配置到 Configuration 中,如下
- CacheConfig: 缓冲对象初始化
1 | import java.util.concurrent.TimeUnit; |
- SwitchCacheCom:缓冲方法封装
1 | import com.google.common.cache.LoadingCache; |
缓存数据的加载
- SwitchLoader:用于在缓存中的数据失效后,再从数据库中获取,并自动存储到缓存中
1 | package com.ckjava.kqc.kone.cache; |
缓存的使用
- SwitchController:通过接口请求的时候直接使用缓存对象
1 | import com.ckjava.kqc.kone.annotation.KoneResponseResult; |