- 一、题目
- 二、缓存雪崩
- 三、如何解决缓存雪崩
- 3.1、针对 Redis 服务不可用的情况
- 3.2、针对热点缓存失效的情况
- 1、设置不同的失效时间
- 2、加互斥锁
- 3、缓存永不失效;
- 4、双层缓存策略
二、缓存雪崩大量 key 同时到达过期时间有哪些影响
缓存在同一时间大面积的失效,后面的请求都直接落到了数据库上,造成数据库短时间内承受大量请求;
- 采用 Redis 集群,避免单机出现问题整个缓存服务都没办法使用;
- 限流,避免同时处理大量的请求;
比如,随机设置缓存的失效时间
同一时间只让一个线程构建缓存,其他线程阻塞排队等待回写缓存线程执行完,重新读缓存即可
public String getData(String key) {
// 从缓存获取数据
String result = getDataFromRedis(key);
if (result == null) {
// 去获取锁,获取锁成功,去数据库读取数据
if (lock.tryLock()) {
// 从数据库获取数据
result = getDataFromMySQL(key);
if (result != null) {
setDataToCache(key, result);
}
// 释放锁
lock.unlock();
} else {
Thread.sleep(100);
result = getData(key);
}
}
return result;
}
3、缓存永不失效;
缓存在物理上永远不过期,用一个异步的线程更新缓存
4、双层缓存策略使用主备两层缓存:
- 主缓存:有效期按照经验值设置,设置为主读取的缓存,主缓存失效后从数据库加载最新值
- 备份缓存:有效期长,获取锁失败时读取的缓存,主缓存更新时需要同步更新备份缓存
建立备份缓存,缓存 A 和缓存 B,A 设置超时时间,B 不设值超时时间,先从 A 读缓存,A 没有读 B,并且更新 A 缓存和 B 缓存
暑期编程PK赛 得CSDN机械键盘等精美礼品!转载请标明出处,原文地址:https://blog.csdn.net/weixin_41835916 如果觉得本文对您有帮助,请点击顶支持一下,您的支持是我写作最大的动力,谢谢。



