一. 前言
上篇文章【Redis项目实战 一】缓存穿透,缓存击穿分析以及实际代码解决方案介绍了缓存穿透以及缓存击穿的应对方式。缓存更新时要注意的问题主要是缓存数据与DB中数据的一致性问题,这篇文章我们来说下缓存更新是需要注意的事项。
二. 缓存更新的常用方式以及优缺点
1.Read/Write Through模式
以缓存订单为例,在查询订单数据的时候,先去缓存中查询,如果命中缓存那就直接返回订单数据。如果没有命中,那就去数据库中查询,得到查询结果之后把订单数据写入缓存,然后返回。在更新订单数据的时候,先去更新数据库中的订单表,如果更新成功,再去更新缓存中的数据。
那么这么做有在下面两种场景在并发的情况下,有一定的概率会出现“脏数据”问题,缓存中的数据可能会被错误地更新成了旧数据。
- 并发读写:对同一条订单记录,同时产生了一个读请求和一个写请求,这两个请求被分配到两个不同的线程并行执行,读线程尝试读缓存没命中,去数据库读到了订单数据,这时候可能另外一个读线程抢先更