最近一直在老家遠程辦公,微信忽然響了下,有同事說遇到了一個奇怪的問題,讓我幫忙看下。
現象就是標題所說的緩存獲取不到的問題,我一聽感受這個問題挺有意思的,決定一探究竟。
下面給出部分代碼還原下案發現場: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,竟然獲取不到值。
這就有點匪夷所思了,咱們來好好排查下。
首先過時時間爲 600 秒,確定不是剛保存就過時了的緣由。
而後去 Redis 中查看到底有沒有 Put 進去,發現數據在 Redis 中已經存在了,證實插入沒問題。緩存
只有使出終極必殺器了,那就是 debug 源碼。
經過 get 方法一直往下看,最終到了 RedisCache 裏面。微信
而後在這裏打個斷點,看看到底有沒有獲取到 Redis 中的值,驚訝的發現,值是獲取到了的,以下:app
納尼,這是什麼操做。摸了摸我還沒禿頂的後腦勺
我鎖定了下面這行代碼:CacheValueHolder<V> holder = (CacheValueHolder)this.valueDecoder.apply(bytes);
框架
猜想應該是解碼的時候出問題了,而後找到了對應的解碼的代碼,用的是 kryo 框架。ide
終於在最後一步解碼的時候發現了錯誤,守得雲開見月明啊!函數
錯誤告訴咱們 ArrayList 缺乏構造函數呀,請注意是 Arrays 裏面的 ArrayList。嚇得我趕忙看下代碼,果然是 Arrays.asList()構造的參數。this
解決辦法天然就很簡單了,直接用 java.util.ArrayList 便可。
最後想說的是解決問題最重要的是方式和技巧。寫這篇文章的目的也是但願你們在遇到問題的時候不要侷限於表面,能夠往深一點去探索。
熱文推薦
好機會,我要幫女同事解決Maven衝突問題debug
上線前一個小時,dubbo這個問題可把我折騰慘了code
爲了控制Bean的加載我使出了這些殺手鐗
若有收穫,點個在看,誠摯感謝
尹吉歡我不差錢啊