惊讶!缓存刚Put再Get居然获取不到?
2024-09-06 19:48:38
最近一直在老家远程办公,微信突然响了下,有同事说遇到了一个奇怪的问题,让我帮忙看下。
现象就是标题所说的缓存获取不到的问题,我一听感觉这个问题挺有意思的,决定一探究竟。
下面给出部分代码还原下案发现场:
@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即可。
最后想说的是解决问题最重要的是方式和技巧。写这篇文章的目的也是希望大家在遇到问题的时候不要局限于表面,可以往深一点去探索。
最新文章
- 浅谈C# 多态的法力
- 解决mac安装grunt时出现[command not found]的错误
- ios UIButton设置单选效果,以及同时设置图片和标题
- css3 弹框提示样式
- Android 数据通信
- IDL简介与corba入门案例
- 面向对象分析方法(II)
- LeetCode Product of Array Except Self (除自身外序列之积)
- SQLite DBHelp
- 一、SOAP简单对象访问协议讲解
- 在点击div中的p时,如何阻止事件冒泡?
- web项目中图标的前端处理方案
- 基于Grafana+SimpleJson的灵活报表解决方案
- rocketmq番外篇(一):开发命令行
- 20175236 2018-2019-2 《Java程序设计》第六周学习总结
- [Maven]Maven如何得到单独的单元测试报告
- 【转】HTML
- linux 的基本操作(linux系统的日常管理)
- MSM8953 audio dts 代码跟踪
- RocketMQ最佳实战
热门文章
- 5.基本的Dos命令
- tomcat启动时检测到循环继承而栈溢出的问题:Caused by: java.lang.IllegalStateException: Unable to complete the scan for annotations for web application [/test] due to a StackOverflowError. Possible root causes include
- .net Core 2.*使用autofac注入
- hdu4841
- Python-直接存储类实例作为序列的元素
- Ninject 初步 -Getting Started with Ninject 精通ASP-NET-MVC-5-弗瑞曼 Listing 6-10
- shell脚本快速配置yum源
- mysql--->;profile使用
- obj2gltf安装详细教程
- jenkins 与 gitlab 的持续集成