缓存穿透透析

缓存穿透是指请求未命中缓存,直接访问数据库,可能导致服务器资源耗尽。常见场景包括查询数据库不存在的记录和缓存到期。解决方法包括无值回填(短暂存储空值)和使用布隆过滤器,后者通过哈希算法减少误判,降低异常查询对数据库的影响。此外,应对缓存到期导致的穿透,可采用后台线程加载或分布式锁策略。
摘要由CSDN通过智能技术生成

什么是缓存穿透

缓存穿透简单的理解为没有命中缓存,即缓存失效,请求全部打到外部磁盘IO设备上,比如数据库,因为数据库相对来说是比较慢的,所以请求会阻塞在数据库上,应用服务器的线程不能及时释放,如果量比较大的话,会导致频繁的线程切换,导致CPU飙升,还有可能会导致服务器资源耗尽,比如内存等。

缓存穿透的场景

大概可分为两类,一类是查询数据库不存在的记录,另外一类是缓存到期。正常情况下,查询不存在的数据记录时,请求直接打到数据库,并且因为没有数据,所有不会回填缓存。下次请求过来,还是重复这个过程,导致缓存穿透。当有大规模并发请求时,缓存正好到期,导致第一次请求还没有回填到缓存,大量的请求打到数据库,造成缓存穿透,这种是“狗桩效应”。

解决缓存穿透

解决缓存穿透的问题,大致有两种方法,分别是无值回填和布隆过滤器。下面就这两种方式做法或者说原理简单的介绍一下。首先说无值回填。空值填充,此方法主要解决第一类缓存穿透场景,就是说在请求过来的时候,首先查询缓存,缓存里面没有数据,然后查询数据库,数据库里面也没有数据,这个时候需要回填缓存,把空值回填到缓存,这样的话,再有查询过来的时候就会命中缓存,解决缓存穿透问题。但是这种方法一定要注意,由于空值并不是我们想要的业务数据,所以不能长时间的占用缓存,在回填空值的时候,设置一个比较短的过期时间。但是这种方法也有缺点,当大量请求数据都不存在的情况下,会占用很多缓存,比如当用户注册的时候会check手机号,这种情况下就会在缓存中回填很多空值,占用大量缓存容量。当缓存满的时候,用可能把正常的数据替换掉。

第二种方法就是布隆过滤器,首先介绍一下布隆过滤器,布隆过滤器是有一个二进制数组和一个HASH算法组成,具体工作思路是我们对于每一个值按照HASH算法算出一个hash值,然后用这个hash值对这个数组取模,得到的模数就是这个值所在的数组索引值,并且将数组对应的位置由0改为1,在判断一个值是否在这个集合中时,你只需要把这个值按照同样的算法算出索引值,看看数组所在的位置是否为1,如果为1表明已存在,如果为0,表明此值不在集合中。举个例子,我们经常遇到一个这样的业务,在用户中测试,判断用户的手机号是否已存在,如果存在就报错,如果不存在就注册。如果我们不使用缓存,当用户量非常大时,查询起来比较慢。所以我们把存在的手机号缓存在缓存中,使用缓存check手机号是否存在的时候,我们就用到了布隆过滤器,具体做法如下,我们首先初始化一个20亿bit数据,使用一个hash算法来计算用户ID的索引值,我们将目前所有用户的ID计算出来的所以位置的值设为1,其他地方的值为0.新注册的用户出了写到数据库中,还要使用同样的算法,把计算出来的数组的位置表为1.当我们要查询某个用户的信息时,我们首先检查在某个用户的ID是否存在在布隆过滤器里面,如果不存在就直接返回空值,而不需要继续查询数据库和缓存,这样就可以极大的减少异常查询带来的缓存穿透。但是布隆过滤器也存在问题,因为使用了hash算法,所有会存在hash碰撞的问题,所有会存在误判,但是布隆过滤器特别适合判断元素不存在的情况,为缓存穿透问题。布隆过滤器还会消耗比较大的空间,所以要根据业务场景选择是否能够使用布隆过滤器。

以上两种方法主要用来解决,数据不存在导致请求直接打到数据库,造成缓存穿透的问题。下面我们介绍一下怎么解决,缓存到期失效导致极热点的缓存项缓存穿透。其实解决思路比较简单,就是当缓存失效是,尽量减少缓存穿透到后台的并发量。比较常见的解决方式为两种,一种是当缓存失效之后启动一个后台线程,穿透到数据库,将数据加载到缓存中,在缓存未加载之前,所有访问这个缓存的请求都不在穿透而直接返回。另外一种是设计分布式锁,只有拿到这个锁的线程才能穿透到数据库,比方有一个数据是及热点数据,当它失效后,我们从数据库中重新加载数据,先向redis里面写入一个key为lockxx的缓存项,然后去数据库里面加载数据到缓存。这时如果有另外一个线程也要请求这个用户的数据,他发现缓存中有key为lockxxx的缓存项,就认为有人已经在加载缓存了,就重新去缓存中查询数据,不在穿透数据库。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值