课程名称:Java架构师-技术专家
课程章节:第7周 集群架构:主从复制高可用Redis集群
主讲老师:慕课讲师团:Geely、风间影月、阿神……
课程内容:
1、 缓存穿透的解决方案
1.1、缓存穿透出现的原因及定义
比如:用户查询数据,缓存中没有数据,就会去数据库中查询,然后加入到缓存中,之后的请求就可以命中缓存了;但是如果用户在查询的时候,使用非法请求,每次查询到的都是数据库中没有的数据,这样数据就无法缓存到Redis中,相同的请求每次都会穿透 Redis 到达 db。
此时如果被非法用户攻击,大量的请求会直接打在 db 上,造成数据库压力过大甚至宕机,从而影响整个系统,这种现象称为缓存穿透。
这种缓存中不存在而需要去数据库查询的请求,就被称为是缓存穿透。
1.2、解决方案
不为空才放入缓存之后,这样可能会造成多次缓存穿透
解决方案一:不管是否为空,都将其放入缓存,比如空字符串、空对象、空数组或list。
为防止无效key过多占用存储,为这种类型的key 设置一个过期时间【5-10分钟】
为空的key设置过期时间,不为空的key 设置永久存在。就算这种key的值未来会有值了,set 方法是会去覆盖的。所以无需担心
解决方案二:布隆过滤器(内部维护二进制数组,存储 0/1)
相当于在Redis 前加了 一层过滤器,用户请求去查询数据,会在布隆过滤器设置该key 是否存在。
2、缓存雪崩
2.1、什么是雪崩
雪崩是成片缓存大面积失效
会给key 设置过期时间,一旦在某个时间点、时刻,大面积的 key 全部都失效了,但是在这个时候又恰恰有很大的流量涌入进来,那么所有的流量都会打在 db 上,所有的请求是不会经过 redis 的。
对于雪崩来讲,完完全全解决是做不到的,只能够去缓解这一现象,提前去做防护的措施。
- 永不过期
- 过期时间错开
- 多缓存结合
- 采购第三方 Redis ,后期是可以升级的,健壮性和可靠性都较高。
学习收获:
对于缓存来说,我们还需要预防缓存穿透和雪崩,穿透的话一般来说只需要针对空值缓存就行,过期时间设置 5 -10 分钟,这样流量就不会打在数据库上导致死机宕机。
雪崩其实也可以做到提前预防,那就是用到过期时间的key,时间全部错开,此外,有些数据可以做永久保存的话那就直接永久保存,这样就不会造成大面积的key 失效了。
当一次请求过来,如果查询的 key 比较多,能做到批量就批量,如果是循环查询索引的话,一来吞吐量低,二来比较low。
今天的学习完毕!