OpenResty LuaRestyLock

2021-08-13 10:18 更新

緩存失效風(fēng)暴

看下這個(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é)。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)