mybatis的二級緩存,以及如何利用redis優化mybatis緩存?

學習redis,緩存是很重要的一塊

1.1 爲什麼要使用緩存?

爲mybatis增加緩存功能,可有利用減少數據庫訪問

系統運行的瓶頸很重要的一個因素就是數據庫,
減少數據庫的訪問壓力,可以提高整個系統的吞吐量。

什麼是緩存?

將SQL語句,以及對應的查詢結果存在服務器內存中,這一塊內存存儲區域,被我們稱之爲緩存。

如果之後再執行該同樣的SQL語句,則直接從緩存中去取,不再去查詢數據庫,可減小數據庫的訪問壓力。

緩存的核心使用思路

  1. 開啓緩存
  2. 緩存的作用範圍 緩存中的數據可以使用的範圍
  3. 髒數據的處理
    髒數據:緩存是數據庫中熱點數據的備份,當數據庫中的熱點數據發生變化時,緩存也要和數據庫保持一致,否則相應的數據成爲髒數據。

1.2 mybatis現有的緩存

mybatis的緩存分成一級緩存和二級緩存

一級緩存也稱之爲SqlSession級別的緩存,默認開啓,只一次查詢有效,作用範圍太小,意義不大。
髒數據的處理 :執行增刪改有可能造成髒數據,一旦執行增刪改立刻清空緩存。

二級緩存稱之爲SqlSessionFactory級別的緩存,
通常我們所說的緩存默認指的就是二級緩存。

二級緩存使用步驟

  1. 開啓二級緩存 (如果和spring整合,默認已經開啓)
    若沒有,要在mybatis-config.xml中配置一下信息:
<settings>
	<setting name = "cacheEnabled"  value="true" /> 
</settings>
  1. 在mapper文件增加 < cache/>

*Mapper.xml中配置:

<cache />

只有添加了cache標籤的mapper文件中的查詢結果纔會放置到對應的二級緩存中

  1. 將需要存儲到緩存中的對象實現序列化接口

  2. 二級緩存作用範圍
    同1個namespace下

  3. 髒數據的處理
    執行同1個namespace下的增刪改,自動清空該namespace下的緩存

內置的二級緩存通常也不用。
內置的二級緩存本身有namespace的問題,並且不支持持久化。
所以平時主要用:Ehcache 獨立的緩存組件,使用純Java編寫。
準備工作:引入相關jar包 ehcache-core.jar mybatis-ehcache.jar

使用步驟:

  1. 開啓 緩存,Config.xml中配置和上面一樣
  2. mapper.xml中配置,cache標籤要加一個type屬性指向我們自定義的cache
    在這裏插入圖片描述
  3. src下添加ehcache.xml
    在這裏插入圖片描述
    Encache作用於整個項目中 。
    對髒數據的處理:執行增刪改,立刻清空緩存中的數據。

注意:低版本的mybatis配合ehcache有問題,需要升級mybatis到3.2以上
另外ehcache.xml 需要添加updateCheck=”false” 禁用檢查更新
在這裏插入圖片描述

說了這麼多,

如何使用redis優化mybatis緩存

mybatis已經實現了二級緩存,爲什麼使用redis對其優化???

mybatis本身二級緩存的查詢結果要存儲在當前服務器的JVM虛擬機中,如果緩存的數據量過大會造成jvm服務器臃腫緩慢,大量佔用內存空間。

所以我們最好將緩存的數據從tomcat服務器上轉移到redis服務器上,redis存取速度快,並且是一個獨立進程和jvm沒有關係。

實現步驟

  1. 添加jar包
    在這裏插入圖片描述
  2. 在mapper文件中,增加自定義二級緩存的實現類配置
    在這裏插入圖片描述
  3. 在src下,增加一個redis.properties配置文件,指明要連接redis數據庫的ip和端口號
    默認是連接本地的redis
    在這裏插入圖片描述
    總結:爲了減少mysql數據庫的查詢壓力,藉助mybatis二級緩存,讓多用戶共享查詢結果
    前提執行的SQL語句是相同的。但是項目運行過程中,發現二級緩存存儲的數據量越來越大,大量佔用了當前JVM的空間,爲了解決這個問題,使用redis數據庫存儲緩存的數據
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章