什么是缓存?

将数据源的数据存储到内存中,快速响应请求数据的一种手段。同时缓解了对数据库频繁读写的压力。

什么是分布式缓存?

分布式缓存是一种将数据分散到不同的机器上进行存储,方便快速响应请求的一种手段。区别于以往的单机存储,将数据存储在单一的服务器上。

分布式缓存的优点是什么?

  • 提高了单机缓存的容量限制

    单机缓存受限于一台机器的硬件资源,当数据缓存量庞大时,无法满足容量要求。

  • 解决了单机缓存的单点问题

    单机缓存由于只有一台机器进行对外提供服务,一旦发生服务器故障或者程序问题,会导致无法争取提供服务,影响可用性。

  • 提高了并发性能

    单机缓存受限于硬件资源(CPU、内存等)和网络资源(带宽)等,在高并发读写情况下会成为性能瓶颈。

什么是缓存一致性问题?

一句话解释就是缓存中的数据和数据存储组件(例如数据库)之间的数据不一致问题。

如何解决缓存一致性问题?

旁路缓存模式(Cache Aside)

  • 读:先读取缓存数据,如果缓存中没有就访问数据存储,然后将获取的数据填充到缓存中,再返回。
  • 写:先更新数据存储数据,再更新(删除)缓存。
  • 优点:简单容易实现,适合读多写少的场景。
  • 缺点:写操作时,先更新数据库再更新(删除)缓存时,可能出现更新(删除)失败问题。
  • 解决方法:延时双删。先删除缓存,再更新数据库,再删除缓存。

读穿透(Read Through)

有个单独的缓存治理模块,负责缓存的数据操作。

  • 读:应用程序只与缓存进行交互,如果有数据就返回,没有数据缓存模块负责从数据存储中读取,然后写到缓存中。
  • 优点:业务职责分明
  • 缺点:系统复杂程度高,需要有个单独的缓存治理模块。

写穿透(Write Through)

  • 写:应用程序只与缓存进行交互,缓存治理模块负责缓存和数据存储的写入更新操作,两者保持一致性。
  • 优点:强一致性,适合数据一致性要求严格的场景,例如:金融交易
  • 缺点:降低写吞吐量

写回模式(Write Behind)

  • 写:应用程序只更新缓存,缓存异步的更新到数据存储中。
  • 优点:写高性能
  • 缺点:数据可能会丢失(缓存系统崩溃前未写到入DB),数据最终一致性。
  • 场景:对写性能要求高,同时容忍数据丢失的场景。

先删除缓存再更新数据库可以吗?

不可以,并发情况下可能会出现以下问题:

  1. 线程T1执行写入操作new_data,先删除缓存
  2. 线程T2请求发现没有缓存数据
  3. 线程T2读取数据库旧数据old_data
  4. 线程T2将旧数据old_data更新到缓存
  5. 线程T1更新数据库new_data