1、mysql和redis數據讀寫不一致?
業務場景
從理論上來說,給緩存設置過期時間,是保證最終一致性的終極解決方案。這種方案下,我們可以對存入緩存的數據設置過期時間,所有的寫操作以數據庫為准,對緩存操作只是盡最大努力即可。也就是說如果數據庫寫成功,緩存更新失敗,那么只要到達過期時間,則后面的讀請求自然會從數據庫中讀取新值然后回填緩存。因此,接下來討論的思路不依賴於給緩存設置過期時間這個方案。
采用延時雙刪策略
代碼如下
public void use(String key,Object data){ redis.delKey(key); db.updateData(data); Thread.sleep(800); redis.delKey(key); }
轉化為中文描述就是
(1)先淘汰緩存
(2)再寫數據庫(這兩步和原來一樣)
(3)休眠800ms,再次淘汰緩存
這么做,可以將800ms內所造成的緩存臟數據,再次刪除。
那么,這個時間怎么確定的,具體該休眠多久呢?
針對上面的情形,讀者應該自行評估自己的項目的讀數據業務邏輯的耗時。然后寫數據的休眠時間則在讀數據業務邏輯的耗時基礎上,加幾百ms即可。這么做的目的,就是確保讀請求結束,寫請求可以刪除讀請求造成的緩存臟數據。