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