Redis的核心架构是单线程事件驱动模型,通过epoll实现高并发,数据结构如SDS、跳表、ziplist优化内存使用,AOF和RDB持久化确保数据安全,集群模式用gossip协议分片,源码中server.c管理主循环,t_string.c实现字符串命令,高效存储之道在于紧凑数据结构和惰性删除机制。
单线程模型详解
Redis采用单线程模型,避免了多线程的锁竞争问题。主线程负责处理客户端请求、事件循环和数据操作。事件循环基于ae.c中的文件事件处理器,使用epoll/kqueue/select等机制监听socket事件。单线程的优势在于无上下文切换开销,指令原子性保证,代码简洁易维护。
数据结构优化
Redis的字符串使用SDS(Simple Dynamic String),比C字符串更高效,支持二进制安全和预分配空间。哈希用ziplist或hashtable压缩小数据。列表用quicklist(ziplist链表)。集合用intset(整数集合)或skiplist(有序集合跳表)。这些结构在内存占用和访问速度间取得平衡。
内存管理机制
Redis内存分配器jemalloc减少碎片。对象共享机制复用小整数对象。惰性删除和主动reclaim回收内存。maxmemory政策如allkeys-lru驱逐最小使用键。源码中dict.c的hashtable扩容/收缩阈值控制内存峰值。
持久化源码解析
RDB通过rdb.c生成快照,fork子进程后台保存,避免阻塞主线程。AOF用aof.c记录写命令,支持bgrewriteaof重写压缩。混合持久化结合两者优势。恢复时优先加载AOF或RDB。
集群架构实现
Redis Cluster用16384哈希槽分片,cluster.c管理节点状态。gossip协议节点.c中busport交换信息,心跳检测故障。CRDB一致性哈希减少数据迁移。meet命令节点.c中加入集群。
主从复制优化
repl.c实现全量同步(RDB)和增量(replfeed)。部分重同步用psync优化。主节点repl_backlog缓冲最近命令,从节点断开重连时快速追赶。并行同步提升吞吐。
模块系统扩展
module.c加载.so模块,注册命令和数据类型。RedisModule_Alloc分配内存,OnKeyspaceEvent事件通知。Lua脚本redis.call集成扩展逻辑。
FAQ
Q: Redis为什么用单线程?
A: 单线程避免锁竞争,事件驱动高效处理IO多路复用,适合内存操作场景。
Q: 怎么优化Redis内存使用?
A: 用小数据结构如ziplist,设置maxmemory-lru,定期内存分析工具redis-cli memory。
Q: RDB和AOF哪个更好?
A: RDB快照备份好,AOF持久性强,实际用混合模式。
Q: Redis集群怎么扩容?
A: cluster meet加节点,cluster reshard迁移槽,数据自动均衡。