【延迟双删】简单解析
使用场景:【高并发】情况下的做【更新操作】
什么是延迟双删
首次删除:当需要更新某个数据项时,首先删除缓存中的该项。
更新数据库:接着,更新数据库中的该项。
短暂延迟:然后等待一段很短的时间(例如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");