问题
缓存穿透,缓存击穿,缓存雪崩
- 缓存穿透(多次):频繁查询数据库中不存在的数据。利用此进行攻击,可能压垮数据库;
- 缓存击穿(一次):缓存过期时大量并发请求;
- 缓存雪崩:缓存服务重启或大量缓存集中失效,给后端系统(如 DB)带来很大压力;
应对
缓存穿透
- 缓存空数据;
- 布隆过滤器,过滤不存在的数据请求;
缓存击穿
- 互斥锁(redis.setnx),拿锁后查数据库,再缓存;
- 热门数据不过期;
缓存雪崩
- 对数据设置不同的过期时间;
- 互斥锁;
过期策略(过期时)
- 定期删除,每个 100ms 随机抽取一些设置了过期时间的 key,如果过期就删除。
- 惰性删除,用的时候检查是否过期,如果过期就删除。
淘汰机制(内存满时)
- noeviction:不淘汰数据,默认。内存使用达到阀值后,引起申请内存的命令都会报错。
- volatile-ttl:淘汰将要过期的数据。
- volatile-lru:淘汰最近最少使用(过期数据)。
- volatile-lfu:淘汰低使用频率(过期数据)
- volatile-random:随机淘汰(过期数据)。
- allkeys-lru:淘汰最近最少使用(全部数据)。
- allkeys-random:随机淘汰(全部数据)。
- allkey-lfu:淘汰低使用频率(全部数据)。