修改数据时 双写一致性?

来源:10-4 项目引入缓存的抽象实现_Sub_01

精慕门2479394

2023-11-08

rubin老师 有个疑问,手动实现缓存中 有关数据修改的方法 updateById removeById 都是 先修改数据库中的数据,然后再删除缓存,这个好像不能保证缓存和数据库的数据一致? 这个地方为什么不使用“延迟双删”呢

    @Override
    public boolean updateById(Serializable id, V entity) {
        int rowNum = getBaseMapper().updateById(entity);
        //根据ID来更新数据库中的数据时,同时也删除对应的缓存数据,以确保缓存与数据库保持一致
        removeCache(id);
        return rowNum == 1;
    }
        @Override
    public boolean removeById(Serializable id) {
        int rowNum = getBaseMapper().deleteById(id);
        removeCache(id);
        return rowNum == 1;
    }

比如:

  1. 线程A从数据库中删除了一条记录。
  2. 在线程A还没有来得及删除缓存之前,线程B查询这条记录。
  3. 等待线程A操作完成后尝试读取缓存,由于线程A还没有删除缓存,线程B读取到了旧的缓存数据。
  4. 线程B返回了旧的数据
  5. 线程A删除了缓存中的数据,但此时线程B及其他线程可能已经使用了旧数据。
写回答

2回答

RubinChu

2023-11-08

可以的哈,延时双删可以解决大部分的不一致场景,我们这里只要不涉及多端登录,所以没有做到那么细的力度哈,同学能想到这一点还是很棒的

0
3
精慕门2479394
回复
RubinChu
谢谢rubin老师 明白了
2023-11-09
共3条回复

精慕门2479394

提问者

2023-11-08

请问这里为什么没有使用 延迟双删 呢

0
0

SpringBoot+Vue3+Element Plus打造私人分布式存储系统

SpringBoot+Vue3+Element Plus 仿百度网盘实战

274 学习 · 346 问题

查看课程