面试题答案
一键面试缓存穿透
- 产生原因:
- 客户端持续请求一个在数据库和缓存中都不存在的数据,导致请求直接穿透缓存到达数据库,对数据库造成压力。
- 解决方案:
- 布隆过滤器:
- 原理:布隆过滤器是一个二进制向量和一系列随机映射函数。当一个元素加入集合时,通过多个哈希函数将其映射到向量中的几个位置,将这些位置设为1。查询时,元素通过相同哈希函数映射,若对应位置不全为1,则元素一定不存在;若全为1,则大概率存在。
- 优点:能快速判断数据是否存在,占用内存少。
- 缺点:存在误判率,即可能把不存在的数据判断为存在。
- 缓存空值:
- 原理:当数据库查询结果为空时,也将空值缓存起来,并设置较短的过期时间。后续相同请求直接从缓存获取空值,避免穿透到数据库。
- 优点:实现简单。
- 缺点:可能会浪费一定的缓存空间,且空值过期后仍可能出现穿透。
- 布隆过滤器:
- 方案选择:
- 业务规模小,性能要求不高:缓存空值实现简单,可优先考虑。
- 业务规模大,性能要求高:布隆过滤器能有效减少数据库压力,即使有误判率,整体性能提升明显,应选择布隆过滤器。
缓存雪崩
- 产生原因:
- 大量缓存数据在同一时间过期,导致大量请求同时穿透缓存到达数据库,使数据库负载瞬间过高,甚至崩溃。
- 解决方案:
- 设置不同过期时间:
- 原理:对不同的缓存数据设置随机的过期时间,避免大量数据同时过期。
- 优点:实现简单,能有效分散过期时间。
- 缺点:可能导致部分缓存数据过期时间过短,影响缓存命中率。
- 使用二级缓存:
- 原理:一级缓存设置较短过期时间,二级缓存设置较长过期时间。当一级缓存过期,从二级缓存获取数据,同时更新一级缓存。
- 优点:能在一定程度上保证数据的可用性,减少数据库压力。
- 缺点:增加了缓存架构的复杂度,需要维护两级缓存。
- 设置不同过期时间:
- 方案选择:
- 业务规模较小,性能要求一般:设置不同过期时间简单易行,是较好选择。
- 业务规模大,性能要求高:使用二级缓存虽复杂,但能更好地应对雪崩问题,可优先考虑。
缓存击穿
- 产生原因:
- 一个被高并发访问的热点数据在缓存过期的瞬间,大量请求同时穿透缓存访问数据库,导致数据库压力瞬间增大。
- 解决方案:
- 互斥锁:
- 原理:在缓存过期时,只有一个请求能获取到互斥锁,去查询数据库并更新缓存,其他请求等待。当缓存更新后,其他请求再从缓存获取数据。
- 优点:实现相对简单,能有效防止高并发请求同时访问数据库。
- 缺点:可能存在线程阻塞,影响系统性能。
- 热点数据永不过期:
- 原理:对热点数据不设置过期时间,通过后台线程定时更新数据,或在数据发生变化时主动更新缓存。
- 优点:避免了缓存过期瞬间的高并发问题。
- 缺点:可能导致数据一致性问题,且后台更新逻辑需处理好。
- 互斥锁:
- 方案选择:
- 业务规模小,性能要求不高:互斥锁实现简单,能满足需求。
- 业务规模大,性能要求高:热点数据永不过期能更好地保证性能,但要处理好数据一致性问题,可优先选择。