面试题答案
一键面试缓存过期时间设置
- 随机化过期时间:
- 避免所有缓存数据设置相同的过期时间。对于一批需要缓存的数据,在合理的时间区间内(例如原本设置过期时间为1小时,可在30分钟到1.5小时之间随机设置),为每个缓存项设置随机的过期时间,这样可以分散缓存过期的时间点,降低大量缓存同时过期的风险。
- 阶梯式过期时间:
- 将缓存数据按照一定的规则分成不同的组,每组设置不同的过期时间。比如按照业务类型或者用户群体进行分组,不同组的缓存过期时间设置为不同的阶梯值,如1小时、2小时、3小时等,使缓存过期时间呈阶梯状分布,防止集中过期。
缓存架构设计
- 多级缓存架构:
- 引入本地缓存:在应用服务器本地增加一层缓存,如使用Guava Cache等。当请求到达时,首先查询本地缓存,如果命中则直接返回,减少对远程分布式缓存(如Redis)的访问压力。即使分布式缓存出现雪崩,本地缓存仍能在一定程度上提供数据支持,减轻数据库压力。
- 使用分布式缓存集群:采用分布式缓存集群(如Redis Cluster),将缓存数据分布在多个节点上。这样即使部分节点出现故障或缓存过期,其他节点的数据仍然可用,不会导致所有缓存同时失效。同时,合理设置集群的副本数量,提高缓存的可用性和容错能力。
- 缓存预热:
- 在系统启动时,提前将一些热点数据加载到缓存中,并设置合适的过期时间。这样在系统正式运行时,这些热点数据已经存在于缓存中,不会因为同时未缓存而大量请求数据库,降低缓存雪崩的风险。可以通过定时任务或者启动脚本等方式来实现缓存预热。
故障恢复机制
- 限流:
- 在应用层设置限流策略,如使用令牌桶算法或漏桶算法。当请求量超过一定阈值时,限制新的请求访问数据库,避免数据库因瞬间高并发请求而崩溃。例如,每秒只允许1000个请求访问数据库,多余的请求可以返回友好的提示信息给用户,如“系统繁忙,请稍后重试”。
- 降级:
- 当检测到缓存雪崩,数据库压力过大时,启动降级策略。对于一些非核心业务,可以直接返回默认数据或者简单的提示信息,而不再请求数据库。例如,在电商应用中,商品详情页的一些非关键信息(如商品的推荐语等)可以在降级时返回固定的默认内容,保证核心业务(如商品基本信息、价格等)的正常展示。
- 监控与报警:
- 建立完善的缓存监控系统,实时监测缓存的状态,如缓存命中率、过期数据量、缓存服务器的性能指标(CPU、内存、网络等)。当发现缓存命中率急剧下降、大量缓存即将过期等异常情况时,及时通过邮件、短信等方式报警,通知运维和开发人员,以便及时采取措施进行处理,避免缓存雪崩的发生或减轻其影响。
- 数据持久化与恢复:
- 对于使用的分布式缓存(如Redis),启用数据持久化机制,如RDB(Redis Database)或AOF(Append - Only File)。这样在缓存服务器重启后,可以快速从持久化文件中恢复数据,减少缓存重建的时间和对数据库的压力。同时,定期备份持久化文件,防止数据丢失。在缓存雪崩发生后,可以利用持久化数据和备份文件尽快恢复缓存数据,使系统恢复正常运行。