redis做為緩存,mysql的數據如何與redis進行同步呢?(雙寫一致性)
候選人:嗯!就說我最近做的這個項目,里面有xxxx(根據自己的簡歷上寫)的功能,需要讓數據庫與redis高度保持一致,因為要求時效性比較高。我們當時采用的讀寫鎖保證的強一致性。我們使用的是Redisson實現的讀寫鎖。在讀的時候添加共享鎖,可以保證讀讀不互斥、讀寫互斥。當我們更新數據的時候,添加排他鎖。它是讀寫、讀讀都互斥,這樣就能保證在寫數據的同時,是不會讓其他線程讀數據的,避免了臟數據。這里面需要注意的是,讀方法和寫方法上需要使用同一把鎖才行。
那這個排他鎖是如何保證讀寫、讀讀互斥的呢?
候選人:其實排他鎖底層使用的也是SETNX
,它保證了同時只能有一個線程操作鎖住的方法。
你聽說過延時雙刪嗎?為什么不用它呢?
候選人:延遲雙刪,如果是寫操作,我們先把緩存中的數據刪除,然后更新數據庫,最后再延時刪除緩存中的數據。其中,這個延時多久不太好確定。在延時的過程中,可能會出現臟數據,并不能保證強一致性,所以沒有采用它。
redis做為緩存,mysql的數據如何與redis進行同步呢?(雙寫一致性)
候選人:嗯!就說我最近做的這個項目,里面有xxxx(根據自己的簡歷上寫)的功能。數據同步可以有一定的延時(這符合大部分業務需求)。我們當時采用的阿里的Canal組件實現數據同步:不需要更改業務代碼,只需部署一個Canal服務。Canal服務把自己偽裝成mysql的一個從節點。當mysql數據更新以后,Canal會讀取binlog數據,然后再通過Canal的客戶端獲取到數據,并更新緩存即可。