面试题答案
一键面试缓存雪崩原因分析
- 大量缓存集中过期:在高并发场景下,如果大量缓存设置了相近的过期时间,当这些缓存同时过期时,大量请求会直接穿透到后端数据库,导致数据库瞬间承受巨大压力,甚至可能崩溃。这是因为缓存失效后,所有请求都需要从数据库获取数据,而数据库的处理能力通常远低于缓存,无法在短时间内处理如此大量的请求。
- 缓存服务器故障:如果缓存服务器出现故障,比如宕机,会导致所有依赖该缓存的请求都无法从缓存中获取数据,进而全部涌向数据库,引发雪崩效应。
缓存穿透原因分析
- 恶意请求:攻击者故意使用不存在的键进行大量请求,由于缓存中不存在这些键对应的数据,每次请求都会穿透到数据库。而数据库也没有这些数据,每次查询都返回空,导致大量无效请求浪费数据库资源。
- 业务数据异常:在业务逻辑中,可能由于数据录入错误、数据同步问题等,产生了一些在正常业务场景下不会出现的键值,当对这些异常键进行查询时,就会出现缓存穿透。
解决方案
- 缓存过期策略调整
- 随机过期时间:避免大量缓存集中过期,在设置缓存过期时间时,为每个缓存项添加一个随机的过期时间偏移量。例如,原本设置过期时间为60分钟,可以改为55 - 65分钟之间的随机值。这样可以分散缓存过期的时间点,减少同一时间大量缓存过期的可能性。
- 定期刷新:对于一些热点数据,可以采用定期刷新的策略,而不是依赖过期时间。在缓存数据快过期时,通过后台任务或者异步线程提前刷新缓存,保证数据的持续性可用,避免过期瞬间大量请求穿透到数据库。
- 缓存预热
- 启动时预热:在微服务启动阶段,通过批量查询数据库热点数据,并将其加载到缓存中。可以使用多线程并行加载的方式提高预热效率,减少启动时间。这样在服务上线初期,就有大量数据在缓存中,能够有效应对高并发请求。
- 定时预热:设置定时任务,在系统低峰期,对即将过期的热点数据进行提前查询并重新缓存,保证缓存数据的持续有效性,防止高峰期缓存过期引发雪崩。
- 布隆过滤器的应用
- 原理:布隆过滤器是一种概率型数据结构,它可以高效地判断一个元素是否存在于一个集合中。在缓存穿透场景下,我们可以在客户端使用布隆过滤器来判断请求的键是否可能存在。如果布隆过滤器判断该键不存在,那么直接返回,不再请求缓存和数据库,从而避免无效请求穿透到数据库。
- 实现:在服务启动时,将数据库中的所有键值(或者热点数据的键值)加载到布隆过滤器中。当有请求到来时,先经过布隆过滤器检查。由于布隆过滤器存在一定的误判率(即可能把不存在的元素误判为存在),但误判率可以通过调整布隆过滤器的参数(如哈希函数个数、位数组大小等)来控制在较低水平。
- RPC服务端与客户端的协同优化
- 服务端优化
- 缓存降级:当缓存服务器出现故障时,服务端可以启用降级策略,比如返回默认数据或者简单的提示信息,而不是直接将请求转发到数据库。这样可以避免数据库因大量无效请求而崩溃,保证系统的基本可用性。
- 请求合并:对于同一时间内大量相同的请求,服务端可以将这些请求合并处理,只查询一次数据库,然后将结果返回给多个客户端。可以通过使用队列来收集相同的请求,达到一定数量或者等待一定时间后统一处理。
- 客户端优化
- 本地缓存:在客户端增加本地缓存,对于一些经常访问且不经常变化的数据,可以缓存在客户端本地。这样在请求时,先从本地缓存查找,如果命中则直接返回,减少对RPC服务端缓存和数据库的请求压力。
- 重试机制优化:当请求缓存或者数据库失败时,客户端不要立即重试,而是采用指数退避算法,逐步增加重试间隔时间。这样可以避免短时间内大量重试请求再次给系统带来压力,同时也能提高请求成功的概率。
- 服务端优化