林贺龙
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 新特性解读
10400 学习 · 18 问题
相似问题