Redis系列(二):Redis缓存穿透和缓存雪崩是什么?

一、Redis穿透

缓存穿透现象:用户想要查询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库查询。发现也没有,于是本次查询失败。当用户很多的时候,缓存都没有命中,于是都去请求了持久层数据库。这会给持久层数据库造成很大的压力,这时候就相当于出现了缓存穿透。

介绍两种常用解决方案:

1.解决方案1:布隆过滤器

参考下面这篇文章,我觉得讲得非常详细了,

详解布隆过滤器的原理、使用场景和注意事项

2.解决方案2:缓存空对象

缓存穿透:黑客发送大量请求,请求的数据是数据库里没有的,每次都会不走缓存,直接走数据库,最后可能造成数据库宕机

解决:只要数据库没查到,就写一个空值到缓存,下次还有这个请求,就可以走缓存了

弊端:

  1. 如果空值能够被缓存起来,这就意味着缓存需要更多的空间存储更多的键,因为这当中可能会有很多的空值的键;
  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,设置不同的过期时间,让缓存失效的时间点尽量均匀。

具体案例可以看下上图案例的解决方案

参考文章:

帮你解读什么是Redis缓存穿透和缓存雪崩(包含解决方案)

详解布隆过滤器的原理、使用场景和注意事项

猜你喜欢

转载自blog.csdn.net/sanmi8276/article/details/107077061