缓存和数据库不一致出现的原因及其解决
cache与db不一致的原因,读与写出现并发。
理论上,給cache设置过期时间,是保证最终一致性到解决方案。这种方案下,写操作以数据库为准。更新cache失败,只要到了过期时间,后面的读请求会从数据库中读取新值存入cache。不过,实际开发中只设过期时间不足以满足需求,出现3种策略。
- 先更新DB,再更新cache
- 先更新DB,再删除cache
- 先删cache,再更新DB
对于第一种策略,开发中遇到比较少,原因如下:
- 如果写比读多,读取数据跟不上cache的频繁更新,浪费性能
- 如果DB的值需要经过一系列计算写入cache,每次更新DB,都要计算再写入cache,浪费性能
后面2种策略,开发中体现以下几个场景:
- 先更新DB,再删除cache,删除cache失败
- 当删除完cache的时候,这时去更新DB,但还没有更新完,另外一个请求来查询数据,发现cache里没有,就去DB里查,再把DB旧数据存入缓存中
解决方案:
场景1
- 先删除cache,再更新DB,如果删除cache失败,就不更新DB。重试机制,删除cache。
场景2
- 利用消息队列,更新cache
DB产生新的增删改操作放入队列中,操作执行完发消息给cache,cache数据进行更新。如果中途出现查询,同步等待cache更新完成。
详细资料可以参考:https://www.cnblogs.com/rjzheng/p/9041659.html
通常做法:
写数据只写DB
更新数据,先更新DB;读数据,先读cache
cache存热点数据