架构设计:浅析分布式系统中的缓存问题
在分布式系统设计中,为了提高系统的响应速度,为了减轻数据库服务器的访问压力,我们经常会对数据进行缓存处理。本文由浅入深,逐步讲解缓存的设计,以及设计中遇到的问题。
初级缓存方案
初级缓存方案如下图所示,之所以如此命名,是因为大多数的系统中都是这样使用缓存的,是一个基础的缓存方案。大致流程如下:
1、业务系统从缓存中查询数据
2、如果查询到数据,则直接使用该数据
3、如果没有查询到数据,则需要业务系统从数据库中查询数据
4、如果查询到数据,则将数据放入缓存中,同时使用该数据
5、如果没有查询到数据,则直接返回空
初级缓存方案存在的问题
在访问量比较小的系统中,初级缓存方案是可以满足缓存要求的,但是在大型的分布式系统中,该方案存在问题的,如下:
缓存穿透问题
假设数据库中有 N 个用户U = {U1, U2,…Un},缓存穿透问题描述如下:
1、业务系统第一次从缓存中查询 U1 用户数据,此时缓存没有该数据,接着从数据库查询,查询到该数据,并将数据写入缓存中,业务系统就可以使用该数据。
2、再次查询 U1 用户数据时,直接从缓存中获取。
3、以此类推, {U2,…Un} 的数据查询逻辑类似于 U1。
4、当业务系统要查询 Un+1 的用户数据时,此时缓存中没有该用户数据,于是从查询数据库,数据库中也没有该用户数据,直接返回空。
5、问题来了,如果业务系统反复查询 Un+1 的用户数据,此时大量的请求会穿透缓存,直接进行数据库查询,给数据库带来大量的访问压力,严重时可能会导致数据库系统奔溃。在这种场景下初级缓存方案是无效,通常我们称这个问题为缓存穿透问题。
缓存击穿问题
假设数据库中有 N 个用户U = {U1, U2,…Un},缓存击穿问题描述如下:
1、业务系统第一次从缓存中查询 U1 用户数据,此时缓存没有该数据,接着从数据库查询,查询到该数据,并将数据写入缓存中,业务系统就可以使用该数据。
2、再次查询 U1 用户数据时,直接从缓存中获取。
3、以此类推, {U2,…Un} 的数据查询逻辑类似于 U1。
4、在某一时刻,系统中的缓存正好失效了,此时就会有大量的数据库查询请求,给数据库带来大量的访问压力,严重时可能会导致数据库系统奔溃。在这种场景下初级缓存方案是无效,通常我们称这个问题为缓存击穿问题。
缓存雪崩问题
当缓存服务器重启或者大量缓存集中在某一个时间段失效,在失效的时候,此时就会有大量的数据库查询请求,给数据库带来大量的访问压力,造成数据库访问缓慢,严重时可能会导致数据库系统奔溃,从而引起应用服务器雪崩。缓存穿透、缓存击穿都有可能引发缓存雪崩问题。
本文描述了最常见的缓存方案,以及该方案可能产生的问题,后续会写3篇文章详述缓存问题的解决方案。
架构设计:如何解决缓存穿透问题
架构设计:如何解决缓存击穿问题
架构设计:如何解决缓存雪崩问题
文章内容仅代表个人观点,如有不正之处,欢迎批评指正,谢谢大家。