缓存雪崩的危害
缓存雪崩最乐观的情况是存储层能抗住,但是用户体验会受到影响,数据返回慢,当压力过大时会导致存储层直接挂掉,整个系统都受影响。对于要做到 99.99% 高可用的产品,是绝对不允许缓存雪崩的发生。
解决方案
1)缓存存储高可用。
2)缓存失效时间要设计好。
3)对于一些热门数据的持续读取,这种缓存数据也可以采取定时更新的方式来刷新缓存,避免自动失效。
4)服务限流和接口限流。
5)从数据库获取缓存需要的数据时加锁控制,本地锁或者分布式锁都可以。
代码示例
这里对加锁的方式进行代码讲解,代码如下所示。
public Person get(String id) {
Person person = repo.findOne(id);
if (person != null) {
return person;
}
synchronized (this) {
person = dao.findById(id);
repo.save(person);
}
return person;
}
上面是最简单的方式,直接用代码同步块来加锁,当然我们也可以用 Lock 来加锁,加锁的本质还是控制并发量,不要让所有请求瞬时压到数据库上面去,加了锁就意味着性能要丢失一部分。其实我们可以用信号量来做,就是限制并发而已,信号量可以让多个线程同时操作,只要在数据库能够抗住的范围内即可。