1、Redis雪崩怎么处理?
案例场景:目前电商热点数据都会去做缓存 ,一般缓存都是定时任务去刷新,或者是查不到之后去更新的,定时任务刷新就有一个问题。假设所有热点数据的Key都是0点失效,0点刷新的,刚好我在零点有个秒杀活动有大量用户涌入,假设当时每秒 10000 个请求,本来缓存在可以扛住每秒 5000 个请求,但是0点时所有的Key都失效了。此时 1 秒 10000 个请求全部到了数据库,数据库必然扛不住就直接挂了。这个时候重启数据库,又会新的流量给搞挂。这就是我理解的缓存雪崩。
处理方案:在批量往Redis存数据的时候,把每个Key的失效时间都加个随机值,这样可以保证数据不会在同一时间大面积失效。
如果Redis是集群部署,将热点数据均匀分布在不同的Redis库中也能避免全部失效的问题。或者设置热点数据永远不过期,有更新操作就更新缓存就好了
2、缓存穿透和击穿与雪崩的区别?
缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求。例如我们数据库的 id 都是1开始自增上去的,如发起id值为 -1 的数据请求。每次请求都能绕开Redis直接到数据库,但是数据库也查不到,如果同一时间大量这样的请求会导致数据库压力过大,严重会击垮数据库。
缓存雪崩是因为缓存中的数据同一时间大面积失效造成大量请求直接到了数据库造成数据库崩溃,而缓存击穿是指一个Key非常热点,大量的请求对一个点进行访问时造成数据库崩溃。
处理方案:
方案一:可以把不存在的key也设置缓存,并设置过期时间;
解决思路,尽量的把请求拦截到,不让它去访问数据库,那我们怎么去拦截呢,比如说,当拿一个不存在key访问程序的时候,如果查询数据库,不存在对应的值,那我们也会给不存在的这个key 存入到缓存里面,并且可以设置缓存失效时间;比如说可以把对应的key设置为null值存入到缓存里面,如果下次有相同的key来访问的时候,在缓存失效之前,都是直接从缓存里面取;这样就会把不必要的请求拦截下来;
方案二:使用redis或者zookeep提供的互斥锁也可以解决缓存击穿
这种方案是通过异步方式 去获取缓存过程中,其他key 处于等待现象,必须等待第一个构建完缓存之后,释放锁,其他人才能通过该key才能访问数据