面试题答案
一键面试缓存穿透
缓存穿透指查询一个一定不存在的数据,由于缓存不命中,会直接查询数据库,若大量请求同时查询不存在的数据,会对数据库造成巨大压力。
- 解决方案1:布隆过滤器
- 原理:在查询数据库前,先通过布隆过滤器判断数据是否存在。布隆过滤器通过多个哈希函数对数据进行映射,将结果存储在一个位数组中,查询时同样通过哈希函数映射判断是否存在。
- 优点:能高效判断数据是否存在,极大减少数据库查询压力,空间效率高。
- 缺点:存在误判率,且布隆过滤器本身需要额外内存空间,数据动态变化时维护成本较高。
- 解决方案2:空值缓存
- 原理:当查询数据不存在时,也将空值缓存起来,并设置较短的过期时间。下次相同查询先命中缓存空值,避免穿透到数据库。
- 优点:实现简单,能快速缓解数据库压力。
- 缺点:会额外占用缓存空间,且设置过期时间较难,过短可能无法有效防止穿透,过长则会影响数据更新及时性。
缓存雪崩
缓存雪崩指大量缓存数据在同一时间过期,导致大量请求直接访问数据库,造成数据库压力过大甚至崩溃。
- 解决方案1:随机过期时间
- 原理:为缓存数据设置随机的过期时间,避免大量数据同时过期。例如,原本过期时间为1小时,可以设置在40分钟到80分钟之间随机。
- 优点:实现简单,有效避免大量缓存同时过期的情况,分散数据库压力。
- 缺点:难以精确控制过期时间分布,可能导致部分缓存过期时间过短或过长,影响缓存命中率。
- 解决方案2:二级缓存
- 原理:使用两层缓存,一级缓存设置较短过期时间,二级缓存设置较长过期时间。当一级缓存过期,先从二级缓存获取数据,若二级缓存也过期,再查询数据库并同时更新一、二级缓存。
- 优点:降低了数据库压力,且能保证数据在一段时间内有缓存可用,提高系统可用性。
- 缺点:增加了缓存架构复杂度,需要额外维护二级缓存,增加了内存使用。
缓存击穿
缓存击穿指一个热点key在失效瞬间,大量并发请求同时访问,直接穿透到数据库,造成数据库压力剧增。
- 解决方案1:互斥锁
- 原理:在查询缓存未命中时,使用互斥锁(如分布式锁)保证只有一个线程去查询数据库并更新缓存,其他线程等待,获取锁的线程更新完缓存后释放锁,其他线程再从缓存获取数据。
- 优点:能有效防止缓存击穿,保证数据库不会被高并发请求压垮。
- 缺点:性能上有一定损耗,因为大量线程需要等待获取锁,且可能存在死锁风险,实现分布式锁也较为复杂。
- 解决方案2:热点数据永不过期
- 原理:对于热点数据不设置过期时间,同时启动后台线程定时更新缓存数据,或者在数据发生变化时主动更新缓存。
- 优点:彻底避免缓存击穿问题,保证高并发场景下热点数据始终可从缓存获取。
- 缺点:缓存数据可能长时间不更新导致数据不一致,后台更新逻辑增加了系统复杂度,且占用更多缓存资源。