zoukankan      html  css  js  c++  java
  • Mybatis一级缓存和二级缓存 Redis缓存

    一级缓存

    • Mybatis的一级缓存存放在SqlSession的生命周期,在同一个SqlSession中查询时,Mybatis会把执行的方法和参数通过算法生成缓存的键值,将键值和查询结果存入一个Map对象中。
    • 如果同一个SqlSession中执行的方法和参数完全一致,那么通过算法会生成相同的键值,当Map缓存对象中已经存在改键值时,则会返回缓存中的对象。(一个SqlSession连续两次查询 得到的是同一个java对象)
    • 任何的insert update delete操作都会清空一级缓存(增删改任何记录都会清空当前SqlSession的缓存)。

    Spring整合Mybatis的时候一级缓存的问题:

      在未开启事物的情况之下,每次查询,spring都会关闭旧的sqlSession而创建新的sqlSession,因此此时的一级缓存是没有启作用的

      在开启事物的情况之下,spring使用threadLocal获取当前资源绑定同一个sqlSession,因此此时一级缓存是有效的

    Spring结合Mybatis一级缓存失效的问题

    二级缓存

    每个sqlSession都有自己的一级缓存,多个sqlSession共享二级缓存

    Mybatis二级缓存可以理解为存在SqlSessionFactory的生命周期

    开启二级缓存(还有全局的开启方式,这里就不多说了):

    1.在对应的XXXMapper.XML添加如下代码

      <cache></cache>

    2. 在对应的select标签上添加(测试了下 不加也行)

    useCache="true"

    二级缓存特点:

    SqlSession1调用getMapper获取对象user1

    SqlSession1调用getMapper获取对象user2

    user1和user2是同一个实例(原理同一级缓存)

    如果二级配置可读写的缓存 <cache readOnly="false"/>(顾名思义 可以写的缓存吗 就是我写这个对象 不影响你,两个实例),不同SqlSession之间通过序列化和反序列化来保证通过缓存获取数据。

    当另外一个SqlSess2开始执行SQL时候,不会去查数据库 会利用SqlSession1的缓存

    SqlSession2调用getMapper获取对象user1_

    SqlSession2调用getMapper获取对象user2_

    user1_和user2_就是反序列化得到的结果 是不同的实例

    此时虽然只发出一个SQL 但是:user1==user2  user1_<>user2_<>user1

    当 readOnly="true"的时候

    <cache readOnly="true"/>

    user1==user2==user1==user2

    二级缓存坑的地方:

    你在OrderMapper.XML 和 UserMapp.XML的文件 都操作了User表的话,

    当你使用OrderMapper.XML的SQL更新User表的时候,其他的SeqSession在OrderMapper.XML可以查到User表最新的数据,但是在UserMapp.XML查不到最新的数据

    原因就是 二级缓存是基于某个XXXMapper.xml,每个Mapper直接独立,所以 不同Mapper操作同一张表的时候  使用二级缓存会造成脏读 

    这也就是没什么人开启二级缓存的主要原因 

    Redis缓存一致性

    Mybatis默认提供的缓存是基于Map实现的内存缓存,已经可以基本满足应用。但当需要缓存大量数据的时候可以使用Redis缓存数据库来保存Mybatis的二级缓存数据。

    但MySQL和Redis是两个事物,不好做强一致性。

    简单点:可以延时双删+过期时间保证最终一致性。

    双删的原因是防止并发情况下 update_db的过程中 其他事物发现redis缓存是空 重新赋予了Redis的值 此时如果赋值 是错误的数据

    第二次延时删除的原因是要考虑MySQL数据库主从同步的耗时(如果立即删除 有别的线程从MySQL的从库查到的数据放到Redis中 此时的从库可能是没同步的错误数据)

    rm_redis
    update_db
    sleep xxx ms
    rm_redis
  • 相关阅读:
    USACO 2021 US Open
    【UR #20】跳蚤电话
    省选前的做题记录
    PE444
    杂题
    CF1190E
    gym100299E
    杂题
    2021 5 10 团队博客
    2021 5 9 团队博客
  • 原文地址:https://www.cnblogs.com/ssskkk/p/11097159.html
Copyright © 2011-2022 走看看