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

    技术2022-07-12  76

    一、Redis穿透

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

    介绍两种常用解决方案:

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

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

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

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

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

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

    弊端:

    如果空值能够被缓存起来,这就意味着缓存需要更多的空间存储更多的键,因为这当中可能会有很多的空值的键;即使对空值设置了过期时间,还是会存在缓存层和存储层的数据会有一段时间窗口的不一致,这对于需要保持一致性的业务会有影响。

    二、Redis击穿

    XXX

    三、Redis雪崩

    缓存雪崩现象:大量key同一时间点全部失效,同时又有大量请求打进来,导致流量直接打在DB上,造成DB不可用。

    那么思考下以下几个问题:

    Redis缓存为什么会大量key同一时间点全部失败?数据库能支持的最大并发请求数是多少?数据库挂掉了DBA会怎么处理?

    要想了解上面的问题,看下下面这张图:

    1.Redis为什么会出现大量key同一时间点全部失效?

    Redis服务器宕机了,Redis服务器宕机一般是因为并发数超过Redis服务器能支撑的最大的并发数。具体案例可以看下记一次redis挂机导致的服务雪崩事故,不对,是故事~ (非常好的雪崩案例分析)

    2.再来看下数据库能支撑的最大并发请求数?

    数据库类型支持的最大并发数备注MySql16384受服务器配置,及网络环境等制约,实际服务器支持的并发连接数会小一些,主要决定因素有:

    1、服务器CPU及内存的配置。

    2、网络的带宽。互联网连接中上行带宽的影响尤为明显。

    Oracle40000

    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缓存穿透和缓存雪崩(包含解决方案)

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

    Processed: 0.013, SQL: 9