java本地緩存


1、為什么要使用緩存

由於服務器、數據庫、網絡等資源有限,無法支撐越來越多的請求與計算量,所以將一部分數據放在緩存中,以此減小薄弱環節的計算量和請求流程。

網站中緩存的應用場景:
        1:可以緩存整個頁面的html,提高訪問響應能力;
        2:針對局部頁面元素進行緩存;
        3:對復雜數據的結果進行緩存,例如一個查詢需要結合多個數據集,然后根據這些數據集進行相應的運算,即使每個子集查詢有緩存,但還是需要額外的運算,這種情況可以考慮緩存計算后的結果。
        4:對耗時的查詢進行緩存,例如產品列表頁的查詢。
        5:和上下文相關的用戶數據,例如用戶從訂單埴寫頁進入到訂單成功頁,或者是從產品列表頁點擊詳細產品進行預訂時的訂單填寫頁,此時這兩個頁面之間都需要傳遞大量的相關數值,我們可以把所有的數值封裝在一個類中,然后通過緩存進行通信。

2、緩存的屬性

緩存有以下幾個重要屬性:

Ø  命中率:命中率指請求次數與正確返回結果次數的比例,越高越好。

    影響緩存命中率的因素:
        1:數據時實性,每個業務系統都對自己的數據有相應的要求,有些數據的實時性非常強,像每日的股票信息,這種情況如果設置了緩存,緩存的命中率會特別低。
        2:緩存粒度問題,一般來說是緩存的跨度太大,即此時的KEY值包含的條件太多,會出現緩存命中率特別低的情況。

    提高緩存命中率的方法:
        1:增大存儲介質的容量;
        2:對非常熱點的數據進行捕捉,可以采用實時更新緩存的方式來平衡緩存與實時性的問題,例如可以單獨開啟一個后台服務來定時做更新緩存的工作。
        3:調整緩存KEY值的算法,盡量保證緩存KEY的細粒度,KEY-VALUE就是很好的細粒度例子。
        4:根據業務調整緩存的過期策略。


Ø  最大元素:緩存中可以存放的元素的最大數量。

Ø  清空策略。清空策略通常有以下幾種:

n  FIFO:最先進入緩存得數據在緩存空間不夠情況下(超出最大元素限制時)會被首先清理出去

n  LFU:一直以來最少被使用的元素會被被清理掉。這就要求緩存的元素有一個hit 屬性,在緩存空間不夠得情況下,hit 值最小的將會被清出緩存。

n  LRU:最近最少使用的,緩存的元素有一個時間戳,當緩存容量滿了,而又需要騰出地方來緩存新的元素的時候,那么現有緩存元素中時間戳離當前時間最遠的元素將被清出緩存。

Ø  預熱策略

全量預熱:一開始就加載全部數據,適用於不怎么變化的數據,比如地區數據

增量預熱:查詢不到時,從數據源取出放入緩存內。

3、需要注意的問題

3.1緩存穿透

 

什么是緩存穿透?

 

一般的緩存系統,都是按照key去緩存查詢,如果不存在對應的value,就應該去后端系統查找(比如DB)。如果key對應的value是一定不存在的,並且對該key並發請求量很大,就會對后端系統造成很大的壓力。這就叫做緩存穿透。

 

如何避免?

 

1:對查詢結果為空的情況也進行緩存,緩存時間設置短一點,或者該key對應的數據insert了之后清理緩存。

2:對一定不存在的key進行過濾。可以把所有的可能存在的key放到一個大的Bitmap中,查詢時通過該bitmap過濾。【感覺應該用的不多吧】

緩存雪崩

 

3.2緩存雪崩

 

當緩存服務器重啟或者大量緩存集中在某一個時間段失效,這樣在失效的時候,也會給后端系統(比如DB)帶來很大壓力。

如何避免?

 

1:在緩存失效后,通過加鎖或者隊列來控制讀數據庫寫緩存的線程數量。比如對某個key只允許一個線程查詢數據和寫緩存,其他線程等待。

2:不同的key,設置不同的過期時間,讓緩存失效的時間點盡量均勻。

3:做二級緩存,A1為原始緩存,A2為拷貝緩存,A1失效時,可以訪問A2A1緩存失效時間設置為短期,A2設置為長期(此點為補充)

 

3.3分布式緩存系統

 

分布式緩存系統面臨的問題

 

3.3.1緩存一致性問題

 

1:緩存系統與底層數據的一致性。這點在底層系統是“可讀可寫”時,寫得尤為重要

 

2:有繼承關系的緩存之間的一致性。為了盡量提高緩存命中率,緩存也是分層:全局緩存,二級緩存。他們是存在繼承關系的。全局緩存可以有二級緩存來組成。

 

3:多個緩存副本之間的一致性。為了保證系統的高可用性,緩存系統背后往往會接兩套存儲系統(如memcacheredis等)

 

3.3.2緩存穿透和緩存雪崩

 

上面有講述。

 

3.3.3緩存數據的淘汰

 

緩存淘汰的策略有兩種: (1) 定時去清理過期的緩存。2)當有用戶請求過來時,再判斷這個請求所用到的緩存是否過期,過期的話就去底層系統得到新數據並更新緩存。

兩者各有優劣,第一種的缺點是維護大量緩存的key是比較麻煩的,第二種的缺點就是每次用戶請求過來都要判斷緩存失效,邏輯相對比較復雜,具體用哪種方案,大家可以根據自己的應用場景來權衡。

 

1. 預估失效時間 2. 版本號(必須單調遞增,時間戳是最好的選擇)3. 提供手動清理緩存的接口。

 






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM