一、缓存穿透
概念
缓存穿透就好比你去图书馆找一本书,这本“书”压根就不存在于图书馆的藏书目录里,但你却一次次地去问图书管理员这本书在哪。在 Redis 缓存场景中,用户请求的数据在缓存和数据库中都不存在,每次请求都会直接打到数据库上,这就像一个穿透了缓存的“洞”,给数据库带来巨大压力。
常见原因
- 恶意攻击:黑客可能会故意发送大量不存在的 key 请求,试图拖垮数据库。
- 业务误操作:比如数据被误删,但缓存未更新。
解决方案
- 布隆过滤器:布隆过滤器可以提前拦截掉那些不可能存在的数据请求。它就像一个快速的预检关卡,在请求到达缓存和数据库之前,先判断这个 key 是否可能存在。如果判断不存在,就直接返回,不再进行后续请求。
- 空值缓存:当请求的数据在数据库中也不存在时,将这个空值也缓存起来,设置一个较短的过期时间。这样下次相同的请求就可以直接从缓存中获取空值,避免再次访问数据库。
二、缓存击穿
概念
缓存击穿类似于图书馆里有一本特别热门的书,突然这本书的借阅记录从目录中消失了(缓存过期),而此时有大量读者同时来借阅这本书,这些请求就会全部直接打到数据库上,给数据库造成瞬间的巨大压力。在 Redis 中,就是某个热点 key 在缓存中过期失效的瞬间,大量针对该 key 的请求同时到来,导致请求都直接访问数据库。
常见原因
- 热点数据过期:比如某明星突然宣布结婚,相关话题成为热点,对应的缓存 key 过期后,大量请求同时涌入。
解决方案
- 设置永不过期:对于一些热点数据,可以设置永不过期,或者手动更新缓存。这样就避免了因为过期而导致的缓存击穿问题。
- 加互斥锁:当缓存失效时,让一个请求去更新缓存,其他请求等待。等缓存更新完成后,其他请求再从缓存中获取数据。这样可以保证同一时间只有一个请求访问数据库。
三、缓存雪崩
概念
缓存雪崩就像是图书馆里大量的图书借阅记录同时消失了(大量缓存同时过期),所有读者的请求都直接涌向图书管理员(数据库),导致管理员忙不过来(数据库压力过大甚至崩溃)。在 Redis 中,就是大量的缓存 key 在同一时间过期,或者 Redis 服务宕机,导致大量请求直接访问数据库。
常见原因
- 缓存过期时间设置过于集中:比如很多缓存 key 的过期时间都设置为相同的值,这样就会在同一时间大量过期。
- Redis 服务故障:Redis 服务器出现宕机、网络故障等问题,导致缓存不可用。
解决方案
- 随机化过期时间:给不同的缓存 key 设置不同的过期时间,避免大量 key 在同一时间过期。可以在原本的过期时间基础上加上一个随机值。
- 使用多级缓存:除了 Redis 缓存,还可以使用本地缓存(如 Guava Cache)。当 Redis 缓存失效时,先从本地缓存获取数据,减少对数据库的访问。
- Redis 高可用:采用 Redis 集群、哨兵等机制,保证 Redis 服务的高可用性,避免因单点故障导致的缓存雪崩。
四、Redis 持久化策略
RDB(Redis Database)
- 概念:RDB 是 Redis 的一种快照持久化方式,它会在某个时间点将 Redis 内存中的数据生成一个快照文件(.rdb 文件)。就好比给数据库拍了一张照片,记录下当前的状态。
- 优点:文件紧凑,适合备份和灾难恢复;恢复数据速度快,因为只需要加载快照文件即可。
- 缺点:可能会丢失最后一次快照到宕机之间的数据;在生成快照时可能会对 Redis 性能产生一定影响。
AOF(Append Only File)
- 概念:AOF 是将 Redis 执行的所有写操作命令追加到一个文件末尾(.aof 文件)。就像一个操作日志,记录下所有对数据库的修改操作。
- 优点:数据安全性高,最多只会丢失 1 秒的数据(取决于配置);AOF 文件是文本格式,易于理解和修改。
- 缺点:AOF 文件通常比 RDB 文件大;恢复数据速度相对较慢。
选择建议
- 如果对数据安全性要求不高,更注重恢复速度,可以选择 RDB 持久化。
- 如果对数据安全性要求较高,希望尽量减少数据丢失,可以选择 AOF 持久化,或者同时使用 RDB 和 AOF 两种持久化方式。
通过了解缓存穿透、缓存击穿、缓存雪崩的概念和解决方案,以及 Redis 的持久化策略,我们可以更好地使用 Redis 缓存,提高系统的性能和稳定性。