下午在給業餘項目中集成redis做爲Mybatis的二級緩存測試。發現第一次查詢事後,作的更新,緩存都沒有及時更新。期初覺得是jedis實現中removeObject出了問題,通過測試發現並無問題。而後跟蹤mybatis執行代碼,發現mybatis在更新操做時實際調用的是clear方法。好吧,網上博客中clear方法未作實現。。。。。java
可是考慮到若是作clear,那豈不是全部緩存都被清除掉了,這樣不妥。再考慮你能不能用正則的形式來刪除指定緩存,發現也比較麻煩。在oschina上看到一個緩存細粒度控制的插件,原本準備就按照它的實現,但仍是感受麻煩。換了一種思路來作了redis
在這裏還要說一點,網上集成redis都是使用String的存儲方式,我的感受這個用的不妥,因此我用的是hash的存儲方式,每一個statementId爲key,mapper中的方法爲field。緩存
新思路也是根據插件的思想來的,將clear方法進行實現。每次執行clear方法時,先用id也就是statemenId獲取redis中全部的數據,而後將此id下的數據所有刪除掉。這樣既實現了更新時緩存沒法刷新的問題,也對二級緩存更加細粒度處理了。mybatis
貼上一段代碼app
@Override public void clear() { Map<byte[], byte[]> allMap = jedisClientMaster.HGETALL(id); for (Entry<byte[], byte[]> bt : allMap.entrySet()) { jedisClientMaster.HDEL(id.getBytes(), bt.getKey()); } _LOG.info("remove cache count: " + allMap.size()); }