一、缓存雪崩
缓存大面积失效,导致数据库宕机,最终引发系统崩溃,称为缓存雪崩
原因
- 大量数据同时过期
- Redis宕机(运维方向,不作过多介绍,我也不会)
如何避免
知道了引发缓存雪崩的原因,那我们就可以有针对性的去制定预防措施,对于大量数据过期导致的缓存雪崩,可以通过如下措施进行预防:
- 均匀设置过期时间
- 互斥锁
- 后台更新缓存:缓存永久有效,由后台线程更新缓存。
tips:redis由内存淘汰策略,“永久有效”并不意味着不会被淘汰
内存淘汰策略:而当 Redis 的运行内存已经超过 Redis 设置的最大内存之后,则会使用内存淘汰策略删除符合条件的 key,以此来保障 Redis 高效的运行。
在配置文件中,通过maxmemory来设置最大内存。
总共有8种淘汰策略,根据淘汰数据的范围可以分为两类:
- 设置了过期时间的数据
- volatile-random:随机淘汰设置了过期时间的任意键值
- volatile-ttl:优先淘汰更早过期的键值
- volatile-lru:优先淘汰最久没有使用的键值
- volatile-lfu:最少使用的键值
- 所有数据
- allkeys-random
- allkeys-lru
- allkeys-lfu
- noeviction:不淘汰数据
二、缓存击穿
热点数据过期,大量请求直接访问数据库,数据库被冲垮
缓存击穿和缓存雪崩其实很像,都是因为缓存过期,所以避免缓存击穿的方式也差不多
- 互斥锁方案
- 不给热点数据设置过期时间,后台异步更新缓存
三、缓存穿透
访问的数据,既不在缓存中,也不在内存中
原因
- 业务误操作(没啥好说的,打工人瑟瑟发抖)
- 黑客攻击
应对措施
针对于恶意攻击,常见应对方案有三种
- 非法请求的限制
- 缓存空值或者默认值
- 使用布隆过滤器(重点)
重点介绍布隆过滤器,这是个啥玩意儿呢?
布隆过滤器是用于标记数据是否存在于数据库中,布隆过滤器由两个部分组成:位图数组+N个哈希函数,布隆过滤器通过三个操作完成数据的标记:
- 使用N个哈希函数,对数据进行哈希
- 将N个哈希值与数组长度进行取模
- 将取模结果对应的位图数组中的值修改为1
要判断数据是否存在于数据库中,就可以通过判断位图数组中对应的值是否存在0
- 如果存在0,则数据不在数据库中
- 如果不存在0,则数据可能不在数据库中(由于存在哈希碰撞)