面试题答案
一键面试架构设计
- 缓存层:采用分布式缓存系统,如Redis。利用其丰富的数据结构和高性能读写能力,满足不同业务模块的缓存需求。
- 业务模块层:各个业务模块根据自身需求从缓存中读取数据或更新缓存。
- 缓存管理模块:负责监控缓存状态,根据过期策略和自动刷新机制对缓存进行管理。
策略选择依据
- 交易记录模块:
- 过期策略:采用长时间不过期策略。由于对数据一致性要求极高,交易记录一旦写入,不应因缓存过期而丢失。
- 自动刷新机制:采用事件驱动的刷新机制。当有新的交易记录写入数据库时,通过消息队列(如Kafka)发送消息,通知缓存管理模块更新对应的缓存数据。
- 用户资产统计模块:
- 过期策略:设置较短的过期时间,以保证缓存数据能定期更新。例如,每10分钟过期一次,既能满足对实时性要求稍低的需求,又能在一定程度上提高性能。
- 自动刷新机制:采用定时任务刷新。每隔一段时间(如5分钟),由缓存管理模块查询数据库中的最新用户资产统计数据,并更新到缓存中。
不同模块适配
- 交易记录模块:在写入交易记录到数据库后,立即发送消息到消息队列。缓存管理模块监听消息队列,接收到消息后更新对应的缓存数据。
- 用户资产统计模块:在模块启动时,注册定时任务到缓存管理模块。缓存管理模块按照设定的时间间隔执行定时任务,更新缓存数据。
可能面临的挑战和应对措施
- 缓存雪崩:
- 挑战:大量缓存同时过期,导致请求全部落到数据库,可能使数据库压力过大甚至崩溃。
- 应对措施:对不同模块的缓存过期时间设置随机偏移量,避免大量缓存同时过期。例如,用户资产统计模块的缓存过期时间在10分钟的基础上,随机增加1 - 5分钟的偏移量。
- 缓存穿透:
- 挑战:查询不存在的数据,每次都穿透到数据库,增加数据库压力。
- 应对措施:在缓存中设置一个空值缓存,当查询不存在的数据时,先将空值存入缓存,并设置较短的过期时间。下次查询同样的数据时,直接从缓存中获取空值,避免穿透到数据库。
- 缓存击穿:
- 挑战:热点数据缓存过期瞬间,大量请求同时访问,导致数据库压力过大。
- 应对措施:使用互斥锁(如Redis的SETNX命令)。当缓存过期时,只有一个请求能获取到锁并查询数据库更新缓存,其他请求等待,从而避免大量请求同时落到数据库。