Redis系列(二):Redis缓存穿透和缓存雪崩是什么?
一、Redis穿透
缓存穿透现象:用户想要查询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库查询。发现也没有,于是本次查询失败。当用户很多的时候,缓存都没有命中,于是都去请求了持久层数据库。这会给持久层数据库造成很大的压力,这时候就相当于出现了缓存穿透。
介绍两种常用解决方案:
1.解决方案1:布隆过滤器
参考下面这篇文章,我觉得讲得非常详细了,
2.解决方案2:缓存空对象
缓存穿透:黑客发送大量请求,请求的数据是数据库里没有的,每次都会不走缓存,直接走数据库,最后可能造成数据库宕机
解决:只要数据库没查到,就写一个空值到缓存,下次还有这个请求,就可以走缓存了
弊端:
- 如果空值能够被缓存起来,这就意味着缓存需要更多的空间存储更多的键,因为这当中可能会有很多的空值的键;
- 即使对空值设置了过期时间,还是会存在缓存层和存储层的数据会有一段时间窗口的不一致,这对于需要保持一致性的业务会有影响。
二、Redis击穿
XXX
三、Redis雪崩
缓存雪崩现象:大量key同一时间点全部失效,同时又有大量请求打进来,导致流量直接打在DB上,造成DB不可用。
那么思考下以下几个问题:
- Redis缓存为什么会大量key同一时间点全部失败?
- 数据库能支持的最大并发请求数是多少?
- 数据库挂掉了DBA会怎么处理?
要想了解上面的问题,看下下面这张图:
1.Redis为什么会出现大量key同一时间点全部失效?
Redis服务器宕机了,Redis服务器宕机一般是因为并发数超过Redis服务器能支撑的最大的并发数。具体案例可以看下记一次redis挂机导致的服务雪崩事故,不对,是故事~ (非常好的雪崩案例分析)
2.再来看下数据库能支撑的最大并发请求数?
数据库类型 | 支持的最大并发数 | 备注 |
---|---|---|
MySql | 16384 | 受服务器配置,及网络环境等制约,实际服务器支持的并发连接数会小一些,主要决定因素有:
1、服务器CPU及内存的配置。 2、网络的带宽。互联网连接中上行带宽的影响尤为明显。 |
Oracle | 40000 |
1.查看oracle的最大并发数限制,可是查看v$license视图 2.手动计算:每个Session消耗的内存和参数设置有关,如果是DEDICATE(独立模式)方式,sort_area_size大小和PGA内存消耗相关,如果是512K,则大概每个Session消耗3M左右,所以,机器允许的最大并发连接数=(机器内存-ORACLE等系统软件内存-oracleSGa内存)/3m |
Postgre |
大于Oracle |
1.最大连接数也可以在pg配置文件中配置: 在postgresql.conf中设置: max_connections = 500 2.查看为超级用户保留的连接数: show superuser_reserved_connections ; |
3.Redis雪崩的解决方案
(1)redis高可用
这个思想的含义是,既然redis有可能挂掉,那我多增设几台redis,这样一台挂掉之后其他的还可以继续工作,其实就是搭建的集群。
(2)限流降级
这个解决方案的思想是,在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
(3)数据预热
数据加热的含义就是在正式部署之前,我先把可能的数据先预先访问一遍,这样部分可能大量访问的数据就会加载到缓存中。在即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。
具体案例可以看下上图案例的解决方案
参考文章: