问答详情
源自:1-1 课程介绍

关于guava cache的

如果运营人员吧优惠券模版一个在数据库中设置为失效了,那么他在缓存中也是设置一下失效,这时候缓存只是去除了一个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)}
}


提问者:林贺龙 2024-07-10 14:33

个回答

  • 林贺龙
    2024-07-10 14:38:10

    张老师:.expireAfterWrite(600, TimeUnit.SECONDS)

    这个意思是不是无论多少太机器部署,到了600秒后都会去数据库里面重新查询啊?所有的机器的jvm必须在600秒后才能保持和数据库一致啊?