小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
Redis 最常见的用途是为 Web 服务提供数据缓存,减轻后端系统和服务器的压力。作为缓存服务,一旦出现问题,不能起到缓存应该发挥的作用,将会有大量请求进入业务系统和数据库,给它们造成压力,影响系统的可用性,甚至出现宕机。
缓存服务中比较常见,也影响较大的三个问题就是缓存雪崩、缓存击穿和缓存船头。下面逐一介绍。
缓存雪崩
缓存雪崩指的是,缓存中有大量数据同时过期,导致大量数据请求无法再缓存中处理,从而在短时间内有大量请求发送到数据库,导致数据库的压力在短时间内剧增。
有效的解决办法就是避免给大量的数据设置相同的过期时间,如果确实有这样的需求,可以在业务允许的范围内,在每个数据的过期时间后加上一个随机数,这样就可以避免大量数据在同一时间过期,防止缓存雪崩。
缓存击穿
缓存击穿是指,有些被频繁访问的数据,无法在缓存中进行处理,导致后端数据库接收到大量请求。它与缓存雪崩的区别是,缓存雪崩时大量数据过期无法再缓存中处理造成的,而缓存击穿的原因是针对热点数据的大量请求无法再缓存中处理。
当出现缓存击穿的时候,缓存就失去了作为缓存的作用。有效的解决办法是,根据业务和实际情况,分析出哪些是被频繁访问的热点数据,在这些数据进入缓存的时候,不要给它们设置过期时间,以保证这些数据可以一直在缓存中得到处理。
缓存穿透
缓存穿透指的是,要处理的数据,既不在缓存中,也不在数据库中,也就是请求了不存在的数据。如果有大量这样的数据请求,就会导致缓存和数据库都需要处理这些请求,导致缓存和数据库的压力激增。缓存穿透也是一种常见的恶意攻击的方式,也就是通过大量请求访问不存在的数据,导致缓存和数据库瘫痪。
解决方法也很简单,就是对于访问过的不存在的数据,再缓存中保存一个空值,由缓存来处理这些请求,而不必每次都访问后端数据库。
另外一个方法就是使用布隆过滤器来判断一个数据是否存在,从而避免去数据库中查询。关于布隆过滤器的细节,之后在发文介绍。