發表文章

目前顯示的是 8月, 2020的文章

緩存和數據庫雙寫一致性

主要內容    緩存熱點數據    為何要使用緩存    哪類數據適合緩存    緩存的利與弊    緩存和數據庫雙寫一致性    不使用更新緩存而是刪除緩存    先刪除緩存,還是先操作數據庫?    我一定要數據庫和緩存數據一致怎麼辦    實戰:先刪除緩存,再更新數據庫    實戰:先更新數據庫,再刪緩存    實戰:刪除緩存重試機制    實戰:刪除緩存重試機制    實戰:讀取binlog異步刪除緩存 緩存熱點數據    在秒殺實際的業務中,一定有很多需要做緩存的場景,比如售賣的商品,包括名稱,詳情等。訪問量很大的數據,可以算是“熱點”數據了,尤其是一些讀取量遠大於寫入量的數據,更應該被緩存,而不應該讓請求打到數據庫上。 哪類數據適合緩存    緩存量大但又不常變化的數據,比如詳情,評論等。對於那些經常變化的數據,其實並不適合緩存,一方面會增加系統的複雜性(緩存的更新,緩存臟數據),另一方面也給系統帶來一定的不穩定性(緩存系統的維護) 。 但一些極端情況下,你需要將一些會變動的數據進行緩存,比如想要頁面顯示準實時的庫存數,或者其他一些特殊業務場景。這時候你需要保證緩存不能(一直)有臟數據,這就需要再深入討論一下。 緩存的利與弊     我們到底該不該上緩存的,這其實也是個trade-off的問題。 上緩存的優點: 能夠縮短服務的響應時間,給用戶帶來更好的體驗。 能夠增大系統的吞吐量,依然能夠提升用戶體驗。 減輕數據庫的壓力,防止高峰期數據庫被壓垮,導致整個線上服務BOOM! 上了緩存,也會引入很多額外的問題: 緩存有多種選型,是內存緩存,memcached還是redis,你是否都熟悉,如果不熟悉,無疑增加了維護的難度(本來是個純潔的數據庫系統)。 緩存系統也要考慮分佈式,比如redis的分佈式緩存還會有很多坑,無疑增加了系統的複雜性。 在特殊場景下,如果對緩存的準確性有非常高的要求,就必須考慮「緩存和數據庫的一致性問題」。 緩存和數據庫雙寫一致性 說了這麼多緩存的必要性,那麼使用緩存是不是就是一個很簡單的事情了呢,我之前也一直是這麼覺得的,直到遇到了需要緩存與數據庫保持強一致的場景,才知道讓數據庫數據和緩存數據保持一致性是一門很高深的學問。 不使用更新緩存而是刪除緩存 大部分觀