缓存与数据库一致性保证

为什么会数据不一致

写流程:

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

读流程:

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

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

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

优化解决方案

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

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

补充

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容