服務器減壓,你不得不知的緩存使用技巧。
為什么使用緩存
一般情況下,在訪問量達到一定規模后,數據庫的讀寫會成為一個瓶頸,我們會采用一些手段來對數據庫減壓,讓它可以正常的工作。可以考慮的手段包括讀寫分離、添加緩存服務器等,讀寫分離是為了盡量將對數據庫的讀寫動作分開,減少互相之間的影響;添加緩存是為了讀庫的時候,減少直接讀取數據庫的動作,將查詢的結果存放在緩存中,用戶的請求被隔絕在數據庫以外,從而減少數據庫的壓力。
這是一個理想狀況下緩存工作的方式,但僅僅是理想
如何使用緩存技巧為服務器減壓
如何使用緩存技巧為服務器減壓
如何使用緩存技巧為服務器減壓
如何使用緩存技巧為服務器減壓
緩存穿透
所謂緩存穿透,是說用戶請求在緩存系統中查找結果時候失效,接下來去后端存儲系統中查找數據,這個時候,如果數據不存在,而且這個訪問也比較大的情況下,大量的訪問會直接命中數據庫,這時候負責存儲的服務器就悲劇了(如果左圖),所以我們就需要做一些努力,使得當數據不存在,往緩存中寫入一個標志抑或將空的查詢結果存入緩存,減少這種無用的請求頻繁命中數據庫的情況(如右圖)
如何使用緩存技巧為服務器減壓
如何使用緩存技巧為服務器減壓
也可以將確認為空或者空的查詢結果存儲到單獨的緩存區域中。
緩存雪崩
這是另外一個問題,當系統使用的緩存發生意外(網絡失敗、宕機、服務掛掉、緩存集體丟失等等)之后,緩存集體失效,導致短時間內請求都到達數據庫(數據存儲層),使得數據庫壓力山大進而crash掉。
為了預防這種情況,我們采用一下幾種方式:
1、我們采用多實例的方式來保證緩存的高可用性,盡量避免當個別實例出現問題之后,引起全局緩存的問題。這類方案很多,比如memcache的一致性hash,redis的cluster機制,來避免單點的故障,這類資料可以搜索一下關于redis或者memcache的高可用方案。
2、降級機制。這個方法在很多高可用設計中可能也有描述,簡單一點說就是我們將用戶與用戶之間,資源與資源之間進行隔離,當某一部分數據產生問題之后或者對某一部分的請求到達一個閥值之后,根據預設的機制,對請求只返回熱點數據,保證客戶端不會產生天窗或者說一直無法響應的問題。
3、加鎖。對于到達的請求,我們用鎖的機制,來盡量使它們排隊處理從而減少對數據庫產生并發。可以參考的鎖方案有兩種,一種是使用全局鎖或者字符串鎖等方案,是一個請求進行操作的時候,其他的請求處于等待狀態,當這個請求處理完畢之后進行下一步的業務處理,但是這樣的話如果一個請求掛掉,會對后面排隊的請求產生影響,而且請求的處理可能不會短時間處理完畢,會導致請求阻塞的時間過長等問題,第二種方案就是在進行操作的時候,其他請求進來的時候判斷是否有鎖存在,如果存在直接跳過處理,返回熱點數據。
如何使用緩存技巧為服務器減壓
需要說的是降級機制未必要放到圖中這個位置,也可以放在緩存之前或其他的位置,它的主要目的是當出現問題時候隔離掉出現問題的資源不影響客戶端的內容或者使一部分用戶的請求無法到達真正的業務邏輯從而減少業務處理的壓力。
新聞熱點
疑難解答