面试题答案
一键面试整体架构思路
- 分层架构:构建包含应用层、缓存层(Redis)、存储层(MySQL)的三层架构。应用层接收请求,先查询缓存层,若未命中再查询存储层,并将结果回种到缓存层。
- 读写分离:在MySQL层面采用主从复制实现读写分离,主库负责写操作,从库负责读操作,减轻主库压力。
Redis集群搭建
- 使用Redis Cluster:它是Redis的分布式解决方案,自带数据分片和高可用功能。每个节点负责一部分数据,节点之间通过Gossip协议交换状态信息。
- 节点部署:建议部署奇数个节点,如3个或5个,以确保在部分节点故障时仍能正常工作。可采用多机多节点部署方式提高可靠性。
数据分片策略
- 哈希分片:使用CRC16算法对数据的键进行哈希计算,再对节点数量取模,决定数据存储在哪个节点上。这种方式简单且分布均匀。
- 一致性哈希:引入虚拟节点概念,将数据键和节点映射到一个哈希环上。数据根据哈希值落在环上,顺时针找到的第一个节点即为存储节点。一致性哈希在节点增减时,仅影响少量数据的迁移。
与MySQL交互机制
- 缓存预热:系统启动时,将部分热点数据从MySQL加载到Redis中,减少首次查询的延迟。
- 写操作:应用层接收到写请求,先写MySQL主库,成功后再更新Redis缓存,确保数据一致性。可采用事务机制保证MySQL写操作的原子性。
- 读操作:应用层先查询Redis,若命中则直接返回;若未命中,查询MySQL从库,将结果存入Redis并返回。
应对高并发读写的方案
- 批量操作:在Redis中,使用管道(Pipeline)技术进行批量读写,减少网络开销,提高读写效率。
- 异步处理:对于写操作,可采用异步队列(如Kafka),将写请求先放入队列,再由后台线程异步处理,减轻应用层压力。
- 缓存雪崩:为Redis中的缓存设置不同的过期时间,避免大量缓存同时过期导致的高并发查询直接穿透到MySQL。可采用随机过期时间或阶梯式过期时间。
- 缓存穿透:使用布隆过滤器(Bloom Filter),在查询Redis前先判断数据是否存在,避免无效查询穿透到MySQL。布隆过滤器通过多个哈希函数将数据映射到一个位数组中,查询时判断数据对应的位是否都为1。