回答
缓存雪崩是指在缓存系统中,由于大量的数据同时过期或者 Redis 故障宕机时,由于此时 Redis 无法处理,于是大量请求都落在数据库上,从而导致数据库的压力剧增,甚至会造成数据库奔溃的现象,从而形成一系列连锁反应,造成整个系统崩溃。
解决缓存雪崩主要从两个方面着手,由于造成它产生的原因是大量数据同时过期或者 Redis 服务宕机,所以我们可以从这两个方法来着手。
一、大量数据过期
- 设置不同的缓存过期时间。在原有的过期时间上加上一个随机数,这样就会使得缓存的过期时间不会太集中。
- 设置热点数据永不过期。对于一些访问频率极高的热点数据,我们设置它永不过期,如果有更新的话,就更新缓存数据。
- 使用分布式锁。当业务线程在处理请求时,如果发现访问的数据不在缓存中时,就增加一个分布式锁,然后该业务线程去加载缓存,其他线程由于获取不到分布式锁会被阻塞。
二、Redis 服务宕机
- 使用 Redis 集群。采用 Redis 集群架构,即使某台 Redis 服务器宕机了,其他服务器仍然可以提供服务。
- 限流和降级。采用限流机制,避免大流量直接打到数据库上,降低数据库压力,保证整个系统正常运行。同时,采用降级策略,在系统负载过高时,暂时性地返回一些默认值或者提示信息。
扩展
解决方案
产生缓存雪崩的原因有两个: