一、緩存特點
1.什么是緩存(cache)
定義:就是計算機內存中的一段數據
2.內存中數據的特點
- 讀寫快
- 斷點立即丟失
3.redis緩存解決了什么問題
- 提高了網站吞吐量,提高網站運行效率。
- 核心解決問題:緩存的存在時用來減輕后端數據庫的訪問壓力
4.既然緩存能提高效率,那項目中所有數據加入緩存豈不是更好?
注意:使用緩存時一定是數據庫中極少發生修改,更多用于查詢這種情況的,否則會引起頻繁數據庫和redis的更新,導致性能更差。
5.本地緩存和分布式緩存的區別?
- 本地緩存:存在應用服務器內存中的數據為本地緩存(local cache)
- 分布式緩存:存儲在當前應用服務器內存之外的數據為分布式緩存(distribute cache)
集群:將同一種服務的多個節點放在一起共同對系統提供服務過程稱之為集群。
分布式:有多個不同服務集群共同對系統系統提供服務這個系統稱之為分布式系統(distribute system),即分布式是建立在集群之上的。
二、緩存優化策略
1.對放入redis中的可以進行優化:key的長度不能太長
盡可能將key設計的簡潔一些,如果key太長可以考慮將key設計成md5碼保存。
三、如何解決Redis的緩存穿透、緩存雪崩和緩存擊穿
redis的緩存穿透
緩存穿透,是指查詢一個數據庫不存在的數據。
例如數據庫中沒有id=-1的數據,這時如果外界瘋狂查id=-1這個數據,先查詢redis沒有這個數據,再查詢數據庫也不存在這個數據即返回空,因此一直重復這個步驟,導致數據庫壓力過大,而出現宕機。
解決方案:
- 對不存在的數據緩存到redis中,設置key,value值為null(不管是數據未null還是系統bug問題),并設置一個短期過期時間段,避免過期時間過長影響正常用戶使用。
- 拉黑該IP地址
- 布隆過濾器 將所有可能存在的數據哈希到一個足夠大的bitmap(位圖)中,一個一定不存在的數據會被 這個bitmap攔截掉,從而避免了對底層存儲系統的查詢壓力。
redis的緩存擊穿
某一個熱點key,在不停地扛著高并發,當這個熱點key在失效的一瞬間,持續的高并發訪問就擊破緩存直接訪問數據庫,導致數據庫宕機。
解決方案:
- 設置熱點數據"永不過期"
- 加上互斥鎖:上面的現象是多個線程同時去查詢數據庫的這條數據,那么我們可以在第一個查詢數據的請求上使用一個互斥鎖來鎖住它,其他的線程走到這一步拿不到鎖就等著,等第一個線程查詢到了數據,然后將數據放到redis緩存起來。后面的線程進來發現已經有緩存了,就直接走緩存
redis的雪崩
在高并發下,大量緩存key在同一時間失效,大量請求直接落在數據庫上,導致數據庫宕機。
解決方案:
- 這種情況,我們一般是采取不同分類商品,緩存不同周期,在同一分類中的商品,加上一個隨機因子,這樣盡可能分散緩存過期時間,而且,熱門類目的商品緩存時間長一些,冷門類目的商品緩存時間短一些,也能節省緩存服務的資源。
- 緩存永久存儲(不推薦)。
- 若是集群部署,可將熱點數據均勻分布在不同的Redis庫中也能夠避免key全部失效問題。
————————————————
版權聲明:本文為CSDN博主「豆豆不是逗逗」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接://blog.csdn.net/qq_18290431/article/details/115266804