面试题答案
一键面试架构设计
- 缓存层:使用Redis作为缓存,采用集群部署方式提高可用性和性能。在缓存中设置合理的过期时间,对于热点数据可以适当延长过期时间。
- 存储层:以MySQL作为数据存储,采用主从架构保证数据的高可用性和读写分离,提高读取性能。
- 布隆过滤器:在缓存和存储层之间引入布隆过滤器。布隆过滤器用于快速判断某个键是否存在于数据库中。当请求到达时,先查询布隆过滤器,如果判断不存在,则直接返回,不再查询缓存和数据库,有效防止大量不存在数据的请求穿透到数据库。
数据同步机制
- 双写模式:当数据发生变化时,先更新MySQL数据库,然后再更新Redis缓存。这样可以保证数据在数据库中的持久性,同时尽快更新缓存,使缓存数据保持最新。
- 异步更新:为了提高性能,可以采用异步更新的方式。例如,使用消息队列(如Kafka)。在更新MySQL成功后,发送一条消息到消息队列,由消息队列的消费者负责更新Redis缓存。这种方式可以避免因更新缓存失败导致的业务阻塞,同时保证数据的最终一致性。
极端情况处理策略
- Redis集群故障:
- 故障检测:使用Redis Sentinel或Redis Cluster的内置机制进行故障检测。一旦发现某个节点故障,自动进行故障转移。
- 缓存重建:当Redis集群恢复后,需要重建缓存。可以采用两种方式,一是启动时全量加载数据库数据到缓存;二是在请求时,发现缓存缺失,从数据库加载并回种到缓存。为了避免大量请求同时穿透到数据库,可以采用限流和分布式锁的方式,保证同一时间只有少量请求去加载数据库数据。
- MySQL主从切换:
- 切换感知:应用程序可以通过数据库中间件(如MyCat、ShardingSphere等)感知MySQL主从切换。中间件会自动调整读写路由,将写请求切换到新的主库,读请求切换到从库。
- 数据同步修复:主从切换可能会导致数据短暂不一致,需要通过MySQL的自动同步机制来修复。同时,应用程序在切换后一段时间内可以适当增加缓存的过期时间,减少对数据库的读取压力,等待数据同步完成,保证数据最终一致性。