Redis缓存穿透,缓存雪崩,缓存穿透

Redis缓存作用:提高读写响应速率,降低数据库压力

Redis 缓存穿透:

指客户端请求的数据在redis缓存中和数据库中没不存在。

可能出现的问题:可能会有不怀好意的人,高并发请求不存在的数据,先去缓存找,找不到再去数据库中,在这种高并发的情况下,很有可能会把数据库搞垮

解决方案:

  1. 缓存空对象:当第一次请求时,如果请求数据不在缓存中,也不在数据库中,那么我们就把这个数据在缓存中缓存一个空对象,这样在下次请求的时候,缓存就直接返回null,就不需要再到数据库查找了。

    优点:简单方便 ;

    缺点:1. 消耗内存(可设置TTL有效期)。2. 可能造成缓存和数据库数据的不一致(当我们给不存在的数据设置了一个空值,此时正好数据库插入了这个数据,这时缓存和数据库数据就会不一致。可在插入数据库时修改缓存数据,使得保持一致)

  2. 布隆过滤:在客户端和redis之间加一个过滤器,当有数据请求时,先通过过滤器判断是否有这条数据,有则返回,无则拒绝。

    布隆过滤器是如何判断数据是否存在的:布隆过滤器可以简单的理解为一个byte数组,里面存储的是二进制位。数据库内的数据会通过某种hash算法计算出hash值,再将hash值转换成二进制位保存到布隆过滤器内(0,1这种形式),判断是否存在,其实就是判断对应的位置是0还是1,以此来判断是否存在。

    优点:内存占用少。

    缺点:1.实现复杂(redis有自带的datamap可供使用). 2.存在误判可能(当布隆过滤器判断数据不存在,则肯定不存在,但判断数据存在,但缓存和数据库中不一定存在,可能已经被删了,就又出现了缓存穿透现象)

Redis缓存雪崩:

指在同一时间段,redis大量的缓存key失效或宕机,导致大量的请求到达数据库,给数据库带来巨大的压力。

解决方案:

  1. 给不同key的TTL设置随机值,以此来保证不会在同一时段有大量的key同时失效

  2. 利用redis集群提高服务的可用性(防止redis服务宕机)

  3. 给缓存业务添加降级限流策略(sentinal)

  4. 给业务添加多级缓存

Redis缓存击穿:

缓存击穿也叫热点key问题,就是一个被高并发访问并且存储重建业务较为复杂的key突然失效,导致无数请求到数据库带来巨大压力冲击。

解决方法:

  1. 互斥锁:当key失效后,只会有一条线程获取锁进行重构key缓存数据,其他线程进入循环获取等待状态。

    优点:实现简单,保证缓存和数据库数据的一致性

    缺点:线程需要等待,性能低,存在死锁的风险

  2. 逻辑过期:key不设置TTL有效时间,使其永久保存,但会设置一个逻辑过期时间,用于后续内存回收做判断处理。当key逻辑失效后,第一个判断到逻辑失效的线程,会获取锁,开启一个独立的线程重构key数据,其他线程在获取锁失败后,会继续使用旧数据,之后重构完毕后,即可获取新数据使用。

    优点:线程无需等待,性能好

    缺点:缓存和数据库数据不一致;实现起来相对复杂

 

 

posted @ 2022-03-05 13:38  迷路小孩  阅读(34)  评论(0)    收藏  举报