一头扎进caffeine cache的大坑

16 篇文章 0 订阅

一头扎进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是一个用于在项目开发中实现本地缓存的工具。它是基于Guava Cache设计思想的,因此如果之前使用过Guava Cache,使用Caffeine会更加容易上手。通过Caffeine类来配置Cache,可以设置缓存的参数,包括最大缓存大小、写入后过期时间等。例如,可以使用以下代码来构造一个缓存Cache实例: Cache cache = Caffeine.newBuilder().maximumSize(1000).expireAfterWrite(6, TimeUnit.MINUTES).softValues().build(); 这段代码中,使用Caffeine的newBuilder()方法创建一个新的Caffeine实例,并通过链式调用方法设置了缓存的最大大小为1000,写入后的过期时间为6分钟,并开启了软引用以支持内存敏感的缓存。最后使用build()方法构建出一个Cache实例。使用这个Cache实例,我们可以进行缓存的读写操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [浅入浅出Caffeine cache](https://blog.csdn.net/weixin_40413961/article/details/119064614)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [缓存之王Caffeine Cache,性能比Guava更强,命中率更高!](https://blog.csdn.net/rlnLo2pNEfx9c/article/details/114984936)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值