Redis缓存穿透是指什么如何解决缓存穿透的问题(redis缓存穿透,缓存雪崩解决)

Redis缓存穿透和缓存雪崩以及解决方案

大家好,今天小编来为大家解答Redis缓存穿透是指什么如何解决缓存穿透的问题这个问题,redis穿透解决办法很多人还不知道,现在让我们一起来看看吧!

本文目录

  1. 如何解决Redis缓存雪崩、缓存穿透、缓存并发等问题
  2. Redis缓存穿透是指什么如何解决缓存穿透的问题

如何解决Redis缓存雪崩、缓存穿透、缓存并发等问题

缓存穿透

很多项目在使用Redis或其他缓存框架的时候,都是先查询缓存,查询不的话再查询数据库,查到之后再放到内存中;如果一个key值本身就不存在,那么每一次都会查询数据库,也就是常说的【缓存穿透】。

应对方法:

如果在Redis中查询不到,并且查询数据库也没有结果,那么就将这个key写入到Redis中,value=空,并设置一个超时过期时间,例如五分钟,那么五分钟以内的对这个可以的所有查询就可以拦截下来,如果数据库有key对应的数据了,那么五分钟后Redis中的缓存过期,会访问数据库并加载缓存;但是如果被恶意攻击,每次请求的key都不相同且不存在,那么依然会穿透到数据库;

布隆过滤器:将可能存在的数据Hash到一个足够大的bitmap上,它可以告诉你“某个key一定不存在或者可能存在”,一个一定不存在的数据会被bitmap拦截。

缓存雪崩

很多时候,Redis中的缓存是要设置过期时间的,假如Redis中的数据,过期时间都设置成一样的,那么到了时间之后,全部缓存过期失效,下一秒所有的请求都会访问数据库,那么数据库可能因为访问量多大导致“崩溃”,这就是缓存雪崩。

应对方法:

最暴力的解决办法,缓存不设置自动过期时间,只要缓存不崩,数据库就不会崩。

另外一个办法,就是让缓存过期时间不那么一致,比如一批缓存数据24小时后过期,那么就在这个基础上,每条缓存的过期时间前后随机1-6000秒(1-10分钟)。

缓存并发

大多数时候,我们的程序访问Redis都不可能是单线程,那么当多个Client并发对Redis进行setkey操作的时候,可能会产生一些问题;其实Redis本身是单线程的,这种时候会按照先后顺序进行操作;或者把操作放在队列中,按顺序执行;

但比如这种情况:

token过期,有两个线程都去重新获取token;

线程1获取token1;

线程2获取到token2,此时token1过期;

线程1把token1放到Redis,再拿着token1去调用服务,发现过期了,继续去请求token3,此时token2过期;

线程2把token2放到Redis,再拿着token2去调用服务,发现过期了,继续去请求token4,此时token3过期;

......

这就需要我们在更新缓存的时候,做一些控制了。

我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。

Redis缓存穿透是指什么如何解决缓存穿透的问题

如何解决Redis缓存穿透的问题?缓存穿透是指查询一个根本不存在的数据,缓存层和存储层都不会命中,通常出于容错的考虑,如果从存储层查不到数据则不写入缓存层,如图所示整个过程分为如下3步:1)缓存层不命中。2)存储层不命中,不将空结果写回缓存。3)返回空结果。缓存穿透将导致不存在的数据每次请求都要到存储层去查询,失去了缓存保护后端存储的意义。缓存穿透问题可能会使后端存储负载加大,由于很多后端存储不具备高并发性,甚至可能造成后端存储宕掉。通常可以在程序中分别统计总调用数、缓存层命中数、存储层命中数,如果发现大量存储层空命中,可能就是出现了缓存穿透问题。造成缓存穿透的基本原因有两个:第一,自身业务代码或者数据出现问题;第二,一些恶意攻击、爬虫等造成大量空命中。下面我们来看一下如何解决缓存穿透问题。1.缓存空对象如下图所示,当第2步存储层不命中后,仍然将空对象保留到缓存层中,之后再访问这个数据将会从缓存中获取,这样就保护了后端数据源。缓存空对象会有两个问题:第一,空值做了缓存,意味着缓存层中存了更多的键,需要更多的内存空间(如果是攻击,问题更严重),比较有效的方法是针对这类数据设置一个较短的过期时间,让其自动剔除。第二,缓存层和存储层的数据会有一段时间窗口的不一致,可能会对业务有一定影响。例如过期时间设置为5分钟,如果此时存储层添加了这个数据,那此段时间就会出现缓存层和存储层数据的不一致,此时可以利用消息系统或者其他方式清除掉缓存层中的空对象。

2.布隆过滤器拦截

如下所示,在访问缓存层和存储层之前,将存在的key用布隆过滤器提前保存起来,做第一层拦截。例如:一个推荐系统有4亿个用户id,每个小时算法工程师会根据每个用户之前历史行为计算出推荐数据放到存储层中,但是最新的用户由于没有历史行为,就会发生缓存穿透的行为,为此可以将所有推荐数据的用户做成布隆过滤器。如果布隆过滤器认为该用户id不存在,那么就不会访问存储层,在一定程度保护了存储层。

好了,关于Redis缓存穿透是指什么如何解决缓存穿透的问题和redis穿透解决办法的问题到这里结束啦,希望可以解决您的问题哈!

Redis的四大难点,缓存穿透 缓存击穿 缓存雪崩 分布式锁

本文内容来自互联网,若需转载请注明:https://bk.jguuu.com//11/87355.html