系統優化總結(2)----構建兩級緩存

經過不斷的性能優化,現在的系統已經可以承受千萬級別的日訪問量,其響應速度和吞吐量都有了明顯的提升,其中緩存發揮了重大作用。結合業務需要,目前系統已構建起了兩級緩存:分佈式緩存Redis和本地緩存Ehcache.下面談談緩存應用的一些體會。

一、分佈式緩存Redis

1.充分應用redis提供的數據結構
同是緩存,Redis相比memcache一個很大的優勢就是其豐富的數據結構爲一些應用功能的開發和優化提供了極大的便利,比如在我們的系統中,用戶每日總分、文章瀏覽量的等統計使用的都是redis計數器(其底層數據結構是String),避免了計數操作與數據庫的頻繁互動,有效減輕了數據庫的壓力。還有使用bitmap來統計活躍用戶也是方便快捷,代碼量大大減少等等。
曾在網上看到這樣一句話:限制Redis用途的只會是你自己的想象力,一語中的,redis不僅僅是key-value。多研究一下redis的數據結構和應用場景對開發實在是大有裨益!

2.不要使用太長的key
這一點主要目的是節約內存。常見的一種場景是key命名缺乏統一規範,爲了避免衝突,每個開發者各行其是,命名普遍很長,會消耗大量內存。我們的解決方案是爲key進行唯一性編碼,所有的開發者遵守一套簡單的命名規範就可以實現key的長度大大減少。

3.儘量使用Hash
有兩個好處:一是減少key的數量,二是redis的hashmap在成員數量小於一定數值時(具體值可以自己設置)會採用線性緊湊格式存儲。可以很好的節約內存的使用

4.禁止遍歷緩存
很多人有這樣一種錯覺:既然從緩存取一條數據挺快,那麼遍歷一下應該也不會太慢。事實卻是慢的超乎你想象,同時還會影響其他redis操作。

5.爲每個key設置過期時間
根據業務要求的不同爲每個key設置不同的過期時間有利於及時消除不必要數據的存在,避免“殭屍數據”佔用內存,造成浪費。另外具體時間的設置一定要合理,不要太長,明明只需要存活一天卻設置爲一週,也是不合適的,在我們之前的開發中就發現過沒有給key設置過期時間和時間設置不合理的情況。

6.較大的數據先壓縮再存儲
在我們的系統,文章內容的數據量還是比較大的,如果直接存在redis中必然消耗大量內存,而先進行壓縮再存儲則可以大大減少文章的數據大小。

7.使用bit位級別操作和byte字節級別操作來減少不必要的內存使用
比如使用bitset來記錄簽到用戶,判斷用戶今天是否已簽到。與使用數據庫記錄查詢相比,性能大有提升。

8.Redis狀態監控
通過redis的監控可以實時瞭解Redis的運行狀態,以便於及時瞭解分析Redis服務器的性能,命中率等運行情況,比如當內存超過一定閥值及時預警機制,就可以避免內存不足造成的OOM問題,提升Redis的高可用。我們這裏採用的是zabbix可視化監控。

二、本地緩存Ehcache

Redis緩存存取數據的時間大部分消耗在了網絡開銷上,而使用本地緩存,則可以避免網絡開銷。實際應用發現同樣大小的數據,本地緩存Ehcache的存取速度遠勝Redis。系統中諸如文章、黑名單等相對穩定數據都使用了ehchache,性能提升明顯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章