美文网首页mysql
缓存与数据库一致性保证

缓存与数据库一致性保证

作者: 没睡醒的鱼 | 来源:发表于2018-07-27 17:04 被阅读13次

    为什么会数据不一致

    写流程:

    • 先淘汰cache
    • 再写入数据库

    读流程:

    • 先读cache,如果数据命中则返回
    • 如果数据未命中则读数据库
    • 将数据库中读取出来的数据入缓存

    但是会发生以下情况导致不一致:

    • 发生了写请求A,A的第一步淘汰了cache
    • A的第二步写数据库,发出修改请求
    • 发生了读请求B,B的第一步读取cache,发现cache中是空的
    • B的第二步读取数据库,如果读操作B发生在写操作A之前,就会读出了一个脏数据放入cache

    优化解决方案

    以项目中的商品库存为例,如果数据库中产品的库存是100,那么查询到的库存是100,然后插入缓存,插入完缓存后,原来那个更新数据库的线程把数据库更新为了99,导致数据库与缓存不一致的情况

    针对上面的场景:创建一个队列,当有写请求时,先把它丢到队列里去,当写请求完后在从队列里去除。如果在写的过程中,遇到了上述场景,先去缓存里看下有没有数据,如果没有,再去看看队列中看看相应的写请求没有完成,如果没有完成就把查询请求放到相同的队列中,直到写请求完成后才执行查询操作

    补充

    对于缓存和数据库不一致的情况,可以先清除缓存,第一个数据库查询请求到达数据库,将读取到的值更新到缓存,这样缓存与数据库就是一致的

    相关文章

      网友评论

        本文标题:缓存与数据库一致性保证

        本文链接:https://www.haomeiwen.com/subject/lvsgmftx.html