學習redis,緩存是很重要的一塊
1.1 爲什麼要使用緩存?
爲mybatis增加緩存功能,可有利用減少數據庫訪問
系統運行的瓶頸很重要的一個因素就是數據庫,
減少數據庫的訪問壓力,可以提高整個系統的吞吐量。
什麼是緩存?
將SQL語句,以及對應的查詢結果存在服務器內存中,這一塊內存存儲區域,被我們稱之爲緩存。
如果之後再執行該同樣的SQL語句,則直接從緩存中去取,不再去查詢數據庫,可減小數據庫的訪問壓力。
緩存的核心使用思路
- 開啓緩存
- 緩存的作用範圍 緩存中的數據可以使用的範圍
- 髒數據的處理
髒數據:緩存是數據庫中熱點數據的備份,當數據庫中的熱點數據發生變化時,緩存也要和數據庫保持一致,否則相應的數據成爲髒數據。
1.2 mybatis現有的緩存
mybatis的緩存分成一級緩存和二級緩存
一級緩存也稱之爲SqlSession級別的緩存,默認開啓,只一次查詢有效,作用範圍太小,意義不大。
髒數據的處理 :執行增刪改有可能造成髒數據,一旦執行增刪改立刻清空緩存。
二級緩存稱之爲SqlSessionFactory級別的緩存,
通常我們所說的緩存默認指的就是二級緩存。
二級緩存使用步驟
- 開啓二級緩存 (如果和spring整合,默認已經開啓)
若沒有,要在mybatis-config.xml中配置一下信息:
<settings>
<setting name = "cacheEnabled" value="true" />
</settings>
- 在mapper文件增加 < cache/>
*Mapper.xml中配置:
<cache />
只有添加了cache標籤的mapper文件中的查詢結果纔會放置到對應的二級緩存中
-
將需要存儲到緩存中的對象實現序列化接口
-
二級緩存作用範圍
同1個namespace下 -
髒數據的處理
執行同1個namespace下的增刪改,自動清空該namespace下的緩存
內置的二級緩存通常也不用。
內置的二級緩存本身有namespace的問題,並且不支持持久化。
所以平時主要用:Ehcache 獨立的緩存組件,使用純Java編寫。
準備工作:引入相關jar包 ehcache-core.jar mybatis-ehcache.jar
使用步驟:
- 開啓 緩存,Config.xml中配置和上面一樣
- mapper.xml中配置,cache標籤要加一個type屬性指向我們自定義的cache
- src下添加ehcache.xml
Encache作用於整個項目中 。
對髒數據的處理:執行增刪改,立刻清空緩存中的數據。
注意:低版本的mybatis配合ehcache有問題,需要升級mybatis到3.2以上
另外ehcache.xml 需要添加updateCheck=”false” 禁用檢查更新
說了這麼多,
如何使用redis優化mybatis緩存
mybatis已經實現了二級緩存,爲什麼使用redis對其優化???
mybatis本身二級緩存的查詢結果要存儲在當前服務器的JVM虛擬機中,如果緩存的數據量過大會造成jvm服務器臃腫緩慢,大量佔用內存空間。
所以我們最好將緩存的數據從tomcat服務器上轉移到redis服務器上,redis存取速度快,並且是一個獨立進程和jvm沒有關係。
實現步驟
- 添加jar包
- 在mapper文件中,增加自定義二級緩存的實現類配置
- 在src下,增加一個redis.properties配置文件,指明要連接redis數據庫的ip和端口號
默認是連接本地的redis
總結:爲了減少mysql數據庫的查詢壓力,藉助mybatis二級緩存,讓多用戶共享查詢結果
前提執行的SQL語句是相同的。但是項目運行過程中,發現二級緩存存儲的數據量越來越大,大量佔用了當前JVM的空間,爲了解決這個問題,使用redis數據庫存儲緩存的數據