使用場景:【高并發】情況下的做【更新操作】
什么是延遲雙刪
首次刪除:當需要更新某個數據項時,首先刪除緩存中的該項。
更新數據庫:接著,更新數據庫中的該項。
短暫延遲:然后等待一段很短的時間(例如50毫秒),這段時間允許任何正在進行的讀操作完成。
二次刪除:最后,再次刪除緩存中的該項。這樣做的目的是防止在這段延遲期間有任何讀操作將舊數據重新寫入了緩存。2:為什么要進行再次刪除(二次刪除):1:為什么延遲:短暫的等待時間(延遲)是為了確保所有可能的讀取請求都已完成,避免舊的數據被再次寫入緩存。
2:為什么要進行再次刪除(二次刪除):在延遲期間,如果有其他請求讀取了數據庫中的舊值并將其重新寫回到緩存中,那么即使你已經更新了數據庫,緩存中仍然可能存在舊數據。第二次刪除確保在延遲結束后,無論是否有其他請求重新填充了緩存,都會再次清理掉這些可能存在的舊數據,從而保證緩存和數據庫的一致性。簡單例子:// 1. 首次刪除緩存jedis.del("user:" + userId + ":email");// 2. 更新數據庫String sql = "UPDATE users SET email = ? WHERE id = ?";try (PreparedStatement stmt = mysqlConn.prepareStatement(sql)) {stmt.setString(1, newEmail);stmt.setInt(2, userId);stmt.executeUpdate();}// 3. 延遲一段時間(例如 50 毫秒)Thread.sleep(50);// 4. 二次刪除緩存jedis.del("user:" + userId + ":email");
不做延遲雙刪會帶來的問題:
