最近一直在老家遠程辦公,微信忽然響了下,有同事說遇到了一個奇怪的問題,讓我幫忙看下。java
現象就是標題所說的緩存獲取不到的問題,我一聽感受這個問題挺有意思的,決定一探究竟。git
下面給出部分代碼還原下案發現場:github
@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秒,確定不是剛保存就過時了的緣由。bash
而後去Redis中查看到底有沒有Put進去,發現數據在Redis中已經存在了,證實插入沒問題。微信
只有使出終極必殺器了,那就是debug源碼。app
經過get方法一直往下看,最終到了RedisCache裏面。框架
而後在這裏打個斷點,看看到底有沒有獲取到Redis中的值,驚訝的發現,值是獲取到了的,以下:函數
納尼,這是什麼操做。摸了摸我還沒禿頂的後腦勺,我鎖定了下面這行代碼:this
CacheValueHolder<V> holder = (CacheValueHolder)this.valueDecoder.apply(bytes);
複製代碼
猜想應該是解碼的時候出問題了,而後找到了對應的解碼的代碼,用的是kryo框架。
終於在最後一步解碼的時候發現了錯誤,守得雲開見月明啊!
錯誤告訴咱們ArrayList缺乏構造函數呀,請注意是Arrays裏面的ArrayList。嚇得我趕忙看下代碼,果然是Arrays.asList()構造的參數。
*解決辦法天然就很簡單了,直接用 *java.util.ArrayList便可。
最後想說的是解決問題最重要的是方式和技巧。寫這篇文章的目的也是但願你們在遇到問題的時候不要侷限於表面,能夠往深一點去探索。
感興趣的能夠關注下個人微信公衆號 猿天地,更多技術文章第一時間閱讀。個人GitHub也有一些開源的代碼 github.com/yinjihuan