您好,登錄后才能下訂單哦!
這篇文章主要介紹億級系統的Redis緩存怎么設計,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
首先,先了解緩存知識圖譜
早期的緩存用于加速CPU數據交換的RAM。隨著互聯網的快速發展,緩存的應用更加寬泛,用于數據高速交換的存儲介質都稱之為緩存。
使用緩存時,我們要關注哪些指標?緩存有哪些應用模式?以及緩存設計時有哪些Tip技巧?一圖勝千言,如下:
七大經典問題
緩存在使用過程不可避免會遇到一些問題,對于高頻的問題我們大概歸為了7類。具體內容下面我們一一道來
1、緩存集中失效
當業務系統查詢數據時,首先會查詢緩存,如果緩存中數據不存在,然后查詢DB再將數據預熱到Cache中,并返回。緩存的性能比 DB 高 50~100 倍以上。
很多業務場景,如:秒殺商品、微博熱搜排行、或者一些活動數據,都是通過跑任務方式,將DB數據批量、集中預熱到緩存中,緩存數據有著近乎相同的過期時間。
當過這批數據過期時,會一起過期,此時,對這批數據的所有請求,都會出現緩存失效,從而將壓力轉嫁到DB,DB的請求量激增,壓力變大,響應開始變慢。
那么有沒有解呢?
當然有了。
我們可以從緩存的過期時間入口,將原來的固定過期時間,調整為過期時間=基礎時間+隨機時間,讓緩存慢慢過期,避免瞬間全部過期,對DB產生過大壓力。
2、緩存穿透
不是所有的請求都能查到數據,不論是從緩存中還是DB中。
假如黑客攻擊了一個論壇,用了一堆肉雞訪問一個不存的帖子id。按照常規思路,每次都會先查緩存,緩存中沒有,接著又查DB,同樣也沒有,此時不會預熱到Cache中,導致每次查詢,都會cache miss。
由于DB的吞吐性能較差,會嚴重影響系統的性能,甚至影響正常用戶的訪問。
解決方案:
方案一:查存DB 時,如果數據不存在,預熱一個特殊空值到緩存中。這樣,后續查詢都會命中緩存,但是要對特殊值,解析處理。
方案二:構造一個BloomFilter過濾器,初始化全量數據,當接到請求時,在BloomFilter中判斷這個key是否存在,如果不存在,直接返回即可,無需再查詢緩存和DB
3、緩存雪崩
緩存雪崩是指部分緩存節點不可用,進而導致整個緩存體系甚至服務系統不可用的情況。
分布式緩存設計一般選擇一致性Hash,當有部分節點異常時,采用 rehash 策略,即把異常節點請求平均分散到其他緩存節點。但是,當較大的流量洪峰到來時,如果大流量 key 比較集中,正好在某 1~2 個緩存節點,很容易將這些緩存節點的內存、網卡過載,緩存節點異常 Crash,然后這些異常節點下線,這些大流量 key 請求又被 rehash 到其他緩存節點,進而導致其他緩存節點也被過載 Crash,緩存異常持續擴散,最終導致整個緩存體系異常,無法對外提供服務。
解決方案:
方案一:增加實時監控,及時預警。通過機器替換、各種故障自動轉移策略,快速恢復緩存對外的服務能力
方案二:緩存增加多個副本,當緩存異常時,再讀取其他緩存副本。為了保證副本的可用性,盡量將多個緩存副本部署在不同機架上,降低風險。
4、緩存熱點
對于突發事件,大量用戶同時去訪問熱點信息,這個突發熱點信息所在的緩存節點就很容易出現過載和卡頓現象,甚至 Crash,我們稱之為緩存熱點。
這個在新浪微博經常遇到,某大V明星出軌、結婚、離婚,瞬間引發數百千萬的吃瓜群眾圍觀,訪問同一個key,流量集中打在一個緩存節點機器,很容易打爆網卡、帶寬、CPU的上限,最終導致緩存不可用。
解決方案:
首先能先找到這個熱key來,比如通過Spark實時流分析,及時發現新的熱點key。
將集中化流量打散,避免一個緩存節點過載。由于只有一個key,我們可以在key的后面拼上有序編號,比如key#01、key#02。。。key#10多個副本,這些加工后的key位于多個緩存節點上。
每次請求時,客戶端隨機訪問一個即可
可以設計一個緩存服務治理管理后臺,實時監控緩存的SLA,并打通分布式配置中心,對于一些hot key可以快速、動態擴容。
5、緩存大Key
當訪問緩存時,如果key對應的value過大,讀寫、加載很容易超時,容易引發網絡擁堵。另外緩存的字段較多時,每個字段的變更都會引發緩存數據的變更,頻繁的讀寫,導致慢查詢。如果大key過期被緩存淘汰失效,預熱數據要花費較多的時間,也會導致慢查詢。
所以我們在設計緩存的時候,要注意緩存的粒度,既不能過大,如果過大很容易導致網絡擁堵;也不能過小,如果太小,查詢頻率會很高,每次請求都要查詢多次。
解決方案:
方案一:設置一個閾值,當value的長度超過閾值時,對內容啟動壓縮,降低kv的大小
方案二:評估大key所占的比例,由于很多框架采用池化技術,如:Memcache,可以預先分配大對象空間。真正業務請求時,直接拿來即用。
方案三:顆粒劃分,將大key拆分為多個小key,獨立維護,成本會降低不少
方案四:大key要設置合理的過期時間,盡量不淘汰那些大key
6、緩存數據一致性
緩存是用來加速的,一般不會持久化儲存。所以,一份數據通常會存在DB和緩存中,由此會帶來一個問題,如何保證這兩者的數據一致性。另外,緩存熱點問題會引入多個副本備份,也可能會發生不一致現象。
解決方案:
方案一:當緩存更新失敗后,進行重試,如果重試失敗,將失敗的key寫入MQ消息隊列,通過異步任務補償緩存,保證數據的一致性。
方案二:設置一個較短的過期時間,通過自修復的方式,在緩存過期后,緩存重新加載最新的數據
7、數據并發競爭預熱
互聯網系統典型的特點就是流量大,一旦緩存中的數據過期、或因某些原因被刪除等,導致緩存中的數據為空,大量的并發線程請求(查詢同一個key)就會一起并發查詢數據庫,數據庫的壓力陡然增加。
如果請求量非常大,全部壓在數據庫,可能把數據庫壓垮,進而導致整個系統的服務不可用。
解決方案:
方案一:引入一把全局鎖,當緩存未命中時,先嘗試獲取全局鎖,如果拿到鎖,才有資格去查詢DB,并將數據預熱到緩存中。雖然,client端發起的請求非常多,但是由于拿不到鎖,只能處于等待狀態,當緩存中的數據預熱成功后,再從緩存中獲取
為了便于理解,簡單畫了個流程圖。這里面特別注意一個點,由于有一個并發時間差,所以會有一個二次check緩存是否有值的校驗,防止緩存預熱重復覆蓋。
方案二:緩存數據創建多個備份,當一個過期失效后,可以訪問其他備份。
緩存設計時,有很多技巧,優化手段也是千變萬化,但是我們要抓住核心要素。那就是,讓訪問盡量命中緩存,同時保持數據的一致性。
粉絲提問,分割線-----------
4年Java開發經驗,面試經常被問到高并發、性能調優方面的問題,該怎么辦?
無論是618、雙十一以及雙十二都是離不開高并發的。 當然不同量級的系統也會有不同的問題,畢竟誰都不是淘寶,對吧,同樣的,針對不同的需求以及業務場景,也就會有對架構設計的不同需求。同樣的, 高并發系統的演進也不是一步到位的,它是循序漸進,不斷改進的,像幾年前,雙十一卡崩,無法付款無法選擇地址的事情每年都會發生,但是今年的情況是不是好一些呢?就是在這些不斷地改進過程中,以解決系統中存在的問題為目的和驅動力的系統設計得以進行,而阿里,正是在這方面的最佳實踐者。 有人可能會說,他們有服務器啊(要不把你程序放在他們服務器上抵抗億級并發的沖擊試試?)
阿里作為國內互聯網行業的老大哥,也正是考慮到這一點,不是所有人都能投入那么多的資金,所以對于系統優化部分,也是不遺余力 。經過多年的歷練,阿里也慢慢總結形成一套他們內部的開發筆記——《阿里P9純手打億級高并發系統設計手冊》
這份筆記分為基礎篇、數據庫篇、緩存篇、消息隊列篇、分布式服務篇、維護篇、實戰篇,下面小編就以截圖的方式帶大家看看, 如果有需要完整版本的朋友們,可以 點擊此處 憑截圖免費獲取
基礎篇
如何讓系統易于擴展
數據庫篇
在高并發場景下,數據庫和NoSQL如何做到互補
緩存篇
緩存穿透了怎么辦
消息隊列篇
如何降低消息隊列系統中的消息延遲
分布式服務篇
分布式系統如何尋址
維護篇
如何屏蔽非核心系統故障操縱流量
實戰篇
50萬QPS下如何設計未讀數系統
最后
在這個電商的時代,如何運用自如的使用高并發秒殺系統,提升秒殺的性能,只有系統穩定了,無論是低峰、高峰的流量都是可以控制住的。
以上是“億級系統的Redis緩存怎么設計”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。