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一級緩存失效的問題
二級緩存
Mybatis二級緩存可以理解為存在SqlSessionFactory的生命周期
開啟二級緩存:
1.在mybatis-config.xml添加如下代碼
<settings><setting name="cacheEnable" value="true"></setting></settings>2.在對應的XXXMapper.xml的namespace下添加<cache/>元素
二級緩存特點:
SqlSession1調用getMapper獲取對象user1
SqlSession1調用getMapper獲取對象user2
user1和user2是同一個實例(原理同一級緩存)
如果二級配置可讀寫的緩存 <cache readOnly="false"/>,不同SqlSession之間通過序列化和反序列化來保證通過緩存獲取數據。
SqlSession2調用getMapper獲取對象user1_
SqlSession2調用getMapper獲取對象user2_
user1_和user2_就是反序列化得到的結果 是不同的實例
Redis緩存一致性
Mybatis默認提供的緩存是基于Map實現的內存緩存,已經可以基本滿足應用。但當需要緩存大量數據的時候可以使用Redis緩存數據庫來保存Mybatis的二級緩存數據。
但MySQL和Redis是兩個事物,不好做強一致性。
簡單點:可以延時雙刪+過期時間保證最終一致性。
雙刪的原因是防止并發情況下 update_db的過程中 其他事物發現redis緩存是空 重新賦予了Redis的值 此時如果賦值 是錯誤的數據
第二次延時刪除的原因是要考慮MySQL數據庫主從同步的耗時(如果立即刪除 有別的線程從MySQL的從庫查到的數據放到Redis中 此時的從庫可能是沒同步的錯誤數據)
rm_redis update_db sleep xxx ms rm_redis轉載于:https://www.cnblogs.com/ssskkk/p/11097159.html
總結
以上是生活随笔為你收集整理的Mybatis一级缓存和二级缓存 Redis缓存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 逆波兰表达式[栈 C 语言 实现]
- 下一篇: 20190501-编写一个函数来查找字符