来自:猿天地

最近一直在老家远程办公,微信突然响了下,有同事说遇到了一个奇怪的问题,让我帮忙看下。

现象就是标题所说的缓存获取不到的问题,我一听感觉这个问题挺有意思的,决定一探究竟。

下面给出部分代码还原下案发现场:

@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居然获取不到?相关推荐

  1. php缓存远程图片接口,Android_Android远程获取图片并本地缓存,对于客户端——服务器端应用 - phpStudy...

    Android远程获取图片并本地缓存 对于客户端--服务器端应用,从远程获取图片算是经常要用的一个功能,而图片资源往往会消耗比较大的流量,对应用来说,如果处理不好这个问题,那会让用户很崩溃,不知不觉手 ...

  2. 通过setsockopt设置SO_SNDBUF、SO_RCVBUF这连个默认缓冲区的值,再用getsockopt获取设置的值,发现返回值是设置值的两倍。

    修改发送和接收的buffer: SEND_BUF_SIZE = 2501 RECV_BUF_SIZE = 2502node1:/root/test#python t2.py Buffer size [ ...

  3. 明白了缓存穿透和缓存雪崩,再了解一下缓存击穿!

    作者 l 会点代码的大叔(CodeDaShu) 在往期文章中,我们介绍了缓存穿透和缓存雪崩,其中缓存雪崩,是对于一些设置了过期时间的 key,在某个时间点集体失效后,有大量的请求落到数据库上导致被击垮 ...

  4. weblogic缓存导致的网页验证码无法获取到

    一.情况概述: 4台机器部署两套weblogic,使用weblogic自带的proxy提供代理服务,进行流量分发. 每两台机器使用一个proxy.每台机器部署2个实例. 二.问题: 其中一套weblo ...

  5. android 自动清理缓存图片吗,Android中Glide获取缓存大小并清除缓存图片

    清除Glide缓存 Glide自带清除缓存的功能,分别对应Glide.get(context).clearDiskCache();(清除磁盘缓存)与Glide.get(context).clearMe ...

  6. 正面刚CNN,Transformer居然连犯错都像人类

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 梦晨 水木番 发自 凹非寺 量子位 报道 | 公众号 QbitAI ...

  7. linux查看cpu缓存大小,如何在Linux中获取CPU Cache的大小

    对于运行Linux的ARM CPU(在具有Raspbian(32位)的Raspberry Pi 3B +上测试): "Arm®Cortex®-A53MPCore处理器技术参考手册" ...

  8. 微信小程序从前端wxml页面数据获取,到JS页面数据对象字符化,传递给后台,前台再从后台获取数据并在wxml页面动态展示数据(前后台交互实现发表动态功能)

    页面: 事件是视图层到逻辑层的通讯方式. 事件可以将用户的行为反馈到逻辑层进行处理. 事件可以绑定在组件上,当达到触发事件,就会执行逻辑层中对应的事件处理函数. 事件对象可以携带额外信息,如 id, ...

  9. android 壁纸再拿,Android获取当前桌面壁纸

    这段时间项目有需求要获取桌面的壁纸来设成背景,发现网上很多同学都通过WallpaperManager的getDrawable等API来获取,这样的确能获得到壁纸,但是要稍微注意一下. 桌面的壁纸可是很 ...

最新文章

  1. 我的第一个WM5程序
  2. Linux kernel kfifo分析【转】
  3. N皇后问题——DFS+回溯剪枝
  4. 【2023】上海交通大学计算机考研信息汇总
  5. Xmind如何添加水印
  6. 计算机office报名时间,计算机二级office每年的报名时间和考试时间是什么时候?...
  7. 人民日报申论范文:“传统文化”怎么写?
  8. 简述osi参考模型各层主要功能_简述OSI参考模型定义及各层的主要功能
  9. ie检查服务器证书吊销,“检查服务器证书是否已吊销”的勾选去掉
  10. git merge 冲突解决
  11. 如何开通个人微信公众号(订阅号)
  12. vue基础:ElementUI的表单
  13. 中国服务器连通状态,ppp服务器连通状态显示失败怎么办?
  14. 三电极体系 电化学传感器
  15. 基于likeadmin管理后台搭建—通用CRM管理系统
  16. Windows10系统保留正版系统重装 与 热迁移系统
  17. 【Java】- JDK是什么?
  18. C++ Primer Plus(第六版)编程练习答案 第4章 复合类型
  19. 希尔顿荣誉客会与FLYERT飞客宣布建立合作伙伴关系,为忠诚会员提供超值奖励...
  20. 【星辰傀儡线·命运环·卷二 尘埃】 7 金团

热门文章

  1. 求解最大公约数算法(包含四种方法)
  2. js插值计算_Python IDW插值计算及可视化绘制
  3. 四川大学计算机学院2020推免公示,四川大学2020年推免生录取情况分析
  4. 100例shell脚本之八远程管理获得hosts ip以及推送公钥到hosts
  5. 基于Mixin Network的PHP比特币开发教程 之一:创建机器人
  6. Scrapy源代码分析-经常使用的爬虫类-CrawlSpider(三)
  7. Firewall防火墙应用案例
  8. Java排序算法——希尔排序
  9. 浅谈利用SQLite存储离散瓦片的思路和实现方法
  10. IIRF重写在asp.net4.0+IIS6中部分失败的解决方案