問題一
如果使用memcache
寫db的時候
1. 先invalidate cache 再寫db
2. 先寫db 再invaludate cache
3. update cache 然後 update db
4. update db 然後 update cache
我以為這個動作有標準做法,但是問了在亞馬和snapchat的朋友
也看了幾個tech talk 竟然答案不同,請問大家怎麼分析?
我上了一個網路課程的課,他說2是最佳解
case3 & 4 如果某一個update fail都會造成cache裡面髒數據的情況
case1:
user1 invalidate cache, while updating db(未完成)
user2 此時讀資料,cache miss,去讀資料庫,得到舊數據,
並用舊數據update cache
user1 完成db更新
此時cache存著舊數據,db新數據,cache髒數據
case2:
user1 update db (未完成)
user2 此時讀資料,在cache讀了舊資料,離開
user1 finish db and update cache
以後的user都可以讀到最新數據,只有user2讀了舊數據,但僅只一次,無傷大雅
問題二
還有一個問題,關於db consistency
如果用relational db, such as MySQL , Master Slave
write to master,
read from slave
寫到master之後(假設user update一個url link),並且invalid cache
這時候replication還沒完成,假設有5秒的延遲
這個時候如果來了一個read,cache miss
按照邏輯,這時候應該slave read , 但這時候slave data是舊的
那我的client要怎麼處理?
reddit founder 他說當初他們碰到這情況
很多slave裡面的link都是404 very bad user experience
所以他寫db的時候,同時寫到cache
https://youtu.be/cDL7ny_hvio?t=50s
但如果同時寫DB & cache 如果其中一個操作失敗了,那就造成髒數據了,不是嗎?
又如果
我採用問題一的方式 先寫db 然後invalidate cache,
write to master db , 5 sec replication time
這時候一個read進來, cache miss, read from slave取得舊數據
順便update cache
五秒後slave完成replica,但這時候也造成了數據不一致。
replication latency的問題該怎麼解決呢?
感謝