快取穿透:指快取和資料庫中都沒有的資料
,導致所有的請求都打到資料庫上,然後資料庫還查不到(如null),造成資料庫短時間執行緒數被打滿而導致其他服務阻塞,最終導致線上服務不可用,這種情況一般來自黑客同學。
key-null,快取有效時間可以設定短點
快取擊穿:指快取中沒有但資料庫中有的資料
(一般是熱點資料快取時間到期),這時由於併發使用者特別多,同時讀快取沒讀到資料,又同時去資料庫去查,引起資料庫壓力瞬間增大,線上系統卡住。
設定熱點資料永遠不過期。
快取雪崩:指快取同一時間大面積的失效,快取擊穿公升級版。
根據實際業務情況,在redis中維護乙個熱點資料表,批量設為永不過期
(如top1000),並定時更新top1000資料。
加互斥鎖(mutex key)
快取資料的過期時間設定隨機,防止同一時間大量資料過期現象發生。
互斥鎖快取擊穿後,多個執行緒會同時去查詢資料庫的這條資料,那麼我們可以在第乙個查詢資料的請求上使用乙個互斥鎖來鎖住它。
其他的執行緒走到這一步拿不到鎖就等著,等第乙個執行緒查詢到了資料,然後做快取。後面的執行緒進來發現已經有快取了,就直接走快取。
一般乙個系統最大的效能瓶頸,就是資料庫的io操作。從資料庫入手也是調優價效比最高的切入點。
快取可以理解是資料庫的一道保護傘,任何請求只要能在快取中命中,都不會直接訪問資料庫。而快取的處理效能是資料庫10-100倍。
redis key的命名規範,由於redis不像資料庫表那樣有結構,其所有的資料全靠key進行索引,所以redis資料的可讀性,全依靠key。
企業中最常用的方式就是:
object: id:field
springboot 2.x 需要加比如:sku:
1314
:info
user:
1092
:password
springboot-data-redis和jedis-client
依賴 否則報錯;
@enablecaching
標註在啟動類上
@enablecaching
public
class
@cacheable
@cacheable
(value =
"emp"
,key =
"#p0"
,condition =
"#id>0" unless=
"#result eq null"
)public
employee
getbyid
(serializable id)
string emp::2
ttl:-1
cachenames
:key的字首、cachenames = 「user」, 則在redis中顯示為"user:";(可有可無)value:user後面的值,這兩個構成redis的key;
key
:指定key的字段值(可用spel表示式)
condition
:快取資料的條件;
@cacheevict
@cacheevict(cachenames = 「***x」,value = 「***x」,key = 「***」,condition = 「#***.***」)
get /skus 在controller或service中標註 @cacheable
下架了商品,則標註@cacheevict
@cacheput
【用的不多,每次都要查】@cacheput(cachenames = 「***x」,value = 「***x」,key = 「***」,condition = 「#***.***」)
每次都會執行方法就結果快取;
redis 雪崩,穿透,擊穿
雪崩 同一時間key大面積失效 多出現在定時任務重新整理時 處理方案 1,把每個key的失效時間都加乙個隨機值 2,設定熱點資料永不過期,有更新操作就更新快取 3,如果時集群,將熱點資料均勻分布在不同的redis庫仲 穿透 快取和資料庫仲都沒有的資料時,使用者不斷的發起請求 處理方案 1,在介面層增...
Redis雪崩 穿透 擊穿
1 定義 1.快取穿透是指查詢乙個一定不存在的資料,由於快取不命中,接著查詢資料庫也無法查詢出結果,2.雖然也不會寫入到快取中,但是這將會導致每個查詢都會去請求資料庫,造成快取穿透 2 解決方法 布隆過濾 1.對所有可能查詢的引數以hash形式儲存,在控制層先進行校驗,不符合則丟棄,從而避免了對底層...
Redis 穿透 擊穿 雪崩
原文 如果在請求資料時,在快取層和資料庫層都沒有找到符合條件的資料,也就是說,在快取層和資料庫層都沒有命中資料,那麼,這種情況就叫作快取穿透 既然我們知道了造成快取穿透的主要原因就是快取中不存在相應的資料,直接到資料庫查詢,資料庫返回空結果,快取中不儲存空結果。那我們就自然而然的想到了解決方案 就是...