面试题答案
一键面试整体架构设计思路
- 数据分片:
- 哈希分片:采用一致性哈希算法,将数据的键通过哈希函数映射到一个固定的哈希环上。例如,对键使用
CRC16
等哈希算法计算哈希值,根据哈希值在环上确定存储节点。这样当节点增加或减少时,只有部分数据需要迁移,减少数据重分布的开销。 - 范围分片:按照数据的某个属性范围进行分片,如时间范围、ID 范围等。例如按时间将数据分为不同时间段,每个时间段的数据存储在不同的 Redis 分片上。这种方式适用于有明显范围特征的数据。
- 哈希分片:采用一致性哈希算法,将数据的键通过哈希函数映射到一个固定的哈希环上。例如,对键使用
- 处理读写冲突:
- 读写锁:使用 Redis 的
SETNX
命令实现简单的读写锁机制。写操作前获取写锁,读操作可在写锁未被占用时获取读锁。写锁独占资源,读锁可共享。但这种方式性能有一定局限,在高并发下锁竞争可能严重。 - 乐观锁:对每个数据设置版本号,写操作时比较版本号。例如,读取数据时同时获取版本号
V1
,写操作时带上V1
,如果当前版本号还是V1
,则更新数据并更新版本号;否则重试。这样可减少锁的争用,提高并发性能。
- 读写锁:使用 Redis 的
- 优化缓存命中率以应对高并发:
- 预取策略:根据业务规律,提前将可能被访问的数据加载到缓存中。如在电商促销前,提前将热门商品信息缓存。
- 缓存淘汰策略:使用
LRU
(最近最少使用)、LFU
(最不经常使用)等策略。LRU
淘汰最长时间未被访问的数据;LFU
淘汰访问频率最低的数据。根据业务数据访问特点选择合适策略,如对于热点数据适合LFU
,普通数据LRU
即可。 - 分级缓存:采用多级缓存,如一级缓存使用内存更快的 Redis,二级缓存使用容量更大但速度稍慢的分布式缓存(如 Memcached)。先从一级缓存读取,未命中再访问二级缓存,减少对后端存储的压力。
扩展性方面的考虑
- 水平扩展:基于一致性哈希的数据分片方式,在需要扩展时,可直接添加 Redis 节点。一致性哈希算法能自动将部分数据迁移到新节点,对业务透明。例如当业务量增长,添加新的 Redis 服务器节点,只需将其加入哈希环,系统会自动调整数据分布。
- 负载均衡:使用专门的负载均衡器(如 Nginx、HAProxy 等)将读写请求均匀分配到各个 Redis 分片节点上。负载均衡器可根据节点的负载情况动态调整请求分配,保证每个节点的负载相对均衡,提高整体性能。
容错性方面的考虑
- 主从复制:每个 Redis 分片节点采用主从复制架构,主节点负责读写,从节点复制主节点数据。当主节点故障时,从节点可通过选举机制晋升为主节点,保证服务的可用性。例如 Redis Sentinel 可自动监控主节点状态,在主节点故障时自动进行故障转移。
- 数据持久化:采用
RDB
(快照)和AOF
(追加式文件)两种持久化方式。RDB
定期对内存数据进行快照保存,AOF
记录每一个写操作。这样即使节点故障重启,也能通过持久化文件恢复数据,减少数据丢失。