W3Cschool
恭喜您成為首批注冊(cè)用戶(hù)
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
看下這個(gè)段偽代碼:
local value = get_from_cache(key)
if not value then
value = query_db(sql)
set_to_cache(value, timeout = 100)
end
return value
看上去沒(méi)有問(wèn)題,在單元測(cè)試情況下,也不會(huì)有異常。
但是,進(jìn)行壓力測(cè)試的時(shí)候,你會(huì)發(fā)現(xiàn),每隔 100 秒,數(shù)據(jù)庫(kù)的查詢(xún)就會(huì)出現(xiàn)一次峰值。如果你的 cache 失效時(shí)間設(shè)置的比較長(zhǎng),那么這個(gè)問(wèn)題被發(fā)現(xiàn)的機(jī)率就會(huì)降低。
為什么會(huì)出現(xiàn)峰值呢?想象一下,在 cache 失效的瞬間,如果并發(fā)請(qǐng)求有 1000 條同時(shí)到了 query_db(sql) 這個(gè)函數(shù)會(huì)怎樣?沒(méi)錯(cuò),會(huì)有 1000 個(gè)請(qǐng)求打向數(shù)據(jù)庫(kù)。這就是緩存失效瞬間引起的風(fēng)暴。它有一個(gè)英文名,叫 "dog-pile effect"。
怎么解決?自然的想法是發(fā)現(xiàn)緩存失效后,加一把鎖來(lái)控制數(shù)據(jù)庫(kù)的請(qǐng)求。具體的細(xì)節(jié),春哥在 lua-resty-lock 的文檔里面做了詳細(xì)的說(shuō)明,我就不重復(fù)了,請(qǐng)看這里。多說(shuō)一句,lua-resty-lock 庫(kù)本身已經(jīng)替你完成了 wait for lock 的過(guò)程,看代碼的時(shí)候需要注意下這個(gè)細(xì)節(jié)。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: