缓存一致性问题

发布时间 2023-07-26 23:26:36作者: anpeiyong

 

  

更新

先更新缓存,再更新数据库

  存在的问题:如果缓存更新成功,但DB更新失败 -> DB回滚 && 缓存回滚

    缓存中的数据为脏数据

 

先更新数据库,再更新缓存

  存在的问题:

    

    

    线程A 与 线程B 同时操作数据A:

      线程A抢到CPU资源,更新DB =1;

      线程B抢到CPU资源,更新DB=2 && 更新缓存=2;

      线程A抢到CPU资源,更新缓存=1(脏数据)

 

先删除缓存,再更新数据库 

  存在的问题:

    

    

    

    

    

    线程A 与 线程B 同时操作数据A:

      线程A抢到CPU资源,删除缓存;

      线程B抢到CPU资源,发现缓存不存在 && 读取DB旧值=1;

      线程A抢到CPU资源,更新DB=2;

      线程B抢到CPU资源,更新缓存=1(脏数据)

 

先更新数据库,再删除缓存

  正常流程:

    

      

      线程A 和 线程B 同时操作数据A:

        线程A抢到CPU资源,查询DB=1;                        

        线程B抢到CPU资源,更新DB=2;

        线程A抢到CPU资源,更新缓存=1;        

        线程B抢到CPU资源,删除缓存;

      

  可能存在的问题(概率很小):

    

      线程A 和 线程B 同时操作数据A:

        线程A抢到CPU资源,查询DB=1;                         -- 一般读DB的速度 比 写DB速度快,很小概率 

        线程B抢到CPU资源,更新DB=2 && 删除缓存;

        线程A抢到CPU资源,更新缓存=1(脏数据)