日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Mybatis一级缓存和二级缓存 Redis缓存

發布時間:2023/12/20 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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缓存的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。