快取資料的步驟
查詢快取,如果沒有資料,則查詢資料庫
查詢資料庫,如果資料不為空,將結果寫入快取
快取資料容易造成如下問題:
快取穿透、快取擊穿、快取失效
快取穿透
什麼叫快取穿透?
一般的快取系統,都是按照key去快取查詢,如果不存在對應的value,就應該去後端系統查詢(比如db)。如果key對應的value是一定不存在的,並且對該key併發請求量很大,就會對後端系統造成很大的壓力。這就叫做快取穿透。
如何解決?
1、對查詢結果為空的情況也進行快取,快取時間設定短一點,或者該key對應的資料insert了之後清理快取。
2、對一定不存在的key進行過濾。可以把所有的可能存在的key放到乙個大的bitmap中,查詢時通過該bitmap過濾。(布隆表示式)
快取雪崩(多個key)
什麼叫快取雪崩?
當快取伺服器重啟或者大量快取集中在某乙個時間段失效,這樣在失效的時候,也會給後端系統(比如db)帶來很大壓力。
如何解決?
1、在快取失效後,通過加鎖或者佇列來控制讀資料庫寫快取的執行緒數量。比如對某個key只允許乙個執行緒查詢資料和寫快取,其他執行緒等待。
2、不同的key,設定不同的過期時間,讓快取失效的時間點盡量均勻。
3、做二級快取,a1為原始快取,a2為拷貝快取,a1失效時,可以訪問a2,a1快取失效時間設定為短期,a2設定為長期(此點未補充)
快取擊穿(乙個key)
什麼叫快取擊穿?
對於一些設定了過期時間的key,如果這些key可能會在某些時間點被超高併發地訪問,是一種非常「熱點」的資料。這個時候,需要考慮乙個問題:快取被「擊穿」的問題,這個和快取雪崩的區別在於這裡針對某一key快取,前者則是很多key。
快取在某個時間點過期的時候,恰好在這個時間點對這個key有大量的併發請求過來,這些請求發現快取過期一般都會從後端db載入資料並回設到快取,這個時候大併發的請求可能會瞬間把後端db壓垮。
如何解決?
使用redis的setnx互斥鎖先進行判斷,這樣其他執行緒就處於等待狀態,保證不會有大併發操作去運算元據庫。
if(redis.***nx()==1)
REDIS實現資料快取
注意 使用的map必須是string,string型別的,意味著如果使用map儲存user和userid,userid作為key,物件作為value,那麼物件在進入map之前需要使用fastjson進行object到json的轉換。tips jedis.sadd key value 建立乙個list...
redis讀取不到資料 Redis快取機制介紹
redis是一款高效能的記憶體型鍵值對 key value 資料庫,是大型 和幾乎所有高併發場景必備的中介軟體,主要用於快取熱點資料,從而大大減輕了後端資料庫的請求壓力,但是因為redis把所有資料都儲存在記憶體中,所以,在把redis用做快取的過程中,常常會遇到以下的一些問題,例如快取更新 快取雪...
redis資料庫快取
使用redis作為快取,資料還需要存入資料庫中嗎?我的答案是 1redis只是快取,不是資料庫如mysql,所以redis中有的資料庫,mysql中一定有。2使用者請求先去請求redis,如果沒有,再去資料庫中去讀取。3redis中快取一些請求量比較大的資料 這些快取資料,mysql中一定也是有的 ...