mybatis缓存容易产生脏数据,推荐使用第三方缓存:memcached或者redis。

mybatis一级缓存中的脏数据:

mybatis的一级缓存:默认是SqlSession级别,只要通过session查过的数据,都会放在session上,下一次再查询相同id的数据,都直接冲缓存中取出来,而不用到数据库里去取了。

产生的脏数据:当有不同的sqlSession在对数据库进行操作,一级缓存只能保证当前sqlSession中的增删改在一级缓存中自动更新,就会产生脏数据。

mybatis二级缓存中的脏数据:

mybatis二级缓存:是SessionFactory级别,和namespace绑定,同一个namespace放到一个缓存对象中,当这个namaspace中执行了非sselect语句的时候,整个namespace中的缓存全部清除掉。

产生的脏数据:引起脏读的操作通常发生在多表关联操作中,比如在两个不同的mapper中都涉及到同一个表的增删改查操作,当其中一个mapper对这张表进行查询操作,此时另一个mapper进行了更新操作刷新缓存,然后第一个mapper又查询了一次,那么这次查询出的数据是脏数据。出现脏读的原因是他们的操作的缓存并不是同一个。

所以,推荐使用第三方缓存:memcached或者redis。

redis中怎么更新缓存避免脏读?

读写部分:

if(redis存在数据){
    读取redis数据
}else{
    数据库读取,同时存redis+设置超时时间

更新部分:

if(数据库update){
    更新redis+设置超时时间

你可能感兴趣的:(Java,mybatis,redis)