惊讶!缓存刚Put再Get居然获取不到?
来自:猿天地
最近一直在老家远程办公,微信突然响了下,有同事说遇到了一个奇怪的问题,让我帮忙看下。
现象就是标题所说的缓存获取不到的问题,我一听感觉这个问题挺有意思的,决定一探究竟。
下面给出部分代码还原下案发现场:
@CreateCache(name = "demo", expire = 600)
private Cache<String, ThirdPartyEventResponse> cache;
@Test
public void test() {ThirdPartyEventResponse eventResponse = new ThirdPartyEventResponse();eventResponse.setTicketCategories(Arrays.asList(ticketCategoryResponse));// 省略 .....// 添加cache.put(DisChannelType.PIAONIU.getValue(), eventResponse);// 获取ThirdPartyEventResponse resp = cache.get(DisChannelType.PIAONIU.getValue());
}
Put 之后马上 Get,居然获取不到值。
这就有点匪夷所思了,我们来好好排查下。
首先过期时间为 600 秒,肯定不是刚保存就过期了的原因。
然后去 Redis 中查看到底有没有 Put 进去,发现数据在 Redis 中已经存在了,证明插入没问题。
只有使出终极必杀器了,那就是 debug 源码。
通过 get 方法一直往下看,最终到了 RedisCache 里面。
然后在这里打个断点,看看到底有没有获取到 Redis 中的值,惊讶的发现,值是获取到了的,如下:
纳尼,这是什么操作。摸了摸我还没秃顶的后脑勺
我锁定了下面这行代码:
CacheValueHolder<V> holder = (CacheValueHolder)this.valueDecoder.apply(bytes);
猜测应该是解码的时候出问题了,然后找到了对应的解码的代码,用的是 kryo 框架。
终于在最后一步解码的时候发现了错误,守得云开见月明啊!
错误告诉我们 ArrayList 缺少构造函数呀,请注意是 Arrays 里面的 ArrayList。吓得我赶紧看下代码,果真是 Arrays.asList()构造的参数。
解决办法自然就很简单了,直接用 java.util.ArrayList 即可。
最后想说的是解决问题最重要的是方式和技巧。写这篇文章的目的也是希望大家在遇到问题的时候不要局限于表面,可以往深一点去探索。
特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:
长按订阅更多精彩▼如有收获,点个在看,诚挚感谢
惊讶!缓存刚Put再Get居然获取不到?相关推荐
- php缓存远程图片接口,Android_Android远程获取图片并本地缓存,对于客户端——服务器端应用 - phpStudy...
Android远程获取图片并本地缓存 对于客户端--服务器端应用,从远程获取图片算是经常要用的一个功能,而图片资源往往会消耗比较大的流量,对应用来说,如果处理不好这个问题,那会让用户很崩溃,不知不觉手 ...
- 通过setsockopt设置SO_SNDBUF、SO_RCVBUF这连个默认缓冲区的值,再用getsockopt获取设置的值,发现返回值是设置值的两倍。
修改发送和接收的buffer: SEND_BUF_SIZE = 2501 RECV_BUF_SIZE = 2502node1:/root/test#python t2.py Buffer size [ ...
- 明白了缓存穿透和缓存雪崩,再了解一下缓存击穿!
作者 l 会点代码的大叔(CodeDaShu) 在往期文章中,我们介绍了缓存穿透和缓存雪崩,其中缓存雪崩,是对于一些设置了过期时间的 key,在某个时间点集体失效后,有大量的请求落到数据库上导致被击垮 ...
- weblogic缓存导致的网页验证码无法获取到
一.情况概述: 4台机器部署两套weblogic,使用weblogic自带的proxy提供代理服务,进行流量分发. 每两台机器使用一个proxy.每台机器部署2个实例. 二.问题: 其中一套weblo ...
- android 自动清理缓存图片吗,Android中Glide获取缓存大小并清除缓存图片
清除Glide缓存 Glide自带清除缓存的功能,分别对应Glide.get(context).clearDiskCache();(清除磁盘缓存)与Glide.get(context).clearMe ...
- 正面刚CNN,Transformer居然连犯错都像人类
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 梦晨 水木番 发自 凹非寺 量子位 报道 | 公众号 QbitAI ...
- linux查看cpu缓存大小,如何在Linux中获取CPU Cache的大小
对于运行Linux的ARM CPU(在具有Raspbian(32位)的Raspberry Pi 3B +上测试): "Arm®Cortex®-A53MPCore处理器技术参考手册" ...
- 微信小程序从前端wxml页面数据获取,到JS页面数据对象字符化,传递给后台,前台再从后台获取数据并在wxml页面动态展示数据(前后台交互实现发表动态功能)
页面: 事件是视图层到逻辑层的通讯方式. 事件可以将用户的行为反馈到逻辑层进行处理. 事件可以绑定在组件上,当达到触发事件,就会执行逻辑层中对应的事件处理函数. 事件对象可以携带额外信息,如 id, ...
- android 壁纸再拿,Android获取当前桌面壁纸
这段时间项目有需求要获取桌面的壁纸来设成背景,发现网上很多同学都通过WallpaperManager的getDrawable等API来获取,这样的确能获得到壁纸,但是要稍微注意一下. 桌面的壁纸可是很 ...
最新文章
- 我的第一个WM5程序
- Linux kernel kfifo分析【转】
- N皇后问题——DFS+回溯剪枝
- 【2023】上海交通大学计算机考研信息汇总
- Xmind如何添加水印
- 计算机office报名时间,计算机二级office每年的报名时间和考试时间是什么时候?...
- 人民日报申论范文:“传统文化”怎么写?
- 简述osi参考模型各层主要功能_简述OSI参考模型定义及各层的主要功能
- ie检查服务器证书吊销,“检查服务器证书是否已吊销”的勾选去掉
- git merge 冲突解决
- 如何开通个人微信公众号(订阅号)
- vue基础:ElementUI的表单
- 中国服务器连通状态,ppp服务器连通状态显示失败怎么办?
- 三电极体系 电化学传感器
- 基于likeadmin管理后台搭建—通用CRM管理系统
- Windows10系统保留正版系统重装 与 热迁移系统
- 【Java】- JDK是什么?
- C++ Primer Plus(第六版)编程练习答案 第4章 复合类型
- 希尔顿荣誉客会与FLYERT飞客宣布建立合作伙伴关系,为忠诚会员提供超值奖励...
- 【星辰傀儡线·命运环·卷二 尘埃】 7 金团
热门文章
- 求解最大公约数算法(包含四种方法)
- js插值计算_Python IDW插值计算及可视化绘制
- 四川大学计算机学院2020推免公示,四川大学2020年推免生录取情况分析
- 100例shell脚本之八远程管理获得hosts ip以及推送公钥到hosts
- 基于Mixin Network的PHP比特币开发教程 之一:创建机器人
- Scrapy源代码分析-经常使用的爬虫类-CrawlSpider(三)
- Firewall防火墙应用案例
- Java排序算法——希尔排序
- 浅谈利用SQLite存储离散瓦片的思路和实现方法
- IIRF重写在asp.net4.0+IIS6中部分失败的解决方案