zoukankan      html  css  js  c++  java
  • 惊讶!缓存刚Put再Get居然获取不到?

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

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

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

    @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即可。

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

  • 相关阅读:
    transformer的pytorch代码讲解
    idea 提交远程库冲突解决
    程序员文档编辑神器typora
    C#-Xamarin的Android项目开发(二)——控件应用
    2020最新全栈必备 Redis,你还不了解么
    2020JAVA最新应对各种OOM代码样例及解决办法
    java8中parallelStream提升数倍查询效率是怎样实现的,来看看这篇文章
    Spring当中循环依赖很少有人讲,今天一起来学习!
    PE 文件格式详解
    Mysql 添加字段、修改字段、删除字段
  • 原文地址:https://www.cnblogs.com/yinjihuan/p/12365310.html
Copyright © 2011-2022 走看看