Redis 的雪崩、穿透、击穿
redis 雪崩、穿透、击穿的区别
这都是涉及到服务器的高可用的部分。他们之间的区别如下
- 雪崩:同一时刻,
大量的key
过期 - 穿透:就是访问的
redis
里面都没有,直接 - 击穿:某一个热点的
key
突然过期了,所有的请求都打到了mysql
上
缓存雪崩
产生雪崩的是指一个时间段内,大量的key失效了,所有的请求都打到了mysql数据库上,redis 宕机了!
防止雪崩的方法
- 随机初始化数据过期时间,不要让他们在同一时间失效
- 直接不设置过期时间
- 在分布式中,把key平均的放在不同的节点上
缓存的穿透:
举个例子,比如某数据库是从 0
开始自增的,肯定没有-1
这个id,所以redis也没有,那么黑客就可以通过这个技术,不断的调用你的 mysql
数据库,从而把你的数据库搞垮。
解决方案
- 第一次请求,将数据库查到的结果,无论是否为空,都保存到
redis
里面。但是如果黑客每次都换个参数,这个就解决不了了 - 拉黑对方的 IP 地址
- 对参数的合法性进行检测
- 使用布隆过滤器
缓存空对象
缓存击穿
缓存击穿是指一个 key 非常的热点,在不停的扛着大并发,大并发集中对一个点进行访问,当这个 key 在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在屏障上凿开一个洞。 当某 key 在过期的瞬间,有大量的请求并发访问,这类数据一般是热点数据,由于缓存过期,会同时访问数据库来查询最新的数据,并写会缓存,会导致使服务器瞬间压力过大。
解决方案:
使用分布式锁。如果是单体的话,就添加 互斥锁
,加锁只保证只有一个线程加进去。其余的都在等待。这样这一个线程进去以后,把数据查到,就会把查到的数据,添加到 redis
中,
布隆过滤器
布隆过滤器就是使用布隆算法,加载redis之前,布隆过滤器有黑名单和白名单两种操作。
下面是布隆过滤器的黑名单
用法,
参考文献
https://www.bilibili.com/video/BV15y4y1r7X3?share_source=copy_web