林贺龙
2024-07-10 14:33
如果运营人员吧优惠券模版一个在数据库中设置为失效了,那么他在缓存中也是设置一下失效,这时候缓存只是去除了一个jvm上的缓存吧,如果是多台部署的情况,其他的机器jvm依然没有失效啊,这就数据不一致了
代码如下:CouponTemplateCacheHelper.java
com.imooc.engineering.project.coupon.cachecom.google.common.cache.LoadingCachecom.google.common.cache.CacheBuildercom.google.common.cache.CacheLoadercom.imooc.engineering.project.coupon.entity.CouponTemplatelombok.RequiredArgsConstructorlombok.extern.slf4j.Slf4jorg.springframework.stereotype.Servicejava.util.Listjava.util.Mapjava.util.Optionaljava.util.concurrent.ExecutionExceptionjava.util.concurrent.TimeUnit@Slf4j @Service @RequiredArgsConstructor CouponTemplateCacheHelper { LoadingCache<LongOptional<CouponTemplate>> couponTemplateLoadingCache = CacheBuilder.newBuilder() .initialCapacity() .maximumSize() .concurrencyLevel(Runtime.getRuntime().availableProcessors()) .expireAfterWrite(TimeUnit.SECONDS) .build(CacheLoader<>() { @Override Optional<CouponTemplate> load(Long templateId) Exception { Optional.of(CouponTemplate())} })CouponTemplate getCouponTemplateByTemplateId(Long templateId) { { couponTemplateLoadingCache.get(templateId).orElse()} (ExecutionException ex) { log.error()} } Map<LongOptional<CouponTemplate>> getCouponTemplateByTemplateIds( List<Long> templateIds) { { couponTemplateLoadingCache.getAll(templateIds)} (ExecutionException ex) { log.error()} } putCouponTemplateToCache(CouponTemplate template) { couponTemplateLoadingCache.put(template.getTemplateId()Optional.of(template))} putCouponTemplateToCache(Map<LongOptional<CouponTemplate>> templateMap) { couponTemplateLoadingCache.putAll(templateMap)} cleanCouponTemplateCouponByTemplateId(Long templateId) { couponTemplateLoadingCache.invalidate(templateId)} }
张老师:.expireAfterWrite(600, TimeUnit.SECONDS)
这个意思是不是无论多少太机器部署,到了600秒后都会去数据库里面重新查询啊?所有的机器的jvm必须在600秒后才能保持和数据库一致啊?
JDK11&12 新特性解读
10349 学习 · 18 问题
相似问题