缓存穿透与缓存雪崩的解决方案

缓存穿透与缓存雪崩的解决方案

1、缓存穿透

缓存穿透是指用户查询个别key时,该key不存在,导致用户请求转向数据库查询,而数据库中也不存在,那么该key对应的value就一直不会被缓存,从而导致所有针对该key的请求全部转向数据库查询,使整个缓存系统对该key失去作用,我们称这种现象为缓存穿透。

那么缓存穿透一般该如何解决呢?

通常来说,目前业内比较常见的方法有两种:

a、缓存空的对象;

缓存空的对象,这就意味着,当用户请求了不存在的key时,我们在缓存中存在一个空值对象。这么做其实有如下问题:

(1)、如果空值的对象过多,仍然可能导致缓存系统的内存空间被占用,增加缓存系统的压力。

(2)、而且当数据库中拥有了该key对应的非空value时,在过期时间到来之前,仍然同样会存在数据不一致的情况。

b、采用布隆过滤器过滤掉针对不存在的key的查询请求。

我们这里就不聊布隆过滤器的原理了,读者有兴趣,可以自己另行去研究一下。

采用这种办法,我们可以有效的将大量针对不存在的key的查询请求直接给过滤掉。

这种办法有这些好处:

(1)、不用浪费更多的缓存空间去存储空值的kv对;

(2)、有效减少针对缓存系统的查询请求。

但这种办法,也有一些缺点:

(1)、由于布隆过滤器的假阳性率问题,导致并不能过滤掉100%的针对不存在value的key的查询请求。

(2)、如果之前不存在value的key,在某一个时间,它在数据库中有了对应的value之后呢,那么我们需要保持对布隆过滤器中bitmap的数据更新,否则会出现过滤掉存在value的key的情况。

2、缓存雪崩

缓存雪崩是什么呢?它也是缓存穿透的一种极端情况,通常由于大量的key同时过期或者缓存系统的宕机等原因,导致缓存系统几乎失去作用,引发大量的请求转向数据库查询,大量请求针对数据库的查询,有可能引发数据库系统的崩溃,而数据库系统的崩溃还有可能引发一连串的依赖数据库系统的应用的崩溃,故称为雪崩。

为了解决缓存雪崩问题,通常可以采用下面三种办法:

a、保证缓存系统的高可用(如何保证,是另外的话题,我们会在其它的文章中予以讨论);

b、数据预热,在系统启动阶段,我们就提前初始化好缓存系统中的数据,保证用户的大量请求过来可以命中缓存;

c、避免所有的热点key的集中过期,也就是我们可以将这些key的过期时间,设置为不同的过期时间,通常设置为一个固定时间值+一个随机的时间段。

具体如何选取,需要根据我们业务要求来进行权衡,但是一定要尽量避免我们的系统中发生缓存雪崩的现象,因为一旦发生,它就是巨大的灾难。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于 Redis 缓存穿透、击穿和雪崩问题,可以采取以下解决方案: 1. 缓存穿透:当请求的数据在缓存中不存在时,会直接访问数据库,如果有恶意攻击者大量请求不存在的数据,会给数据库造成很大压力。解决方案可以是在查询前进行参数校验,比如对请求的参数进行合法性检查,或者使用布隆过滤器等技术来快速判断请求的数据是否存在。 2. 缓存击穿:当某个热点数据过期或被删除时,大量请求同时涌入,导致请求直接访问数据库。为了解决这个问题,可以使用互斥锁(Mutex)或者分布式锁来避免多个请求同时访问数据库。在获取锁之前,首先尝试从缓存获取数据,如果缓存中存在,则直接返回;如果不存在,则获取锁,并从数据库中获取数据并放入缓存,最后释放锁。 3. 缓存雪崩:当缓存中的大量数据同时过期时,会导致大量请求直接访问数据库,给数据库带来巨大压力。为了解决这个问题,可以采取以下措施: - 设置合理的缓存过期时间,使得不同数据的过期时间错开,避免同时失效。 - 使用热点数据预加载,提前将热点数据加载到缓存中,避免同时失效。 - 使用多级缓存架构,将缓存分为多个层级,不同层级的缓存设置不同的过期时间,从而降低缓存失效的风险。 - 引入限流和熔断机制,对请求进行限制,避免大量请求同时访问数据库。 通过以上措施,可以有效地解决 Redis 缓存穿透、击穿和雪崩问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值