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 的緩存中如何要解決關聯關系時更新緩存信息的問題【可參考文檔:MyBatis 一級緩存和二級緩存 MyBatis 緩存 Cache】
<cache-ref /> 用來將多個有關聯關系查詢緩存放在一起處理;
在 UserMapper.xml 文件中加入以下內容:
<cache-ref namespace="com.study.mapper.DepartMapper"/>
(1)關聯關系緩存處理【用來將兩個關聯關系查詢的結果緩存放在一起處理】 (2)存在關聯關系的多個模塊中,只要有一個模塊更新,就應該把有關聯的模塊緩存都清空,否則會出現臟數據情況; (3)此時不能使用<cache type=""/> 【只適合單模塊的緩存】 要使用 <cache-ref namespace=""> 標簽; <cache-ref namespace=""/> 當前模塊的緩存去引用其他模塊的緩存【用戶模塊的查詢緩存放入部門模塊的查詢緩存中】 由於用戶和部門關聯,共享緩存,首先兩模塊的查詢緩存放在一起 DepartMapper 下,無論用戶或者部門做增刪改,都會將 departMapper 下的緩存清空,進而關聯的用戶緩存也一並清空;
Redis 分布式緩存實現(三)
1. 緩存優化策略
a. 對放入 Redis 中 Key 進行優化:Key 的長度不能太長;
b. 盡可能將 Key 設計簡潔一些:
算法:MD5處理 加密
特點:(1)一切文件字符字符串等經過MD5加密處理后,都會生成32位16進制字符串;(2)不同內容文件經過MD5進行加密,加密結果一定不一致;
(3)相同內容文件多次經過MD5加密生成的結果始終一致;
推薦:在 Redis 整合 SpringBoot 過程中建議將 Key 進行 MD5 加密優化處理;
2. 面試相關概念
a. 什么是緩存穿透 擊穿
定義:客戶端查詢了一個數據庫中沒有的數據記錄,導致緩存在這種情況下無法使用,稱之為緩存穿透 緩存擊穿
MyBatis 中 Cache 解決了緩存穿透問題:將數據庫中沒有查詢到的結果也進行緩存
b. 什么是緩存雪崩
定義:在系統運行的某一時刻,突然系統中緩存全部失效,恰好在這一時刻涌來大量客戶的請求,導致所有模塊緩存無法使用,大量請求涌向數據庫導致極端情況,數據庫阻塞獲取掛起;
緩存存儲時:業務系統非常大,模塊多,業務數據不同,不同模塊在放入緩存時,都會設置一個緩存超時時間;
解決方案:1. 緩存永久存儲(不推薦) 2. 針對於不同業務數據一定要設置不同超時時間,避免同一時刻 或者 一極短時間內大量緩存失效。
目前只展示相關概念,代碼實現沒有展示出來,有問題大家一塊討論哈!