Redis缓存的雪崩、击穿、穿透问题

文章讨论了在处理大数据量请求时,单一数据库系统的局限性,提出了缓存雪崩、缓存击穿和缓存穿透的概念。为解决这些问题,文中给出了相应策略,如随机化key的失效时间、使用Redis的哨兵机制防止宕机,以及利用布隆过滤器减少无效查询。同时,建议在热点数据出现前预加载到缓存中,以减轻数据库压力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.前言

        在日常开发中,都是使用数据库来进行数据的存储,如果涉及大数据量的需求,比如一些商品抢购的情景,或者是主页访问量瞬间较大的时候,单一使用数据库来保存数据的系统会因为面向磁盘,磁盘读/写速度比较慢的问题而存在严重的性能弊端,一瞬间成千上万的请求到来,需要系统在极短的时间内完成成千上万次的读/写操作,这个时候往往不是数据库能够承受的,极其容易造成数据库系统瘫痪,最终导致服务宕机的严重生产问题。

二.缓存雪崩

1.什么是缓存雪崩

        缓存雪崩是指当缓存中有大量的key在同一时刻过期,或者Redis直接宕机了,导致大量的查询请求全部到达数据库,造成数据库查询压力骤增,甚至直接挂掉。

2.如何解决缓存雪崩

让key的失效时间随机,使它们的失效点尽可能均匀分布。

例如这里我们使用了随机事件,控制了key的失效时间在30-35分钟之间

 如何解决redis突然宕机

        可以在docker中的redis主从配置中,搭建哨兵机制,当主宕机的时候,哨兵检测到后补上,让从变为主

三.缓存击穿

1.什么是缓存击穿

       缓存击穿是指当缓存中某个热点数据过期了,大量的数据请求击穿了某个key,在该热点数据重新载入缓存之前,有大量的查询请求穿过缓存,直接查询数据库。这种情况会导致数据库压力瞬间骤增,造成大量请求阻塞,甚至直接挂掉。

2.如何解决缓存击穿

       设置key永不过期。或者在 redis 高峰访问之前,把一些热门数据提前存入到redis 里面,加大这些热门数据 key 的时长,例如某些实时热点或者商品抢购时,我们可以提前把热门数据存入redis中,防止缓存击穿,实时监控调整该key的数据情况和失效时间。等到热点过去之后在对key进行修改。

四.缓存穿透

1.什么是缓存穿透

         缓存穿透是指查询一个缓存中和数据库中都不存在的数据,导致每次查询这条数据都会透过缓存,直接查库,最后返回空。当用户使用这条不存在的数据频繁的发起查询请求的时候,对数据库造成的压力就非常大,甚至可能造成数据库的崩溃。

 

2.如何解决缓存穿透

方法一:缓存空对象,当redis中查不到该数据时,当数据库中查不到数据的时候,缓存一个空对象,然后给这个空对象的缓存设置一个过期时间,这样下次再查询该数据的时候,就可以直接从缓存中拿到,从而达到了减小数据库压力的目的。

方法二:布隆过滤(Bloom Filter)

3.布隆过滤器

        ​ 布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。 ​

        将所有可能存在的数据哈希到一个足够大的 bitmaps 中,当用户使用缓存和数据库中不存在的数据发起查询时,会先经过布隆过滤器,一个一定不存在的数据会被这个bitmaps 拦截掉,从而避免了对底层存储系统的查询压力。但是如果布隆过滤器判定该数据存在后,还需要再在缓存中进行判断,布隆过滤器会有一定的误算率,随着存入的元素数量增加,误算率随之增加。常见的补救办法是建立一个小的白名单

使用方法如下:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值