下午在给业余项目中集成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()); }