使用Guava中Cache的注意点

案例1:
 PriceSourceSwitchHandler priceSourceSwitchHandler = new PriceSourceSwitchHandler();
        Cache<String, String> linkStatusMap = CacheBuilder.newBuilder()
                .expireAfterWrite(10, TimeUnit.SECONDS)
                .removalListener(priceSourceSwitchHandler::resetLinkStatus)
                .build();
        linkStatusMap.put("1","1");
        TimeUnit.SECONDS.sleep(12);
        //linkStatusMap.cleanUp();
        linkStatusMap.getIfPresent("1");
        
案例2:
 LoadingCache<String, String> linkStatusMap = CacheBuilder.newBuilder()
                // .expireAfterAccess(10, TimeUnit.SECONDS)
                .expireAfterWrite(10, TimeUnit.SECONDS)
                .refreshAfterWrite(5, TimeUnit.SECONDS)
                .removalListener(priceSourceSwitchHandler::resetLinkStatus)
                .build(new CacheLoader<String, String>() {
                    @Override
                    public String load(String s) throws Exception {
                        return "def";
                    }
                    
                    @Override
                    public ListenableFuture<String> reload(String key, String oldValue) throws Exception {
                        return super.reload(key, oldValue);
                    }
                });
        linkStatusMap.put("1","1");
        TimeUnit.SECONDS.sleep(12);
        //linkStatusMap.cleanUp();
        linkStatusMap.get("1");
    
注意点:
    1.案例1中直接调用build()后得到的Cache接口,数据过期后在调用linkStatusMap.getIfPresent("1")发现removalListener不生效,但是数据确实删除了,缓存没了
    2.案例2中直接调用build()后得到的Cache接口,数据过期后在调用linkStatusMap.get("1")发现可以触发removalListener
    3.案例2中expireAfterAccess方法是在设置的时间内没有get、put相关操作,就会过期,但是数据还未删除,只有访问了(get、put)该数据才会真正删除该数据
    4.案例2中expireAfterWrite方法是在设置的时间内没有put相关操作,就会过期,但是数据还未删除,只有访问了(get、put)该数据才会真正删除该数据,其中put会把当前segment下的所有数据删除,可参考:guava的loadingcache什么时候删除过期的数据? - 简书 (jianshu.com)
    5.案例2中refreshAfterWrite方法是在设置的时间内没有put相关操作,就会重新reload,前提是该key必须调用过load方法;
        如案例2中: 比如开始get("key"),会触发load,加载默认值def存入缓存("key","def"),这里load一次之后,后面才能触发reload;
                   5秒-10秒时间段内,比如7秒没有put操作,就会reload; 如果超过时间段,比如12秒没有put操作,则直接过期
    6.过期数据不会自动删除,需要起个定时任务,调用    linkStatusMap.cleanUp()方法删除过期数据  ,会把所有segment下的所有数据删除         

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值