Redis最主要的用途,分為三個方面:
1.存儲數據(內存數據庫)
2.緩存(最常用)
3.消息隊列
緩存 (cache) 是計算機中的?個經典的概念。核?思路就是把?些常?的數據放到觸?可及(訪問速度更快)的地?,方便隨時讀取。
使用redis作為緩存
通常是使用redis作為數據庫的緩存(mysql),mysql這樣的關系型數據庫的速度比較慢,就可以使用redis作為mysql的緩存。
如果訪問數據庫的并發量?較?, 對于數據庫的壓?是很?的, 很容易就會使數據庫服務器宕機。
為什么并發量?了就會宕機?
服務器每次處理一個請求,一定要消耗一些硬件資源(cpu,內存,硬盤,網絡),任意一種資源的消耗超出了機器能提供的上限,機器就很容易故障了。
如何提高mysql能承擔的并發量?
1.開源:引入更多的機器,構成數據庫集群。
2.節流:引入緩存。把一些頻繁讀取的熱點數據,保存到緩存上。后續在查詢數據的時候,如果緩存中已經存在了,就不再訪問mysql了。
Redis 訪問速度? MySQL 快很多。或者說處理同?個訪問請求, Redis 消耗的系統資源?
MySQL 少很多. 因此 Redis 能?持的并發量更?.
緩存更新策略
如何知道redis中應該存儲哪些數據呢?這就涉及到redis緩存的更新策略。
定期生成
會把訪問的數據,以日志的形式記錄下來。
每隔?定的周期(?如?天/?周/?個?),?對于訪問的數據頻次進?統計。挑選出訪問頻次最?的前 N%的數據。
以搜索引擎為例,可以寫一套離線的流程,通過定時任務來觸發:
a) 完成統計熱詞的過程。
b)根據熱詞,找到搜索結果數據(廣告數據)
c)把得到緩存數據同步到緩存服務器上
d)控制這些緩存服務器自動重啟
優點:實現起來比較簡單,過程更可控,方便排查問題。
缺點:實時性不夠,如果出現一些突發性事件,有一些本來不是熱詞的內容,成了熱詞。新的熱詞就可能給后面的數據庫帶來較大的壓力。(?如春節期間, "春晚" 這樣的詞就會成為?常?頻的詞. ?平時則很少會有?搜索 "春晚".)
實時生成
實時生成的流程:
? 如果在 Redis 查到了, 就直接返回.
? 如果 Redis 中不存在, 就從數據庫查,把查到的結果同時也寫? Redis。
可這樣不停的寫redis,就會使redis的內存占用越來越多。會逐漸達到內存上限。
此時如果繼續往里插入數據,就會觸發問題。為了解決上述情況,redis就引入了“內存淘汰策略”。
主要有以下幾種:
Redis 也提供了內置的淘汰策略, 也可以供我們直接使?:
整體來說 Redis 提供的策略和我們上述介紹的通?策略是基本?致的。只不過 Redis 這?會針對 "過期key" 和 "全部 key" 做分別處理。
緩存使用注意事項
緩存預熱
緩存中的數據,定期生成不涉及“預熱”。
在實時生成時,redis服務器首次接入之后,服務器里時沒有數據的。客戶端先查詢redis,如果沒查到,就再查一次mysql,查到了之后,會把數據也寫到redis中。
此時,所有的請求都會打給mysql,隨著時間的推移,redis上的數據越積累越多,mysql承擔的壓力就逐漸減小了。
緩存預熱,就是用來解決上述問題的。
把定期生成和實時生成,結合一下。即先通過離線的方式,通過一些統計的途徑,先把熱點數據找到一批,導入到redis中。此時導入的熱點數據,就能幫mysql承擔很大的壓力了。隨著時間的推移,逐漸就使用新的熱點數據淘汰掉舊的數據。
緩存穿透
查詢到的某個key,在redis中沒有,mysql中也沒有。這個key肯定也不會被更新到redis中。如果像這樣的數據存在很多,并且還反復查詢,一樣也會給mysql帶來很大的壓力。這種情況稱為 緩存穿透。
為何會產生這樣的現象?
如何解決這種現象?
1)如果發現這個key,在redis和mysql上都不存在,仍然寫入redis中,value設置成一個非法值(比如"")
2)引入布隆過濾器,每次查詢redis/mysql之前都判定一下key是否在布隆過濾器上存在。(把所有的key都插入到布隆過濾器中)
布隆過濾器:本質上是結合了hash+bitmap,以比較小的空間開銷,比較快的時間速度,實現針對key是否存在的判定。
緩存雪崩
由于在短時間內,redis上大規模的key失效,導致緩存命中率陡然下降,并且mysql的壓力迅速上升,甚至直接宕機。
為何產生?
1)redis直接掛了。redis宕機/redis集群模式下大量節點宕機。
2)redis沒問題,但是可能之前短時間內設置了很多key給redis,并且設置的過期時間是相同的。(給redis里設置key作為緩存的時候,有時為了考慮緩存的時效性,就會設置過期時間)
如何解決?
1)加強監控報警,加強redis集群可用性的保證。
2)不給key設置過期時間/設置過期時間的時候添加隨機的因子(避免同一時刻過期)
緩存擊穿
相當于緩存雪崩的特殊情況。針對熱點 key , 突然過期了, 導致?量的請求直接訪問到數據庫上, 甚?引起數據庫宕機。熱點key訪問的頻率高,比緩存雪崩影響更大。
如何解決?
1)基于統計的?式發現熱點 key, 并設置永不過期。往往需要服務器結構做出較大的調整。
2)進行必要的服務降級,在特定的情況下適當的關閉一些不重要的功能,只保留核心功能。例如訪問數據庫的時候使用分布式鎖,限制同時請求數據庫的并發數。
以上,關于redis的緩存,希望對你有所幫助。