我是靠谱客的博主 标致樱桃,最近开发中收集的这篇文章主要介绍springboot使用caffeine cache是出现暗坑,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

基于springboot版本2.0.x

使用caffeine作为本地应用缓冲时,碰见一个暗坑,caffeine做了10分钟缓冲失效配置(expireAfterWrite(10))

下面是具体数据表查询缓存代码

@Cacheable(cacheNames = MerchantCacheConfig.CACHE_NAME, key = "#merId")
public MerchantDTO selectByMerId(String merId) {
        return this.selectByMerIdDB(merId);
    }

正常有merId商户数据情况下通过商户编号(merId)查询都没什么问题,突然有一天新增一家商户时怎么都查找不到商户的信息,看日志中出现下面错误

java.util.concurrent.CompletionException: java.lang.ClassCastException: org.springframework.cache.support.NullValue cannot be cast to net.easipay.fg.masterdata.dto.PsMerchantSecurityConfigDTO at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:273) at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:280) at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1592) at java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1582) at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289) at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056) at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692) at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157) Caused by: java.lang.ClassCastException: org.springframework.cache.support.NullValue cannot be cast to net.easipay.fg.masterdata.dto.PsMerchantSecurityConfigDTO at net.easipay.fg.masterdata.manager.config.cache.PsMerchantSecurityCacheConfig$1.reload(PsMerchantSecurityCacheConfig.java:80) at com.github.benmanes.caffeine.cache.CacheLoader.lambda$asyncReload$2(CacheLoader.java:191) at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1590) ... 5 common frames omitted

经过排查和场景判断,可能缓存上面出现了超出认识上的问题,排查中发现正常流程是应该配置商户信息后开始该商户业务流程,但商户信息记录未正常配置后,通过该商户编号(merId)进行了查询,此时数据表中是查询不到记录的,也就是null,Cacheable将null缓存了,后续补充了商户记录后,本以为商户数据会10分钟后失效再重新缓冲时,就出现了上面的异常信息,缓存中同一个merId之前已经是null,后续对象无法更新缓存。

解决方式:

@Cacheable(cacheNames = MerchantCacheConfig.CACHE_NAME, key = "#merId" , unless="#result == null")
public MerchantDTO selectByMerId(String merId) {
        return this.selectByMerIdDB(merId);
    }

标签中增加unless,排查查询结果null的数据

最后

以上就是标致樱桃为你收集整理的springboot使用caffeine cache是出现暗坑的全部内容,希望文章能够帮你解决springboot使用caffeine cache是出现暗坑所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部