驚訝!緩存剛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竟然獲取不到?
若有收穫,點個在看,誠摯感謝

尹吉歡我不差錢啊

相關文章
相關標籤/搜索