面試題
redis 的并發(fā)競爭問題是什么辛孵?如何解決這個問題赡磅?了解 redis 事務的 CAS 方案嗎?
面試官心理分析
這個也是線上非常常見的一個問題冶匹,就是多客戶端同時并發(fā)寫一個 key,可能本來應該先到的數(shù)據(jù)后到了诽里,導致數(shù)據(jù)版本錯了飞蛹;或者是多客戶端同時獲取一個 key,修改值之后再寫回去墓懂,只要順序錯了拒贱,數(shù)據(jù)就錯了佛嬉。
而且 redis 自己就有天然解決這個問題的 CAS 類的樂觀鎖方案。
面試題剖析
某個時刻斜做,多個系統(tǒng)實例都去更新某個 key湾揽】馕铮可以基于 zookeeper 實現(xiàn)分布式鎖。每個系統(tǒng)通過 zookeeper 獲取分布式鎖戚揭,確保同一時間民晒,只能有一個系統(tǒng)實例在操作某個 key,別人都不允許讀和寫靴姿。
zookeeper-distributed-lock
你要寫入緩存的數(shù)據(jù)佛吓,都是從 mysql 里查出來的,都得寫入 mysql 中淤刃,寫入 mysql 中的時候必須保存一個時間戳谆沃,從 mysql 查出來的時候仪芒,時間戳也查出來掂名。
每次要寫之前,先判斷一下當前這個 value 的時間戳是否比緩存里的 value 的時間戳要新饺蔑。如果是的話锌介,那么可以寫猾警,否則孔祸,就不能用舊的數(shù)據(jù)覆蓋新的數(shù)據(jù)崔慧。