缓存与数据库一致性保证
2018-07-27 本文已影响13人
没睡醒的鱼
为什么会数据不一致
写流程:
- 先淘汰cache
- 再写入数据库
读流程:
- 先读cache,如果数据命中则返回
- 如果数据未命中则读数据库
- 将数据库中读取出来的数据入缓存
但是会发生以下情况导致不一致:
- 发生了写请求A,A的第一步淘汰了cache
- A的第二步写数据库,发出修改请求
- 发生了读请求B,B的第一步读取cache,发现cache中是空的
- B的第二步读取数据库,如果读操作B发生在写操作A之前,就会读出了一个脏数据放入cache
优化解决方案
以项目中的商品库存为例,如果数据库中产品的库存是100,那么查询到的库存是100,然后插入缓存,插入完缓存后,原来那个更新数据库的线程把数据库更新为了99,导致数据库与缓存不一致的情况
针对上面的场景:创建一个队列,当有写请求时,先把它丢到队列里去,当写请求完后在从队列里去除。如果在写的过程中,遇到了上述场景,先去缓存里看下有没有数据,如果没有,再去看看队列中看看相应的写请求没有完成,如果没有完成就把查询请求放到相同的队列中,直到写请求完成后才执行查询操作
补充
对于缓存和数据库不一致的情况,可以先清除缓存,第一个数据库查询请求到达数据库,将读取到的值更新到缓存,这样缓存与数据库就是一致的