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

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

@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,竟然获取不到值。
惊讶!缓存刚Put再Get竟然获取不到?
这就有点匪夷所思了,咱们来好好排查下。
首先过时时间为 600 秒,确定不是刚保存就过时了的缘由。
而后去 Redis 中查看到底有没有 Put 进去,发现数据在 Redis 中已经存在了,证实插入没问题。缓存

惊讶!缓存刚Put再Get竟然获取不到?
只有使出终极必杀器了,那就是 debug 源码。
经过 get 方法一直往下看,最终到了 RedisCache 里面。微信

惊讶!缓存刚Put再Get竟然获取不到?
而后在这里打个断点,看看到底有没有获取到 Redis 中的值,惊讶的发现,值是获取到了的,以下:app

惊讶!缓存刚Put再Get竟然获取不到?
纳尼,这是什么操做。摸了摸我还没秃顶的后脑勺
惊讶!缓存刚Put再Get竟然获取不到?
我锁定了下面这行代码:
CacheValueHolder&lt;V&gt; holder = (CacheValueHolder)this.valueDecoder.apply(bytes);框架

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

惊讶!缓存刚Put再Get竟然获取不到?
终于在最后一步解码的时候发现了错误,守得云开见月明啊!函数

惊讶!缓存刚Put再Get竟然获取不到?
错误告诉咱们 ArrayList 缺乏构造函数呀,请注意是 Arrays 里面的 ArrayList。吓得我赶忙看下代码,果然是 Arrays.asList()构造的参数。this

惊讶!缓存刚Put再Get竟然获取不到?
解决办法天然就很简单了,直接用 java.util.ArrayList 便可。
最后想说的是解决问题最重要的是方式和技巧。写这篇文章的目的也是但愿你们在遇到问题的时候不要局限于表面,能够往深一点去探索。
热文推荐
好机会,我要帮女同事解决Maven冲突问题debug

上线前一个小时,dubbo这个问题可把我折腾惨了code

为了控制Bean的加载我使出了这些杀手锏

惊讶!缓存刚Put再Get竟然获取不到?
惊讶!缓存刚Put再Get竟然获取不到?
惊讶!缓存刚Put再Get竟然获取不到?
若有收获,点个在看,诚挚感谢

尹吉欢我不差钱啊

相关文章
相关标签/搜索