分布式系统 缓存穿透与失效时的雪崩效应
缓存系统往往有两个问题须要面对和考虑:缓存穿透与失效时的雪崩效应。
1. 缓存穿透是指查询一个一定不存在的数据。因为缓存是不命中时被动写的,而且出于容错考虑。假设从存储层查不到数据则不写入缓存。这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。
至于怎样有效地解决缓存穿透问题,最常见的则是採用布隆过滤器(这个东西。在我的此篇文章中有介绍:),将全部可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。
而在数据魔方里。淘宝採用了一个更为简单粗暴的方法,假设一个查询返回的数据为空(无论是数据不存在,还是系统故障)。我们仍然把这个空结果进行缓存,但它的过期时间会非常短,最长不超过五分钟。
2. 缓存失效时的雪崩效应虽然对底层系统的冲击非常可怕。但遗憾的是,这个问题眼下并没有非常完美的解决方式。大多数系统设计者考虑用加锁或者队列的方式保证缓存的单线程(进程)写,从而避免失效时大量的并发请求落究竟层存储系统上。
在数据魔方中,淘宝设计的缓存过期机制理论上可以将各个client的数据失效时间均匀地分布在时间轴上,一定程度上可以避免缓存同一时候失效带来的雪崩效应。