我是靠谱客的博主 凶狠草丛,最近开发中收集的这篇文章主要介绍一头扎进caffeine cache的大坑,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一头扎进caffeine cache的大坑

caffeine号称性能做好的本地cache,最近想实践一下学的东西,写个小demo,就用caffeine作为本地缓存缓存一下用户的token,然后配置大概如下:

 private static final Cache<String, String> userTokenCache = Caffeine.newBuilder()
            // 数量上限
            .maximumSize(10000)
            // 过期机制
            .expireAfterAccess(30, TimeUnit.MINUTES)
            // 弱引用key
            .weakKeys()
            // 弱引用value
            .weakValues()
            .build();
     @Bean("userTokenCache")
    public Cache<String,String> userTokenCache(){

        return userTokenCache;
    }

测试的时候发现当前请求生成token放入userTokenCache后 ,下一个请求根据同样的token拿不到缓存数据,最开始怀疑是多线程共享了userTokenCache 这个变量,导致线程1放入的数据线程2无法获取到,后来把final 关键字换成volatile关键字后发现依旧不行。最后突然发现这段代码(我承认这个Caffeine的初始化代码是抄来的):

   			// 弱引用key
            .weakKeys()
            // 弱引用value
            .weakValues()

这个的话是把key和value都设置成弱引用,弱引用在JVM的下一次GC中会被回收。于是打开GC日志输出,在日志中发现了一行:

[GC (Allocation Failure)  82226K->20184K(208896K), 0.0064046 secs]

猜测是这个问题,于是将

   			// 弱引用key
            .weakKeys()
            // 弱引用value
            .weakValues()

删除,再次测试,可以获取到token了,已经80%确定是这个问题了。后来为了论证这个问题,决定在放缓存前后打印系统时间戳,GC日志中也输出时间戳,做一下对比。但是只获取到了GC时间为相对于系统启动的时间,而没有获取到GC的系统时间戳,这个问题只停留在了80%的确定上,如果哪路高手看到了这个问题,还请留下验证方法,把这个问题100%证明一下。

最后

以上就是凶狠草丛为你收集整理的一头扎进caffeine cache的大坑的全部内容,希望文章能够帮你解决一头扎进caffeine cache的大坑所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部