redis的缓存常见的3个问题:缓存击穿、缓存穿透、缓存雪崩。
#### 1.缓存击穿
缓存击穿指的是,热点的缓存数据失效的瞬间,大批量的请求直接打到数据库。
特点:缓存无,db有
解决方案:
- 热点数据永不过期,定时替换
- 优点:访问速度快
- 缺点:额外增加缓存替换逻辑的代码复杂度;浪费缓存空间
- 使用分布式互斥锁访问数据库更新缓存
- 优点:实现简单;节省缓存空间
- 缺点:过期时,同时获取锁的请求由于阻塞原因耗时会提高
#### 2.缓存穿透
缓存穿透指的是,请求的内容数据库中也不存在于是也写不进缓存,导致大量请求直接打到 数据库上。
特点:缓存无,db无
解决方案:
- 将不存在的数据构造一个特定空对象写入缓存
- 优点:简单
- 缺点:浪费珍贵的缓存空间
- 布隆过滤器过滤大部分无效请求,再构造特定空对象写入缓存
- 优点:节省缓存空间
- 缺点:实现相对复杂
#### 3.缓存雪崩
缓存雪崩指的是,缓存中大批量数据同时过期,导致大部分本应打到缓存的请求全部打到了数据库上。
特点:缓存大量无,db有
解决方案:
- 避免同时对数据做缓存(可以加上随机数)
- 优点:实现简单
- 缺点:缓存时间不完全可控
- 热点数据永不过期,定时替换
- 优缺点略
- 双重缓存
- 优点:可控缓存时间;非常有效缓解db压力
- 缺点:多加一重缓存逻辑;浪费缓存空间
缓存三大问题