面试题答案
一键面试缓存雪崩可能对系统造成的影响
- 高并发请求数据库:大量原本从缓存获取的数据请求,因缓存失效同时涌向数据库,导致数据库瞬间承受巨大压力,可能引发数据库连接池耗尽、查询性能急剧下降甚至数据库服务崩溃。
- 系统响应时间变长:由于数据库处理能力受限,大量请求排队等待处理,使得整个系统的响应时间显著增加,用户体验变差。
- 服务不可用:若数据库无法承受高并发请求而崩溃,依赖该数据库的API服务将无法正常提供数据,导致服务不可用,影响业务正常运行。
从缓存设计角度的应对措施
- 设置不同的过期时间:避免大量缓存数据在同一时间过期,对缓存数据设置随机的过期时间,比如在原本过期时间的基础上,上下浮动一定比例的时间,这样可以分散缓存过期的时间点,降低缓存雪崩发生的概率。
- 使用缓存预热:在系统启动时,预先将一些热点数据加载到缓存中,并设置合理的过期时间,避免在系统运行初期因为缓存数据为空而导致大量请求直接访问数据库。
- 分级缓存:构建多级缓存结构,例如在本地缓存(如Guava Cache)和分布式缓存(如Redis)之间形成两级缓存。先从本地缓存获取数据,如果本地缓存未命中,再访问分布式缓存。即使分布式缓存出现雪崩,本地缓存仍能在一定程度上缓解数据库压力。
- 添加缓存标识:在缓存数据时,同时设置一个标识位,标识该数据是否是有效的真实数据。当缓存雪崩时,若获取到的是标识位异常的数据,可通过异步任务去更新缓存,同时返回兜底数据给用户,避免大量无效请求直接访问数据库。
- 采用兜底策略:为缓存数据设置兜底数据,当缓存雪崩发生,且无法及时从数据库获取到有效数据时,返回兜底数据给用户,保证服务的基本可用性,提升用户体验。兜底数据可以是预先设定的默认值、最近一次成功获取的数据等。