Redis中的缓存雪崩、缓存击穿和缓存穿透

1. 缓存雪崩

缓存雪崩是指在某一个时刻,缓存中大量的数据同时失效,导致所有请求都落到了数据库上,使得系统瞬间承受不了巨大的请求量而崩溃。造成缓存雪崩的原因可能包括以下几个方面:

1.1. 缓存失效时间一致

缓存中的大部分数据设置了相同的过期时间,而且过期时间集中在同一时刻,导致同时失效,造成瞬间大量的请求落到数据库上。解决方法是让各个缓存数据的过期时间分散开。

1.2. 缓存集中在同一台服务器

如果所有的缓存都放在了同一台服务器上,当该台服务器宕机或重启时,所有的缓存数据都会失效,造成缓存雪崩。解决方法是将缓存分散到不同的服务器上。

1.3. 缓存和数据库同时宕机

如果缓存和数据库两者同时宕机,即使缓存有备份,也无法解决缓存雪崩问题。解决方法是在不同的区域或机房部署至少一个数据库服务器和一组缓存服务器,保证在一个区域或机房宕机的情况下,另外一个区域或机房可以提供服务。

缓存雪崩问题的解决方法有:

1. 将缓存数据的过期时间分散开。

2. 将缓存分散到不同的服务器上。

3. 在不同的区域或机房部署至少一个数据库服务器和一组缓存服务器。

2. 缓存击穿

缓存击穿是指一个请求查询缓存中不存在的数据,导致请求到达数据库。如果此时有大量请求同时查询不存在的数据,就会导致数据库短时间内承受巨大的请求量而崩溃。造成缓存击穿的原因可能包括以下几个方面:

2.1. 热点数据过期

某些热点数据的访问频率很高,而且缓存中的过期时间非常短,如果该数据过期,就会导致大量请求同时访问数据库。解决方法是将热点数据的过期时间延长。

2.2. 空值缓存

如果数据库中不存在某个数据,那么在缓存中也不会保存该数据。如果有大量的请求同时查询这个不存在的数据,则会导致这些请求全部到达数据库。解决方法是在缓存中为不存在的数据设置一个特殊的标记,不会直接向数据库发起查询请求。

2.3. 缓存穿透

缓存穿透是指查询一个不存在的数据,由于缓存中没有该数据,因此无法击穿缓存,该请求会实时地查询数据库。如果存在大量的恶意请求查询不存在的数据,则会导致数据库短时间内承受巨大的请求量而崩溃。解决方法是在缓存中为不存在的数据设置一个特殊的标记,不会直接向数据库发起查询请求。

缓存击穿和缓存穿透问题的解决方法有:

1. 将热点数据的过期时间延长。

2. 在缓存中为不存在的数据设置一个特殊的标记,不会直接向数据库发起查询请求。

3. 缓存穿透

缓存穿透是指查询一个数据库中不存在的数据,由于该数据无法被缓存保留,每次请求都需要查询数据库,导致数据库短时间内承受巨大的请求量而崩溃。造成缓存穿透的原因可能包括以下几个方面:

3.1. 恶意攻击

如果有人故意向系统发送查询不存在数据的请求,就可能导致缓存穿透。解决方法是在应用层对用户请求参数进行校验,拦截非法参数。

3.2. 多级缓存

多级缓存可以有效地避免缓存穿透问题,一个缓存层无法命中缓存的数据时,会向下一级缓存发起查询请求,最终才会查询数据库。如果数据库中不存在该数据,则可以在第一次查询该数据时,将其结果设置为特殊标记的值,这样后续查询该数据时,直接返回该特殊标记,避免向下一级缓存发起查询请求。

缓存穿透问题的解决方法有:

1. 在应用层对用户请求参数进行校验,拦截非法参数。

2. 多级缓存。

数据库标签