Redis异常之雪崩、击穿、穿透
Redis在生产中较为容易遇到的三大问题,也是面试中问的比较多的问题便是Redis的缓存雪崩、缓存击穿、缓存穿透,这三大问题也是Redis缓存中比较典型的问题,下面分点详细聊聊
缓存雪崩
缓存过期时间集中
Redis雪崩其实大多数人都知道其中的一个原因便是缓存集中过期,一般都是设置过期时间的时候统一将一批数据设置相同的过期时间,在某个点集中过期,导致大批量的请求打到缓存后面的数据库,导致数据库压力巨大,无法及时处理大批量的请求。
解决办法
解决办法一是大家熟知的处理方式也是相对简单的,就是在设置过期时间的时候将原有过期时间加上一个几分钟内的随机值,保证键值不会集中过期即可。
除了设置随机过期时间外还可以通过服务降级的方式,当系统发现大量请求在redis上无法命中,大量请求堆积在数据库上,这时系统可以将部分系统非核心业务服务降级返回预定的错误信息,核心业务还是可以通过数据库查询得到请求结果,尽量减少数据库的请求压力。
缓存击穿
缓存击穿一般出现场景就是热点数据过期,热点数据突然过期那么大量请求将打在数据库上,而数据库无法处理大的并发请求有可能导致后台数据库服务宕机,这个解决办法也是很简单,不给热点数据过期时间,这样热点数据永不过期,自然不会造成缓存击穿这种异常场景。
缓存穿透
缓存穿透指要访问的数据既不在缓存中也不在数据库中,这样也就导致了缓存中没有数据去数据库中查询,但是数据库中也不存在该数据,就不会写到缓存中,这样一来缓存就成了摆设,如果大量请求这种不存在的数据,对缓存Redis和数据库来讲都是压力巨大的。
恶意攻击
出现缓存穿透的最常见场景其实就是恶意攻击,攻击者可以生成大量这种数据库中不可能存在的数据,请求我们的服务器。造成服务异常。
解决办法
- 既然是不正常的数据那么需要前端加入参数校验,将页面的不合理数据请求拦截。
- 当数据库中数据不存在我们可以缓存空值或缺省值,这样避免缓存穿透。
- 采用布隆过滤器,快速判断数据是否存在,虽然布隆过滤器有可能存在误判的情况,但如果布隆过滤器发现数据不存在那么一定不存在,如果布隆过滤器发现数据存在,那么该数据不一定存在,这并不影响解决缓存穿透问题,这仅仅只有少部分的请求会走到数据库,所以布隆过滤器是最优方案