緩存是軟件開發中一個很是有用的概念,數據庫緩存更是在項目中必然會遇到的場景。而緩存一致性的保證,更是在面試中被反覆問到,這裏進行一下總結,針對不一樣的要求,選擇恰到好處的一致性方案。mysql
存儲的速度是有區別的。緩存就是把低速存儲的結果,臨時保存在高速存儲的技術。面試
如圖所示,金字塔更上面的存儲,能夠做爲下面存儲的緩存。咱們本次的討論,主要針對數據庫緩存場景,將以redis做爲mysql的緩存爲案例來進行。redis
存儲如mysql一般支持完整的ACID特性,由於可靠性,持久性等因素,性能廣泛不高,高併發的查詢會給mysql帶來壓力,形成數據庫系統的不穩定。同時也容易產生延遲。根據局部性原理,80%請求會落到20%的熱點數據上,在讀多寫少場景,增長一層緩存很是有助提高系統吞吐量和健壯性。sql
存儲的數據隨着時間可能會發生變化,而緩存中的數據就會不一致。具體能容忍的不一致時間,須要具體業務具體分析,可是一般的業務,都須要作到最終一致。數據庫
一般的開發模式中,都會使用mysql做爲存儲,而redis做爲緩存,加速和保護mysql。可是,當mysql數據更新以後,redis怎麼保持同步呢。緩存
強一致性同步成本過高,若是追求強一致,那麼不必用緩存了,直接用mysql便可。一般考慮的,都是最終一致性。服務器
經過key的過時時間,mysql更新時,redis不更新。 這種方式實現簡單,但不一致的時間會很長。若是讀請求很是頻繁,且過時時間比較長,則會產生不少長期的髒數據。併發
優勢:異步
不足高併發
在方案一的基礎上擴展,經過key的過時時間兜底,而且,在更新mysql時,同時更新redis。
優勢
不足
針對方案二的同步寫redis進行優化,增長消息隊列,將redis更新操做交給kafka,由消息隊列保證可靠性,再搭建一個消費服務,來異步更新redis。
優勢
不足
經過訂閱binlog來更新redis,把咱們搭建的消費服務,做爲mysql的一個slave,訂閱binlog,解析出更新內容,再更新到redis。
優勢
缺點
通常狀況,方案1夠用。若延時要求高,直接選擇方案4。若是是面試場景,從簡單講到複雜,面試官會一步一步追問,我們就一點點推導,賓主盡歡。