一头扎进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的大坑相关推荐
- 放弃考研一头扎进春招,却磕得“头破血流”,这么拼值吗?
放弃考研一头扎进春招,却磕得"头破血流",这么拼值吗? 一.在校情况 二.遇见拼客 三.相关面经 L同学-广东工业大学16级电子信息工程专业-拼客学院第20期<全栈Linux ...
- python自动化框架2019_《一头扎进》系列之Python+Selenium自动化测试框架实战篇6 - 价值好几K的框架,呦!这个框架还真牛叉哦!!!...
1. 简介 本文开始介绍如何通过unittest来管理和执行测试用例,这一篇主要是介绍unittest下addTest()方法来加载测试用例到测试套件中去.用addTest()方法来加载我们测试用例到 ...
- 一头扎进Node系列 - 目录
前言 本系列是属于初级教程.博主我也还只是一个node的新兵蛋子,想通过学习官网的API文档,慢慢的打好Node基础.当然后期这系列文档会慢慢完善,并且会添加一些项目实战中遇到的一些问题以及解决方案! ...
- 一头扎进Shiro-自定义Realm
在一头扎进Shiro-集成Web之前的博客,我们都是用shiro.ini保存用户.角色.权限信息,本篇文章我们将这些信息保存到数据库,通过自定义Realm完成身份验证和权限验证. 去掉用户.角色.权限 ...
- 一头扎进Mysql视频教程 + 源码
[@2015-4-8] 记录一下自己的脚印:看到一个一头扎进Mysql视频教程 + 源码果断下载下来,看了看比较到位, 下载地址:http://www.xiaomengku.com/topic?id= ...
- 一头扎进SpringBoot视频教程(附源码与文档)
目录:/099 一头扎进SpringBoot视频教程(附源码与文档) ┣━━<一头扎进SpringBoot>第八讲.mp4 ┣━━<一头扎进SpringBoot>第八讲源码及文 ...
- 一头扎进Maven3 (一)
本系列博客将学习Maven项目管理工具,使用Maven管理jar包 一头扎进Maven3 (一):Maven安装与配置 文档结构 Maven简介 Maven安装与配置 Maven Hello Worl ...
- 一头扎进Maven3 (二)
本系列博客将学习Maven项目管理工具,使用Maven管理jar包 一头扎进Maven3 (二):在 Eclipse 中使用 Maven 文档结构 m2eclipse 插件安装 在 Eclipse 中 ...
- 一头扎进Shiro-身份认证
在<一头扎进Shiro-HelloWorld>中介绍了将用户信息保存在Subject认证主体,用shiro.ini模拟数据库记录用户名.密码信息完成验证的过程,这篇文章我们将讲解如何通过R ...
最新文章
- 高级网络配置《 bond team桥接 》的建立
- 解决.Net Core跨域问题
- php 去除首位字符_php中如何去除字符串首尾字符?
- Guidance Package Manager button doesn’t appear in the VS menu
- SAP IQ09 可以批量查询序列号数据
- armv8 汇编 绝对地址赋值_ARMv8带来的变化
- php v9 分页静态,PHPCMS V9自定义栏目伪静态实现方法(列表页/分页/内容页)
- spring-cloud导入eclipse时,@slf4j注解为什么找不到log变量
- [Eclipse]GEF入门系列(序)
- 解引用NULL为什么会导致程序挂死?
- c 程序设计语言第1 3部分,《C程序设计语言(第2版新版)典藏版》 —1.3 for语句...
- 在ubuntu中使用cv2.imshow()报错 No protocol specified qt.qpa.xcb: could not connect to display :0
- 本以为用的MyBatis框架就万无一失了,没想到还是被黑客注入了,我真的无语了!...
- linux中使用网易云音乐
- 算法分析与设计:棋盘覆盖问题(分治法)
- JavaScript成语消消乐
- 关于《训练指南》中的“翻棋子游戏”
- python导入文件夹下所有包_python 通过文件夹导入包的操作
- 曲线积分于曲面积分(后篇 曲面积分-坐标曲面积分-高斯公式-斯托克斯公式)
- 中华成语库 v1.1 下载