绝大多数互联网系统,都使用 MySQL 加上 Redis 这对儿经典的组合来解决这个问题。 Redis 作为 MySQL 的前置缓存,可以替 MySQL 挡住绝大部分查询请求,很大程度上缓解了 MySQL 并发请求的压力。

更新缓存的最佳方式

虽然Redis支持持久化到磁盘中,还支持主从复制。但是Redis仍然是一个不可靠的存储,他在设计上天然就不保证数据的可靠性。

即使Redis一般做缓存,也需要考虑Redis的数据丢失问题。做到即使Redis发生了数据丢失,也不影响系统的数据准确性。

Read Through策略

image.png

Write Through策略

image.png

这种策略大多数情况,没有问题。但是在并发请求,有概率出现脏数据的问题。

比如,一个读请求和一个写请求

  1. 读请求,读到数据库的版本A
  2. 写请求,更新数据库的数据为版本B,更新缓存为版本B
  3. 读请求,更新缓存为版本A

Cache Aside

image.png

Cache Aside 模式在更新数据的时候,并不去尝试更新缓存,而是去删除缓存。更优一下,但是也有问题。

比如,一个读请求和一个写请求

  1. 读请求,读到数据库的版本A
  2. 写请求,更新数据库的数据为版本B,删除缓存