提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
主要是介绍一下redis缓存雪崩、击穿、穿透,以及他们的解决方式。
所谓的redis缓存雪崩指的是:redis中大量key集中过期或者redis服务器宕机,从而导致大量请求从数据库获取数据,导致数据库服务器访问压力过大。
解决方式:
① 若是由于大量key过期所造成的,可以给key的ttl设置一个过期时间
② 若是因为redis服务器宕机所导致的,可以搭建redis集群,保证高可用
③ 可以从请求量层面进行解决,对缓存业务添加限流和服务降级策略
④ 可以添加多级缓存,比如说nginx缓存
所谓的redis缓存击穿指的是:热点key的过期,从而导致大量访问热点key的请求访问数据库,从而导致数据库压力过大。
解决方式:热点key通常是我们通过后台进行批量添加的,比如秒杀活动,解决热点key失效,可以重建缓存
① 互斥锁实现:只允许一个线程对redis缓存进行重建,其他线程处于等待状态,可以通过redis当中的setnx实现。缺点是串行化执行,效率低。优点是一致性高。
② 逻辑过期:给需要缓存的数据添加一个逻辑过期字段,通过对逻辑过期字段的判断,判断数据有无过期,如果过期则开启一个线程进行缓存重建,并且返回之前的数据。缺点是数据的一致性低,优点是相应速度快。
所谓的redis缓存穿透指的是:redis当中没有数据,数据库当中也没有数据,请求每次都是访问数据库,而数据库有没有数据返回。
解决方式:
① 缓存空值。缺点是有点浪费内存空间,如果这样的请求过多,会导致redis当中有大量这种无用缓存,可以给其设置一个ttl。
② 使用布隆过滤器。布隆过滤器原理是一个二进制的数组,存储的是0或1,在添加元素时进行多次hash运算,得到多个0或1,存储到相应位置。
③ 热点参数的限流降级
④ 进行权限校验
⑤ 做好数据格式的校验