第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

聊聊緩存布爾值踩到的坑

標(biāo)簽:
Java

前言

有这么一个业务场景:部门A服务要使用部门B服务的业务数据,部门A服务使用部门B服务的业务数据前置条件是B部门必须要给A授权。B部门的授权和业务数据分属为不同服务。其请求流程如下


因为A的鉴权信息的请求值是固定的,因此鉴权结果大概率也是固定值。当时B部门的业务服务开发同事,为了提高效率。就加了缓存,即B的业务服务会将A的鉴权结果缓存起来。当时写法形如下

 private final LoadingCache<String,Boolean> checkSvcCache = Caffeine
            .newBuilder().maximumSize(Constants.MAX_SIZE)
            .expireAfterWrite(Conastants.EXPIRE, TimeUnit.DAYS)
            .build(key -> loadCache(key));

    @Nullable
    private Boolean loadCache(@NonNull String key) {
        if(key.contains(Constant.UNDER_LINE)){
            try {
                String[] arr = key.split(Constant.UNDER_LINE);
                Integer ak = Integer.parseInt(arr[0]);
                String sk = arr[1];
                RPCResult<Boolean> result = authService.checkSvc(ak, sk);
                if(result.getSuccess()){
                    Boolean data = result.getData();
                    return data;
                }
                return false;
            } catch (Exception e) {
                log.error("{}",e);
            }
        }
        return false;
    }

思考

大家看下上述代码块的写法有没有问题?

粗看貌似没啥问题,但实际是有点小问题的。当进行远程调用时,如果出现异常,此时布尔值会返回false。这样就可能把正确的结果给掩盖了,比如明明都按约定的 ak,sk传值了,结果返回鉴权失败。

修复

那要如何修复?扯一点哲学东西,这个世界不是非黑即白,其实可能还存在灰色地带。布尔值在java的世界中,也不是就只有true或者false,当布尔值为包装类时,他还有一种状态是null。因此可以修改为

@Nullable
    private Boolean loadCache(@NonNull String key) {
        if(key.contains(Constant.UNDER_LINE)){
            try {
                String[] arr = key.split(Constant.UNDER_LINE);
                Integer ak = Integer.parseInt(arr[0]);
                String sk = arr[1];
                RPCResult<Boolean> result = authService.checkSvc(ak, sk);
                if(result.getSuccess()){
                    Boolean data = result.getData();
                    return data;
                }
                return false;
            } catch (Exception e) {
                log.error("{}",e);
            }
        }
        return null;
    }

但这样改就没问题了吗,其实还是有问题,因为null值也不是正确结果。但我们可以利用null来额外做一些异常兜底。比如出现null时,就是有问题了,我们可以对A进行友好的提示,而非返回鉴权失败,也便于提前暴露问题,而下次请求进来时,缓存会因为值为null,再次触发远程调用

总结

异常流程思考很重要。。。

點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消