Redis的核心架构是单线程事件驱动模型,这让它在高并发场景下表现出色。面试时要强调:主线程负责读写,IO多路复用处理事件,避免上下文切换。哨兵模式用于高可用,主从复制异步进行,读写分离减轻主节点压力。集群模式用16384个槽位哈希分片,自动故障转移。实战妙计:用pipeline批量命令减少RTT,用Lua脚本原子执行复杂逻辑,避免竞态。持久化选RDB快照备份,AOF日志重放恢复,根据场景混合用。内存优化用ziplist压缩小集合,bigkey拆分防阻塞。
单线程模型详解
Redis单线程模型是其高性能关键,避免了多线程的锁竞争。事件循环用epoll/select处理socket事件,主线程非阻塞执行命令。面试常问:为什么单线程快?答:无锁、无上下文切换,CPU缓存友好。多线程IO在6.0引入,但核心仍单线程。实战:监控slow log,优化慢命令如KEYS*用SCAN代替。
主从复制与哨兵
主从复制:slaveof命令全量同步+增量PSYNC,主节点fork子进程发RDB,从节点清空加载后命令流式同步。断线重连用replconf ack心跳。哨兵:选举通过raft-like算法,客观下线需多数票+延迟确认,主观超时客观下线分离。实战经验:部署3-5哨兵奇数,避免脑裂;从节点只读配置min-slaves-to-write。
集群架构深入
Redis Cluster:CRC16(key)%16384定槽,{hash_tag}支持多key同一槽。gossip协议节点通信,心跳每秒10次,故障时多数派选举master。迁移槽用migrate命令。妙计:预分片均匀分布,避免热点key用twemproxy或envoy代理。面试脱颖:谈cluster meet/bootstap,手动reshard实战。
内存管理与淘汰
内存分jemalloc管理,对象编码int/str/ziplist/ziplist优化空间。淘汰策略:volatile-lru/ttl键LRU,allkeys-random随机。bigkey问题:用redis-cli --bigkeys扫描,拆分list用listpack,hash用hashziplist。实战:设置maxmemory-policy,监控used_memory_rss,主动expire键释放内存。
持久化机制实战
RDB:save/BGSAVE,fork后子进程dump,fsync策略everysec安全。AOF:appendfsync everysec,BGREWRITEAOF重写压缩。混合:AOF用RDB快照更快恢复。面试细节:fork耗时长大内存慎用,AOF重写阻塞风险用no-appendfsync-on-rewrite。妙计:脚本定时dump+备份异地。
高可用与性能优化
高可用:哨兵+集群,VIP漂移或proxy如twemproxy。性能:pipeline降网络往返,MULTI/EXEC事务原子但不ACID,WATCH乐观锁。Lua脚本无网络开销。实战经验:热点key本地缓存,布隆过滤器防穿透,连接池复用连接。监控INFO/memory/stats,latency doctor诊断。
FAQ
Q: Redis单线程如何高并发?
A: 事件驱动非阻塞IO,单线程处理万级连接,命令O(1)快速。
Q: 主从延迟怎么处理?
A: 监控repl_lag,读从节点带延迟容忍,用wait命令同步。
Q: 集群key分布不均怎么办?
A: 用hash tag {}确保相关key同槽,定期checkslot均衡。
Q: 内存不足时怎么选淘汰策略?
A: 数据集全内存用allkeys-lru,部分有TTL用volatile-lru。