Redis實現分散式快取
Redis 分散式快取實現(一)
1. 什麼是快取(Cache)
定義:就是計算機記憶體中的一段資料;
2. 記憶體中資料特點
a. 讀寫快 b. 斷電立即丟失
3. 快取解決了什麼問題?
a. 提高網站吞吐量,提高網站執行效率;
b. 核心解決問題:快取的存在是用來減輕資料庫訪問壓力;
4. 既然快取能提高效率,那專案中所有資料加入快取豈不是更好?
注意:使用快取時一定是資料庫中資料極少發生修改,更多用於查詢這種情況 例如:省份 城市 縣 村
5. 本地快取和分散式快取的區別
本地快取:儲存在當前應用伺服器記憶體中的資料稱之為本地快取(local cache)
分散式快取:儲存在當前應用伺服器記憶體之外的資料稱之為分散式快取(distribute cache)
叢集:將同一種服務的多個節點放在一起,共同對系統提供服務的過程稱之為叢集(cluster)
分散式:有多個不同服務叢集共同對系統提供服務的這個系統稱之為分散式系統(distribute system)
6. 利用 MyBatis 自身本地快取結合 Redis 實現分散式快取
a. MyBatis 中應用級快取(二級快取)SqlSessionFactory 級別快取,所有會話共享同一個 namespace
b. 如何開啟(二級快取)
在對應模組的Mapper.xml檔案中開啟二級快取,例如:UserMapper.xml
<cache/> ---- 本地快取
c. 檢視 Cache 標籤快取實現
結論:MyBatis底層預設使用的是:org.apache.ibatis.cache.impl.PerpetualCache 實現【底層就是一個 Map 資料結構儲存】
d. 自定義 RedisCache 實現,替換預設的 PerpetualCache
(1)通過 MyBatis 預設 Cache 原始碼得知,可以只用自定義 Cache 介面的實現類 implements Cache 介面,並對裡面的方法進行實現
public class RedisCache implements Cache { }
(2)在指定 Mapper 對應的 namespace 中開啟二級快取
<cache type="com.study.cache.RedisCache"/>
Redis分散式快取實現(二)
1. 快取在專案中應用
a. 如果專案中表查詢之間沒有任何關聯查詢時,使用現在的這種快取方式沒有任何問題,比如:只是使用單表查詢;
b. 現有快取方式在表連線查詢過程中一定存在問題;比如:Depart 部門中有 多個 User 使用者,Depart { List<User> users; }
2. 在 MyBatis 的快取中如何要解決關聯關係時更新快取資訊的問題
<cache-ref /> 用來將多個有關聯關係查詢快取放在一起處理;
<cache-ref namespace="com.study.mapper.DepartMapper"/>
(1)關聯關係快取處理【用來將兩個關聯關係查詢的結果快取放在一起處理】 (2)存在關聯關係的多個模組中,只要有一個模組更新,就應該把有關聯的模組快取都清空,否則會出現髒資料情況; (3)此時不能使用<cache type=""/> 【只適合單模組的快取】 要使用 <cache-ref namespace=""> 標籤; <cache-ref namespace=""/> 當前模組的快取去引用其他模組的快取【使用者模組的查詢快取放入部門模組的查詢快取中】 由於使用者和部門關聯,共享快取,首先兩模組的查詢快取放在一起 DepartMapper 下,無論使用者或者部門做增刪改,都會將 departMapper 下的快取清空,進而關聯的使用者快取也一併清空;