200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 如何解决Redis缓存雪崩缓存穿透缓存并发等问题 – 数据库 – 前端

如何解决Redis缓存雪崩缓存穿透缓存并发等问题 – 数据库 – 前端

时间:2024-04-08 12:15:20

相关推荐

如何解决Redis缓存雪崩缓存穿透缓存并发等问题 – 数据库 – 前端

应对方法:

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

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

缓存雪崩

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

应对方法:

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

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

缓存并发

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

但比如这种情况:

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

线程1获取token1;

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

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

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

… …

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

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。