下午在给业余项目中集成redis作为Mybatis的二级缓存测试。发现第一次查询过后,做的更新,缓存都没有及时更新。期初以为是jedis实现中removeObject出了问题,经过测试发现并没有问题。然后跟踪mybatis执行代码,发现mybatis在更新操作时实际调用的是clear方法。好吧,网上博客中clear方法未做实现。。。。。
但是考虑到如果做clear,那岂不是所有缓存都被清除掉了,这样不妥。再考虑你能不能用正则的形式来删除指定缓存,发现也比较麻烦。在oschina上看到一个缓存细粒度控制的插件,本来准备就按照它的实现,但还是感觉麻烦。换了一种思路来做了
在这里还要说一点,网上集成redis都是使用String的存储方式,个人感觉这个用的不妥,所以我用的是hash的存储方式,每个statementId为key,mapper中的方法为field。
新思路也是根据插件的思想来的,将clear方法进行实现。每次执行clear方法时,先用id也就是statemenId获取redis中所有的数据,然后将此id下的数据全部删除掉。这样既实现了更新时缓存无法刷新的问题,也对二级缓存更加细粒度处理了。
贴上一段代码
@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());
}