使用缓存通常是请求先访问缓存数据,如果存在的话就直接返回数据,如果不存在的话就会回到数据库中,读取后将数据写入到缓存中并返回数据
# 缓存穿透
请求一个数据库不存在的id值。一般先请求缓存,缓存不存在,之后命中db,db查询不到。这样缓存形同虚设,每次都请求到db。
查询不到数据设置一个空值,并设置过期时间。
对业务id进行验证,防止非法请求。
# 缓存击穿
缓存中没有数据,数据库有数据。由于并发数特别多,同时没有读取到缓存数据,导致一起去读取db,导致db压力过大。
数据永不过期,设置更新数据机制
互斥锁,只有有锁的去读。
# 缓存雪崩
大批数据缓存过期,同时命中db,导致db压力过大。
热数据永不过期
过期时间添加一个随机值,避免同时过期
# 数据使用场景
- 读取命中缓存:读取缓存成功,返回。
- 读取未命中缓存:读取db,写入缓存,返回。
- 更新数据:写入db,再让缓存时效。
数据需要同时更新缓存和数据库两个地方,更新时序不同会有不同的结果。
# 一些问题
- 过期还是不过期缓存数据
- 维度拆解
- 大value
- 热缓存问题
- 数据预热
- 缓存实例故障快速恢复