一、缓存雪崩
1. 什么是缓存雪崩
缓存雪崩是指在某一时刻,大量的缓存数据同时失效,导致大量的请求直接打到数据库上,从而引发数据库的压力激增,可能导致整个系统的崩溃,这种现象被称为缓存雪崩。
2. 缓存雪崩的产生原因
缓存雪崩通常由于缓存的过期策略或者缓存服务器的故障导致。例如,如果我们将大量的缓存数据设置为在同一时间点过期,那么在这个时间点,这些缓存数据将同时失效,导致大量的请求直接打到数据库上,从而可能引发缓存雪崩。
3. 缓存雪崩有什么影响
缓存雪崩的影响是灾难性的。由于大量的请求直接打到数据库上,数据库的压力激增,可能导致数据库崩溃,从而影响整个系统的正常运行。在极端情况下,可能导致整个系统的崩溃。
4. 缓存雪崩的防范策略
防止缓存雪崩的策略主要有以下几种:
- 设置不同的过期时间:
通过为每个缓存项设置稍微不同的过期时间,可以避免大量的缓存数据同时失效。 - 使用热备份:
可以使用热备份的缓存服务器,当主缓存服务器出现问题时,可以立即切换到备份服务器。 - 数据预热:
在缓存数据过期前,提前将数据加载到缓存中,避免缓存数据的同时失效。 - 使用限流和熔断机制:
通过限流和熔断机制,可以防止数据库被大量的请求打垮。
二、缓存击穿
1. 什么是缓存击穿
缓存击穿是指一个存在的数据在缓存中过期,导致所有的请求都直接打到数据库,造成数据库短时间内压力过大。这种现象被称为缓存击穿。
2. 缓存击穿的产生原因
缓存击穿通常发生在一个热点数据的缓存过期的时候。由于这个数据非常热门,所以在缓存过期的瞬间,大量的请求会直接打到数据库。
3. 缓存击穿有什么影响
缓存击穿会导致大量的请求直接访问数据库,从而增加数据库的负载,可能会导致数据库性能下降,甚至崩溃。
4. 缓存击穿的防范策略
防止缓存击穿的策略主要有以下几种:
- 设置热点数据永不过期:
对于一些访问频率非常高的热点数据,可以设置为永不过期,这样就可以避免因为缓存过期而导致的缓存击穿。 - 使用互斥锁:
当缓存失效的时候,不是立即去load db,而是先使用缓存工具的某些带成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去set一个mutex key,当操作返回成功时,再去load db。这样可以防止大量的并发请求去数据库加载数据。
三、缓存穿透
- 什么是缓存穿透
缓存穿透是指查询一个数据库中不存在的数据,由于缓存中也没有,所以每次查询都会直接访问数据库。如果有大量此类请求,就会对数据库造成很大压力,这种现象被称为缓存穿透。 - 缓存穿透的产生原因
缓存穿透通常发生在查询一个数据库中不存在的数据时。由于缓存中也没有这个数据,所以每次查询都会直接访问数据库。如果有大量此类请求,就会造成缓存穿透。 - 缓存穿透有什么影响
缓存穿透会导致大量的请求直接访问数据库,从而增加数据库的负载,可能会导致数据库性能下降,甚至崩溃。 - 缓存穿透的防范策略
防止缓存穿透的策略主要有以下几种:
- 缓存空值:
即使数据库中没有某个值,也可以在缓存中存储一个空值或特殊标记,这样当查询这个值时,就可以直接从缓存中获取,而不需要访问数据库。 - 使用布隆过滤器:
布隆过滤器是一种空间效率极高的概率型数据结构,可以用来判断一个元素是否在一个集合中。我们可以将所有可能存在的数据哈希到布隆过滤器中,当查询一个数据时,先判断它是否在布隆过滤器中,如果不在,就可以直接返回,而不需要访问数据库。