【延迟双删】简单解析

使用场景:【高并发】情况下的做【更新操作】
什么是延迟双删
简单来说:怕你更新的时候,来个请求,又把旧数据更新(redis)上去了,所以二次删除。延迟双删


首次删除:当需要更新某个数据项时,首先删除缓存中的该项。
更新数据库:接着,更新数据库中的该项。
短暂延迟:然后等待一段很短的时间(例如50毫秒),这段时间允许任何正在进行的读操作完成。
二次删除:最后,再次删除缓存中的该项。这样做的目的是防止在这段延迟期间有任何读操作将旧数据重新写入了缓存。


1:为什么延迟?:
短暂的等待时间(延迟)是为了确保所有可能的读取请求都已完成,避免旧的数据被再次写入缓存。

2:为什么要进行再次删除(二次删除)?:
  在延迟期间,如果有其他请求读取了数据库中的旧值并将其重新写回到缓存中,那么即使你已经更新了数据库,缓存中仍然可能存在旧数据。
  第二次删除确保在延迟结束后,无论是否有其他请求重新填充了缓存,都会再次清理掉这些可能存在的旧数据,从而保证缓存和数据库的一致性。

3:延迟的时间多少为宜?:
一次请求的时间。
视具体代码复杂度,约为1-3S.因为大部分请求只有几百毫秒或更少,所以1-3秒已经相当宽裕了

简单例子:
           // 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");
不做延迟双删会带来的问题:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值