這篇文章將為大家詳細(xì)講解有關(guān)如何解決redis擊穿問題,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

創(chuàng)新互聯(lián)主營電白網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,app軟件開發(fā)公司,電白h5小程序定制開發(fā)搭建,電白網(wǎng)站營銷推廣歡迎電白等地區(qū)企業(yè)咨詢
擊穿:指的是單個(gè)key在緩存中查不到,去數(shù)據(jù)庫查詢,這樣如果數(shù)據(jù)量不大或者并發(fā)不大的話是沒有什么問題的。
如果數(shù)據(jù)庫數(shù)據(jù)量大并且是高并發(fā)的情況下那么就可能會(huì)造成數(shù)據(jù)庫壓力過大而崩潰
注意:這里指的是單個(gè)key發(fā)生高并發(fā)!!!
解決方案:
1) 通過synchronized+雙重檢查機(jī)制:某個(gè)key只讓一個(gè)線程查詢,阻塞其它線程
在同步塊中,繼續(xù)判斷檢查,保證不存在,才去查DB。
例如:
private static volaite Object lockHelp=new Object();
public String getValue(String key){
String value=redis.get(key,String.class);
if(value=="null"||value==null||StringUtils.isBlank(value){
synchronized(lockHelp){
value=redis.get(key,String.class);
if(value=="null"||value==null||StringUtils.isBlank(value){
value=db.query(key);
redis.set(key,value,1000);
}
}
}
return value;
}缺點(diǎn):會(huì)阻塞其它線程
2) 設(shè)置value永不過期
這種方式可以說是最可靠的,最安全的但是占空間,內(nèi)存消耗大,并且不能保持?jǐn)?shù)據(jù)最新 這個(gè)需要根據(jù)具體的業(yè)務(wù)邏輯來做
個(gè)人覺得如果要保持?jǐn)?shù)據(jù)最新不放這么試試,僅供參考:
起個(gè)定時(shí)任務(wù)或者利用TimerTask 做定時(shí),每個(gè)一段時(shí)間多這些值進(jìn)行數(shù)據(jù)庫查詢更新一次緩存,當(dāng)然前提時(shí)不會(huì)給數(shù)據(jù)庫造成壓力過大(這個(gè)很重要)
3) 使用互斥鎖(mutex key)
業(yè)界比較常用的做法,是使用mutex。簡(jiǎn)單地來說,就是在緩存失效的時(shí)候(判斷拿出來的值為空),不是立即去load db,而是先使用緩存工具的某些帶成功操作返回值的操作(比如Redis的SETNX或者M(jìn)emcache的ADD)去set一個(gè)mutex key,當(dāng)操作返回成功時(shí),再進(jìn)行l(wèi)oad db的操作并回設(shè)緩存;否則,就重試整個(gè)get緩存的方法。
SETNX,是「SET if Not eXists」的縮寫,也就是只有不存在的時(shí)候才設(shè)置,可以利用它來實(shí)現(xiàn)鎖的效果。在redis2.6.1之前版本未實(shí)現(xiàn)setnx的過期時(shí)間,所以這里給出兩種版本代碼參考:
public String get(key) {
String value = redis.get(key);
if (value == null) { //代表緩存值過期
//設(shè)置3min的超時(shí),防止del操作失敗的時(shí)候,下次緩存過期一直不能load db
if (redis.setnx(key_mutex, 1, 3 * 60) == 1) { //代表設(shè)置成功
value = db.get(key);
redis.set(key, value, expire_secs);
redis.del(key_mutex);
return value;
} else { //這個(gè)時(shí)候代表同時(shí)候的其他線程已經(jīng)load db并回設(shè)到緩存了,這時(shí)候重試獲取緩存值即可
sleep(10);
get(key); //重試
}
} else {
return value;
}
}關(guān)于解決redis擊穿問題的方法就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
分享標(biāo)題:如何解決redis擊穿問題
瀏覽路徑:http://chinadenli.net/article32/ipscsc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、品牌網(wǎng)站設(shè)計(jì)、電子商務(wù)、響應(yīng)式網(wǎng)站、網(wǎng)頁設(shè)計(jì)公司、
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)