Mybatis-二级缓存缺陷修复

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

 

转载于:https://my.oschina.net/u/3445128/blog/1542522

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值