同步操作将从 王若山/caffeine-plus 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
caffeine这里不做过多说明,想了解的可以直接点击名字链接跳转github查看。
caffeine框架在使用之前需要进行缓存参数配置,但默认的参数配置方案都不是很友好。
不够灵活,多缓存配置文件很长。
spring.cache.cache-names=cacheOne
spring.cache.caffeine.spec=initialCapacity=50,maximumSize=500,expireAfterWrite=10s
spring:
cache:
type: caffeine
cache-names:
- cacheOne
caffeine:
spec: maximumSize=5000,refreshAfterWrite=60s
不够配置化,增删缓存需要硬编码。
@Configuration
public class CacheConfig {
/**
* 创建基于Caffeine的Cache Manager
*
* @return
*/
@Bean
@Primary
public CacheManager caffeineCacheManager() {
SimpleCacheManager cacheManager = new SimpleCacheManager();
ArrayList<CaffeineCache> caches = Lists.newArrayList();
List<CacheObject> list = setCacheObjects();
for(CacheObject cacheObject : list){
caches.add(new CaffeineCache(cacheObject.getKey(),
Caffeine.newBuilder().recordStats()
.expireAfterWrite(cacheObject.getTtl(), TimeUnit.SECONDS)
.maximumSize(cacheObject.getMaximumSize())
.build()));
}
cacheManager.setCaches(caches);
return cacheManager;
}
/**
* 添加缓存对象
*
* @return
*/
private List<CacheObject> setCacheObjects(){
List<CacheObject> list = Lists.newArrayList();
CacheObject userCache = new CacheObject();
userCache.setKey("userCache");
userCache.setTtl(60);
userCache.setMaximumSize(10000);
CacheObject sysCfnCache = new cacheObject();
sysCfnCache.setKey("sysCfnCache");
sysCfnCache.setTtl(60);
sysCfnCache.setMaximumSize(10000);
list.add(userCache);
list.add(deptCache);
return list;
}
@Data
class CacheObject {
private String key;
private long ttl;
private long maximumSize;
}
}
resources/config/cache.yml
cache:
caffeine-plus:
# 需要配置true启用缓存,默认为false
enabled: true
# 全局配置
cacheName: beanCache,beanCache2
spec: maximumSize=500,expireAfterWrite=60s
# 自定义配置,cacheName相同会覆盖全局配置
configs:
- cacheName: sessionCache
spec: maximumSize=200
- cacheName: userCache
spec: maximumSize=200
cacheName 为缓存bean名称
spec 为缓存初始化参数,参数名同caffeine框架参数
Caffeine常用配置说明:
initialCapacity=[integer]: 初始的缓存空间大小
maximumSize=[long]: 缓存的最大条数
maximumWeight=[long]: 缓存的最大权重
expireAfterAccess=[duration]: 最后一次写入或访问后经过固定时间过期
expireAfterWrite=[duration]: 最后一次写入后经过固定时间过期
refreshAfterWrite=[duration]: 创建缓存或者最近一次更新缓存后经过固定的时间间隔,刷新缓存
weakKeys: 打开key的弱引用
weakValues:打开value的弱引用
softValues:打开value的软引用
recordStats:开发统计功能
注意:
expireAfterWrite和expireAfterAccess同时存在时,以expireAfterWrite为准。
maximumSize和maximumWeight不可以同时使用
weakValues和softValues不可以同时使用
cache方面的注解主要有以下5个:
说一下@Cacheable 和 @CachePut的区别:
下边提供常用方法示例,其他方法可参考项目源码。
@SpringBootTest
@RunWith(SpringRunner.class)
@Slf4j
public class CacheTest {
@Autowired
private CacheUtil cacheUtil;
@Autowired
private ConfigSystemInfoService configSystemInfoService;
@Test
public void testExpireCache() {
// 查询数据库
log.info(configSystemInfoServiceImpl.selectByCode("001").getValue());
// 查询缓存, 验证注解缓存生效
log.info(configSystemInfoServiceImpl.selectByCode("001").getValue());
// 主动使用缓存
cacheUtil.putCache("beanCache", "sex", "female");
log.info("{}", cacheUtil.getCacheValue("beanCache", "sex"));
// 主动更新缓存
cacheUtil.putCache("beanCache", "sex", "male");
log.info("{}", cacheUtil.getCacheValue("beanCache", "sex"));
// 睡眠时间大于缓存有效时间
try {
Thread.sleep(8000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 查询数据库,验证缓存失效
log.info(configSystemInfoServiceImpl.selectByCode("001").getValue());
// 缓存超时,查询结果为null
log.info("{}", cacheUtil.getCacheValue("beanCache", "sex"));
// 新增缓存,查询正常
cacheUtil.putCache("beanCache", "sex", "male");
log.info("{}", cacheUtil.getCacheValue("beanCache", "sex"));
}
}
关于caffeine缓存的个人认知
比如beanCache,可以用来存500bean对象,或者200个bean对象+300字符串,可以混用。
不建议混用: 因为此时缓存的性能参数,不能有效作为bean的命中率参考。
session管理的同时,具有caffeine缓存动态更新、高并发等特性。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。