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

栏目: IT技术 · 发布时间: 5年前

内容简介:最近一直在老家远程办公,微信突然响了下,有同事说遇到了一个奇怪的问题,让我帮忙看下。现象就是标题所说的缓存获取不到的问题,我一听感觉这个问题挺有意思的,决定一探究竟。下面给出部分代码还原下案发现场:

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

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

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

@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中已经存在了,证明插入没问题。

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

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

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

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

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

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

纳尼,这是什么操作。摸了摸我还没秃顶的后脑勺,我锁定了下面这行代码:

CacheValueHolder<V> holder = (CacheValueHolder)this.valueDecoder.apply(bytes);

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

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

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

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

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

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

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

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


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

PWA实战

PWA实战

[美]Dean Alan Hume / 郑丰彧 / 电子工业出版社 / 2018-6 / 69

Progressive Web App(PWA)是由谷歌提出的一整套技术解决方案,它致力于为 Web 提供出色的用户体验,并完美体现了渐进增强原则。作为为数不多的实战入门用书,《PWA 实战:面向下一代的Progressive Web App》旨在通过大量清晰示例来介绍 PWA 的主要特性。全书一共由五个部分组成:第一部分介绍 PWA 的概念及解锁 PWA 应用的关键—Service Worker......一起来看看 《PWA实战》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具