面试题答案
一键面试架构设计
- 客户端:
- 功能:发起分页数据请求,接收服务节点返回的分页数据。
- 交互流程:向服务节点发送分页数据请求,等待服务节点返回数据。
- 服务节点:
- 功能:接收客户端请求,查询 Redis 缓存,若缓存未命中则查询数据库并将结果写入缓存。同时处理缓存击穿、雪崩等问题,并与其他节点协调缓存同步。
- 交互流程:
- 接收客户端请求,根据请求参数生成 Redis 缓存 key。
- 尝试从 Redis 获取缓存数据,若命中则直接返回给客户端。
- 若缓存未命中,查询数据库获取分页数据。
- 将获取到的数据写入 Redis 缓存,并返回给客户端。
- Redis 集群:
- 功能:存储分页数据缓存,提供高可用性和数据冗余。
- 交互流程:服务节点与之进行读写操作。
- 分布式缓存同步机制(如使用 Redis 发布/订阅):
- 功能:当某个服务节点更新了 Redis 缓存数据时,通过发布/订阅机制通知其他节点,使其更新本地缓存,保证数据一致性。
- 交互流程:
- 当一个服务节点更新缓存后,向 Redis 发布一个更新消息,消息内容包含缓存 key 等相关信息。
- 其他服务节点订阅该消息,接收到消息后,根据消息内容更新本地缓存。
缓存击穿、雪崩问题解决方案
- 缓存击穿:
- 挑战:单个热点 key 在缓存过期瞬间大量请求涌入数据库。
- 解决方案:
- 使用互斥锁(如 Redis 的 SETNX 命令),在缓存过期时,只有一个请求能获取锁去查询数据库并更新缓存,其他请求等待。
- 热点数据永不过期,在数据更新时主动更新缓存。
- 缓存雪崩:
- 挑战:大量缓存同时过期,导致大量请求直接访问数据库,可能压垮数据库。
- 解决方案:
- 为缓存设置不同的过期时间,避免集中过期。
- 搭建多级缓存,如在应用层设置本地缓存,分担 Redis 压力。
- 启用 Redis 集群的持久化机制,在重启后能快速恢复部分缓存数据。
缓存数据一致性和同步机制
- 挑战:不同服务节点可能存在缓存数据不一致的情况。
- 解决方案:
- 使用上述的发布/订阅机制,实时同步缓存更新。
- 引入分布式锁,在更新缓存时获取锁,保证同一时间只有一个节点能更新,避免并发更新导致数据不一致。
性能和稳定性评估监控
- 性能评估:
- 缓存命中率:通过统计缓存命中次数与总请求次数的比例来衡量,命中率越高说明缓存效果越好。
- 响应时间:记录从客户端发起请求到接收到响应的时间,通过监控平均响应时间、最大响应时间等指标评估性能。
- 吞吐量:统计单位时间内系统能处理的请求数量。
- 稳定性监控:
- Redis 状态监控:监控 Redis 的内存使用、连接数、CPU 使用率等指标,及时发现 Redis 性能瓶颈。
- 服务节点状态监控:监控服务节点的 CPU、内存、网络等资源使用情况,以及服务节点的可用性,若有节点故障及时报警并进行故障转移。
- 缓存数据一致性监控:定期检查不同服务节点缓存数据是否一致,可通过抽样对比等方式实现。