第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

redis 失效的key造成的問(wèn)題

redis 失效的key造成的問(wèn)題

PHP
猛跑小豬 2019-03-15 06:36:25
是這樣得 //這里面執(zhí)行判斷是否存在緩存 $res = redis -> get("xxx"); if($res != null){ //返回緩存結(jié)果 return $res;//緩存返回 } $res = db -> query("select * ...")//假設(shè)這句要3秒 redis -> setex("xxx",3600,$res)//保存到緩存,3600時(shí)間 //返回查詢(xún)結(jié)果 return $res; 大概意思是這樣的,就是我先從緩存取,沒(méi)有就從數(shù)據(jù)庫(kù)取,且存到緩存中,方便下次再去取。 但是問(wèn)題就來(lái)了,假設(shè)我有千萬(wàn)并發(fā),xxx 這個(gè)key存在3600,3600時(shí)間后自動(dòng)銷(xiāo)毀,必須得重新從數(shù)據(jù)庫(kù)獲取,而這句sql要3秒,3秒鐘并發(fā)了幾千萬(wàn),就是查了幾千萬(wàn)次數(shù)據(jù)庫(kù),必須得第一條成功緩存下來(lái),后續(xù)的才不會(huì)跳過(guò)緩存返回那句,但這期間3秒?yún)s足以使服務(wù)器垮了,我想問(wèn)的是怎樣才能只訪問(wèn)一次數(shù)據(jù)庫(kù),其他那幾千萬(wàn)訪問(wèn)都是從緩存取。
查看完整描述

8 回答

?
蠱毒傳說(shuō)

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超3個(gè)贊

補(bǔ)充:

緩存被“擊穿”問(wèn)題(以前看過(guò)一篇文章的做法,你可以借鑒一下):
業(yè)界比較常用的做法,是使用mutex。簡(jiǎn)單地來(lái)說(shuō),就是在緩存失效的時(shí)候(判斷拿出來(lái)的值為空),不是立即去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緩存的方法。類(lèi)似下面的代碼:

?public?String?get(key)?{
??????String?value?=?redis.get(key);
??????if?(value?==?null)?{?//代表緩存值過(guò)期
??????????//設(shè)置3min的超時(shí),防止del操作失敗的時(shí)候,下次緩存過(guò)期一直不能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);
??????????????}?else?{??//這個(gè)時(shí)候代表同時(shí)候的其他線程已經(jīng)load?db并回設(shè)到緩存了,這時(shí)候重試獲取緩存值即可
??????????????????????sleep(50);
??????????????????????get(key);??//重試
??????????????}
??????????}?else?{
??????????????return?value;??????
??????????}
??}
查看完整回答
反對(duì) 回復(fù) 2019-03-18
?
LEATH

TA貢獻(xiàn)1936條經(jīng)驗(yàn) 獲得超7個(gè)贊

你這個(gè)問(wèn)題就是比較經(jīng)典的緩存穿透問(wèn)題了,可以考慮兩個(gè)方法
1.該key永不過(guò)期,寫(xiě)個(gè)定時(shí)腳本定期刷新結(jié)果,寫(xiě)入該key
2.或者加個(gè)訪問(wèn)鎖。緩存更新期間的時(shí)候,set(lock, 1),然后其他請(qǐng)求發(fā)現(xiàn)lock=1,給個(gè)友好提示什么的,更新成功后,lock置為0。大原則上,寧愿用戶(hù)體驗(yàn)差一些,也不能因?yàn)榫彺娲┩秆┍缹?dǎo)致宕機(jī)。

查看完整回答
反對(duì) 回復(fù) 2019-03-18
?
蝴蝶不菲

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊

腳本離線去刷緩存

查看完整回答
反對(duì) 回復(fù) 2019-03-18
?
波斯汪

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超4個(gè)贊

3600秒自動(dòng)銷(xiāo)毀,你可以在3500秒的時(shí)候重新生成緩存,在緩存失效前刷新緩存。

查看完整回答
反對(duì) 回復(fù) 2019-03-18
?
慕容3067478

TA貢獻(xiàn)1773條經(jīng)驗(yàn) 獲得超3個(gè)贊

并發(fā)導(dǎo)致的問(wèn)題,首先考慮鎖的機(jī)制來(lái)解決問(wèn)題,可以使用redis 的setnx實(shí)現(xiàn)鎖的,保證每次只有一個(gè)請(qǐng)求load數(shù)據(jù),數(shù)據(jù)更新完,進(jìn)行解鎖

查看完整回答
反對(duì) 回復(fù) 2019-03-18
?
慕容森

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超18個(gè)贊

可以嘗試Gearman

查看完整回答
反對(duì) 回復(fù) 2019-03-18
  • 8 回答
  • 0 關(guān)注
  • 1380 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)