使用缓存通常是请求先访问缓存数据,如果存在的话就直接返回数据,如果不存在的话就会回到数据库中,读取后将数据写入到缓存中并返回数据

# 缓存穿透

请求一个数据库不存在的id值。一般先请求缓存,缓存不存在,之后命中db,db查询不到。这样缓存形同虚设,每次都请求到db。

  1. 查询不到数据设置一个空值,并设置过期时间。

  2. 对业务id进行验证,防止非法请求。

# 缓存击穿

缓存中没有数据,数据库有数据。由于并发数特别多,同时没有读取到缓存数据,导致一起去读取db,导致db压力过大。

  1. 数据永不过期,设置更新数据机制

  2. 互斥锁,只有有锁的去读。

# 缓存雪崩

大批数据缓存过期,同时命中db,导致db压力过大。

  1. 热数据永不过期

  2. 过期时间添加一个随机值,避免同时过期

# 数据使用场景

  • 读取命中缓存:读取缓存成功,返回。
  • 读取未命中缓存:读取db,写入缓存,返回。
  • 更新数据:写入db,再让缓存时效。

数据需要同时更新缓存和数据库两个地方,更新时序不同会有不同的结果。

# 一些问题

  • 过期还是不过期缓存数据
  • 维度拆解
  • 大value
  • 热缓存问题
  • 数据预热
  • 缓存实例故障快速恢复

参考文章 (opens new window)