redis与数据库一致性

1.什么事缓存

存储在计算机上的一个原始数据复制集,便于快速访问,提高系统响应效率。


2.redis

是一个kay-value形式的NoSql缓存存储系统


3. 缓存更新策略

  • LRU/LFU/FIFO算法剔除:处理到达阀值后的缓存数据剔除
  • 超时剔除方式: 设置数据有效期,到期后缓存数据自动删除,例如redis提供的expire命令,通常使用在业务允许一段时间内缓存数据与DB数据不一致的情况下,可以为其设置过期时间,在数据过期后,读取db获取数据返回并更新缓存。
  • 主动更新/删除:应用在对于数据的一致性要求较高,需要在真实数据更新后,立即更新更新缓存数据。例如更新db操作时同步更新/删除缓存或者通过消息系统、降低缓存有效期等。


4. 数据不一致的情况

  • 更新数据后缓存更新失败
  • 更新缓存成功更新数据库失败
  • 更新数据库成功,缓存清除失败
  • 清除缓存成功,更新数据库失败 在一致性要求高的情况下,通常我们使用的方式是先清除缓存,再进行db更新,再进行缓存更新,最后是查询,查询通常情况下就是在缓存为空时写入缓存并返回,缓存命中的情况下直接返回缓存数据;此时保证数据的弱一致; 这里为什么要先清除缓存,首先清除缓存后在进行db写操作,可以避免以上几种数据不一致的情况,因为可以在第一步缓存清除失败后认为本次操作失败,此时进行查询的时候会再次读取db更新缓存,不会造成业务上的数据错误; 但是这种情况并不能避免缓存数据不一致的情况,在并发场景中,它并不安全;例如现在有A、B两个请求同时请求,A请求首先清除缓存随后B请求查询缓存为空,查询数据库,此时A请求更新数据库并更新缓存后B请求更新缓存,导致缓存与数据库不一致;只不过这种概率相对较小。可以通过定时清除缓存、有效期等方式达到最终的数据一致。

优化方案:

对缓存数据添加有效期限,对一致性要求越高,修改操作越频繁,有效期时间越短

加分布式锁,对于qps较高的场景,可以利用消息队列等处理方式,先处理缓存,后更新db,保证最终一致性

添加重试机制

对于不同业务场景,需要针对业务有不同的处理方式

参考:《深入分布式缓存》

评论区
京ICP备19006603号-1 Rick ©2018