redis缓存雪崩,缓存穿透,缓存击穿场景及解决方案

一、缓存雪崩

1.Redis缓存雪崩了解么?

您好,我了解的,目前电商首页以及一些热点数据都会去做缓存,一般来说缓存都是定时任务去刷新的或者是查不到后去更新的,定时任务刷新就有一个问题,如果所有首页的key时效时间都为12小时,中午12点刷新的,我零点有秒杀活动,假设当时每秒有6000个请求,本来缓存可以扛住每秒5000个请求,但是缓存当时所有的key都失效了,此时1秒6000个请求全部落在数据库,就直接把数据库打死了,这就是我理解的缓存雪崩

2.缓存雪崩你们都是怎么处理的?

在批量往redis中存数据的时候,可以给每个key的失效时间加个随机值就好了,语法上面即 setRedis(Key,value,time + Math.random() * 10000);
或者设置热点数据永远不过期,有更新操作就更新缓存就好了

二、缓存穿透和缓存击穿

1.说说他们跟缓存雪崩的区别是啥?

缓存穿透针对的是缓存和数据库中都不存在的数据而用户不断的发起请求,这种情况一般都是一些恶心操作,比如我们的系统数据库的id值都是从1开始的,那么如果用户用了一个负数或者特别大的数,这种攻击会导致数据库压力过大,严重时会击垮数据库。

缓存击穿和缓存雪崩类似,都是针对缓存中存在的数据但是缓存击穿是指某个热点数据抗着大并发当这个key在失效的瞬间,持续的大并发就击破了缓存,直接请求数据库

2.怎么解决缓存穿透与缓存击穿?

首先针对缓存穿透,会在接口层做校验,比如用户鉴权校验,参数做校验,不合法的参数直接代码Return,比如:id 做基础校验,id <=0的直接拦截等,
其次可以对于缓存和数据库都没有的数据,直接在redis中赋一个null值,然后设置一个较短的过期时间(设置太长会导致正常时间也无法使用)

针对缓存击穿可以设置热点永不过期,或者加上互斥锁就能搞定

三、总结

避免发生上述情况,一般需要从事前,事中,事后三个角度考虑

事前:保证Redis 高可用,主从+哨兵,Redis cluster,避免全盘崩溃。
事中:本地 ehcache 缓存 + Hystrix 限流+降级,避免MySQL被打死。
事后:Redis 持久化 RDB+AOF,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。

你可能感兴趣的:(#,分布式缓存,redis,缓存,分布式)