mysql是如今非常主流的的關系型數(shù)據(jù)庫,尤其是其InnoDB的存儲引擎,在索引汛聚,事務粟瞬,數(shù)據(jù)備份和恢復等方面有巨大的優(yōu)勢,因此也成了企業(yè)及個人開發(fā)者經(jīng)常使用的存儲方式混巧。redis是與之相對的非關系型數(shù)據(jù)庫的代表(Nosql枪向, not only sql),其支持大量連接咧党,數(shù)據(jù)存儲在內(nèi)存帶來的執(zhí)行速度快的優(yōu)勢秘蛔,已經(jīng)數(shù)據(jù)持久化保證數(shù)據(jù)不丟失等特性使得很多應用用其做為緩存。
當服務使用了mysql做數(shù)據(jù)落地和redis做數(shù)據(jù)緩存傍衡,由于兩者存在延遲深员,勢必造成數(shù)據(jù)的不一致性,下面來看一下可能出現(xiàn)的case以及解決方案蛙埂。
情景1倦畅,數(shù)據(jù)先落地redis,然后同步到mysql绣的, 這樣就存在數(shù)據(jù)刪除的時候叠赐,還沒同步到mysql,這時另一個請求來查詢數(shù)據(jù)屡江,查詢redis不存在芭概,去mysql取數(shù)據(jù),取到數(shù)據(jù)并更新到redis惩嘉,這樣就出現(xiàn)了數(shù)據(jù)不一致罢洲。
情景2,數(shù)據(jù)先落地mysql文黎,然后同步到mysql惹苗,這樣就可能出現(xiàn)刪除數(shù)據(jù),同步到redis出現(xiàn)線程死掉的情況臊诊,這時redis沒有完成同步刪掉數(shù)據(jù)鸽粉,查詢的時候命中緩存,出現(xiàn)數(shù)據(jù)不一致抓艳。
基于此触机,可以想到的解決方案如下
1,基于情景1,數(shù)據(jù)分情況處理儡首,對于實時性要求高的直接穿透到mysql片任,不使用redis進行緩存,直接操作mysql蔬胯,對于實時性要求不高的依舊可以選擇redis緩存对供,然后mysql落地的方案。
2氛濒,基于情景1产场,如果不能接受方案1,可以對數(shù)據(jù)更新進行程序內(nèi)延遲雙刪處理舞竿,刪除數(shù)據(jù)時京景,先刪除key,同步到mysql返回之后骗奖,再執(zhí)行一次刪除确徙,同時配合緩存超時來保證數(shù)據(jù)的一致性
3,基于情景2执桌,可以使用異步更新緩存的機制鄙皇,基于mysql的binlog同步更新redis(阿里的開源框架canal),熱數(shù)據(jù)可以同步到redis仰挣,減輕MySQL的壓力伴逸,更新操作直接操作MySQL。redis數(shù)據(jù)更新通過binlog來增量同步椎木,類似mysql的主從同步违柏。
以上
歡迎加QQ群:994625692(可以聊天聊地的那種)