前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >惊讶!缓存刚Put再Get居然获取不到?

惊讶!缓存刚Put再Get居然获取不到?

作者头像
猿天地
发布2020-02-27 12:31:51
6610
发布2020-02-27 12:31:51
举报
文章被收录于专栏:猿天地

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

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

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

代码语言:javascript
复制
@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());
}
代码语言:javascript
复制

Put 之后马上 Get,居然获取不到值。

这就有点匪夷所思了,我们来好好排查下。

首先过期时间为 600 秒,肯定不是刚保存就过期了的原因。

然后去 Redis 中查看到底有没有 Put 进去,发现数据在 Redis 中已经存在了,证明插入没问题。

只有使出终极必杀器了,那就是 debug 源码。

通过 get 方法一直往下看,最终到了 RedisCache 里面。

然后在这里打个断点,看看到底有没有获取到 Redis 中的值,惊讶的发现,值是获取到了的,如下:

纳尼,这是什么操作。摸了摸我还没秃顶的后脑勺

我锁定了下面这行代码:

代码语言:javascript
复制
CacheValueHolder<V> holder = (CacheValueHolder)this.valueDecoder.apply(bytes);
代码语言:javascript
复制

猜测应该是解码的时候出问题了,然后找到了对应的解码的代码,用的是 kryo 框架。

终于在最后一步解码的时候发现了错误,守得云开见月明啊!

错误告诉我们 ArrayList 缺少构造函数呀,请注意是 Arrays 里面的 ArrayList。吓得我赶紧看下代码,果真是 Arrays.asList()构造的参数。

解决办法自然就很简单了,直接用 java.util.ArrayList 即可。

最后想说的是解决问题最重要的是方式和技巧。写这篇文章的目的也是希望大家在遇到问题的时候不要局限于表面,可以往深一点去探索。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 猿天地 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档