mybatis二级缓存是以mapper的namespace为单位的,同个namespace下发生修改,都会触发缓存清除。使用mybatis自带的缓存实现的话,默认是删除namespace下的缓存,但是如果使用redis作为缓存的话,实现类没写好的话,会把所有的缓存都清除掉。
1.使用默认实现的话,那就是用map缓存了,每个mapper都会创建一个Cache对象,然后刷新缓存时会调用对应的clear方法,将整个map清空,因为是一个mapper一个map,所以这时候清空的是当前mapper的缓存。
2.使用redis的话,假设客户端是jedis,如果直接调用flush()的话,那肯定就是删除全部缓存了,redis又不知道你数据是按mapper区分的。所以正确做法是,在putObject的时候,记录下缓存的key,在clear的时候,取出这些key,删除,而不是调用jedis的flush。