700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Redis缓存穿透击穿雪崩

Redis缓存穿透击穿雪崩

时间:2020-06-24 17:36:00

相关推荐

Redis缓存穿透击穿雪崩

目录

1、缓存穿透2、缓存击穿3、缓存雪崩

1、缓存穿透

概述

缓存穿透的概念很简单,用户想要査询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库査询。发现也数据库中也没有,于是本次査询失败。当用户很多的时候,缓存都没有命中,于是都去请求了持久层数据库。这会给持久层数据库造成很大的压力,这时候就相当于出现了缓存穿透。

缓存穿透是指缓存和数据库中都没有数据,导致所有的请求都打在数据库上,造成数据库短时间内承受大量的请求而崩掉。缓存穿透通常来自于攻击,因为缓存和数据库都没有的情况很少。

解决方案

1️⃣接口层增加校验

如用户鉴权校验,id基础校验,在接口层就拦截不可能存在的数据

2️⃣布隆过滤器

布隆过滤器是一种数据结构,将所有可能存在的数据哈希到一个足够大的bit map中,一定不存在的数据可以被bit map拦截掉,从而避免了对底层存储系统的压力

3️⃣缓存空对象

当存储层不命中后,即使返回的空对象也将其缓存起来,将key-value缓存为key-null,同时会设置一个过期时间,之后再访问这个数据将会从缓存中获取,保护了后端数据源;

但是这种方法会存在两个问题:

如果空值能够被缓存起来,这就意味着缓存需要更多的空间存储更多的键,因为这当中可能会有很多的空值的键即使对空值设置了过期时间,还是会存在缓存层和存储层的数据会有一段时间窗口的不一致,这对于需要保持一致性的业务会有影响

2、缓存击穿

概述

缓存击穿是指缓存中没有但是数据库中有的数据(一般是缓存时间到期),此时如果该key为热点数据而缓存中不存在,则大量请求打到数据库上请求同一条数据,造成数据库某一点过大的压力。

这里需要注意和缓存击穿的区别,缓存击穿,是指一个热点数据key,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在过期的瞬间,比如60s该key到期,61s才会恢复,这1s的时间内持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞

此外还需注意与缓存雪崩的区别,缓存击穿是指并发查一条数据,而缓存雪崩是不同数据都过期了。

解决方案

1️⃣设置热点数据不过期

从缓存层面来看,没有设置过期时间,所以不会出现热点key过期后产生的问题

2️⃣加互斥锁

分布式锁:使用分布式锁,保证对于每key同时只有一个线程去查询后端服务,其他线程没有获得分布式锁的权限,因此只需要等待即可。这种方式将高并发的压力转移到了分布式锁,因此对分布式锁的考验很大。

3、缓存雪崩

概述

缓存雪崩是指缓存同一时间大面积失效,所有的请求会直接落在数据库上,造成数据库短时间内承受大量请求而崩掉。通常产生的原因有缓存过时失效、缓存服务器宕机/故障重启、第一次服务时缓存为空

比如马上就要到双十二零点,很快就会迎来一波抢购,这波商品时间比较集中的放入了缓存,假设缓存一个小时。那么到了凌晨一点钟的时候,这批商品的缓存就都过期了。而对这批商品的访问査询,都落到了数据库上,对于数据库而言,就会产生周期性的压力波峰。于是所有的请求都会达到存储层,存储层的调用量会暴增,造成存储层也会挂掉的情况。

其实集中过期,倒不是非常致命,比较致命的是缓存服务器某个节点宕机或断网。因为自然形成的缓存雪崩,一定是在某个时间段集中创建缓存,这个时候,数据库也是可以顶住压力的。无非就是对数据库产生周期性的压力而已。而缓存服务节点的宕机,对数据库服务器造成的压力是不可预知的,很有可能瞬间就把数据库压垮。

解决方案

1️⃣redis高可用

既然redis有可能挂掉,那我多增设几台 redis,搭建集群异地多活这样,这样一台挂掉之后其他的还可以继续工作

2️⃣限流降级

在缓存失效后,通过加互斥锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待,免大量请求对同一个key进行访问,让请求进行排队

3️⃣数据预热

数据加热的含义就是在正式部署之前,我先把可能的数据先预先访问一遍,这样部分可能大量访问的数据就会加载到缓存中。在即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀

4️⃣添加缓存标记

给每一个缓存数据增加相应的缓存标记,记录缓存是否失效,如果缓存标记失效,则更新缓存;同时,缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生

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