一分鐘之聊聊緩存寫策略
通常來(lái)說(shuō),當(dāng)系統(tǒng)寫數(shù)據(jù)到緩存的時(shí)候,在某個(gè)時(shí)點(diǎn)也需要更新緩存后端的數(shù)據(jù)庫(kù)。究竟在哪個(gè)時(shí)點(diǎn)更新后端數(shù)據(jù)庫(kù),是由緩存寫策略來(lái)控制。
緩存寫策略,主要包含兩個(gè)基礎(chǔ)方法,Write-through和Write-behind。
Write-through,寫數(shù)據(jù)到緩存和寫數(shù)據(jù)到數(shù)據(jù)庫(kù)是同步的。如果寫數(shù)據(jù)***緩存,那么可以先刷新緩存,然后再寫數(shù)據(jù)庫(kù)。如果寫數(shù)據(jù)庫(kù)不***緩存,這個(gè)時(shí)候是可以直接寫數(shù)據(jù)庫(kù)了。等到讀的時(shí)候,如果不***緩存,再?gòu)臄?shù)據(jù)庫(kù)中取數(shù)據(jù)緩存起來(lái)。
Write-behind,延后寫數(shù)據(jù)到數(shù)據(jù)庫(kù)。其中一種實(shí)現(xiàn)方法是異步寫數(shù)據(jù)到數(shù)據(jù)庫(kù)。首先寫數(shù)據(jù)到緩存,然后發(fā)布一個(gè)寫事件到消息隊(duì)列,此時(shí)即可響應(yīng)客戶端了。消息隊(duì)列的消費(fèi)者處理寫事件,將數(shù)據(jù)寫到數(shù)據(jù)庫(kù)中。Write-behind如果對(duì)于頻繁的數(shù)據(jù)寫表操作,是能提高寫性能的。當(dāng)然如果在寫緩存成功,但寫事件發(fā)布成功前,緩存 server 宕機(jī)了,也是有可能數(shù)據(jù)丟失了。
大多數(shù)的系統(tǒng)都是讀多寫少,所以Write-through策略應(yīng)用相當(dāng)廣泛,就如spring cache 中的CachePut 注解作用。Ehcache緩存支持這兩種策略。
***提出這樣一個(gè)場(chǎng)景,需要從數(shù)據(jù)庫(kù)中,取一些數(shù)據(jù)(數(shù)據(jù)會(huì)不定時(shí)改變,相當(dāng)頻繁),然后做一些復(fù)雜耗時(shí)的計(jì)算,再將結(jié)果最終保存到數(shù)據(jù)庫(kù)中,這個(gè)時(shí)候我們?cè)撊绾巫鼍彺妫?/p>