Redis的高性能核心在于其单线程事件驱动模型和高效的数据结构实现。通过分析server.c中的aeEventLoop,Redis使用epoll/kqueue/select实现非阻塞I/O,避免了多线程的锁竞争。内存优化主要依赖SDS(Simple Dynamic String)和ziplist等紧凑结构,减少内存碎片。对于并发处理,Redis 6.0引入了多线程I/O,但命令执行仍单线程,确保原子性。实战中,优化内存使用率可通过maxmemory-policy allkeys-lru和hash-max-ziplist-entries配置,解决高并发下的内存膨胀和延迟问题。
Redis内存管理机制详解
Redis的内存分配器jemalloc在多核环境下表现优异,能有效减少碎片。源码中t_string.c展示了SDS的实现:prealloc空间预分配、len和free字段精确记录,避免strcpy开销。字典(dict.c)使用渐进式rehash,渐进式扩展哈希表,防止阻塞。内存优化实战:监控used_memory_rss和used_memory峰值,使用MEMORY DOCTOR命令诊断问题。
Redis单线程模型与并发优化
在redisServer.c中,main函数初始化事件循环,processCommand函数处理客户端请求。单线程避免了CAS和锁,但I/O瓶颈通过多路复用解决。Redis 6引入threaded I/O,将读写操作offload到后台线程,基准测试显示QPS提升100%。并发难题解决:使用pipeline批量命令,减少RTT;cluster模式分片提升吞吐。
数据结构源码剖析:SDS与跳表
sds.h定义了sdshdr结构,buf数组后接空字节,便于C字符串操作。ziplist实现list/set/zset的内存紧凑存储,逐节点遍历避免指针开销。跳表(t_zset.c)概率层级构建,平均O(log N)查找。实战优化:对于小数据使用ziplist,超过阈值转为hashtable/skiplist,平衡内存与性能。
高并发下的持久化与AOF重写
rdb.c和aof.c处理持久化。fork子进程生成RDB快照,主进程继续服务。AOF重写(bgrewriteaof)使用子进程,生成新AOF文件时采用fsync策略。源码中ae.c事件循环集成定时任务,解决阻塞。内存优化:调整auto-aof-rewrite-percentage,控制重写触发,减少磁盘I/O对内存的影响。
Redis Cluster源码解析
cluster.c实现分布式一致性哈希,16384槽位CRC16映射键。gossip协议(clusterCron)心跳检测节点状态,故障转移通过clusterFailover。并发处理:每个节点单线程,但跨节点并行。实战:使用MIGRATE命令热迁移槽,优化内存分布。
实战案例:内存泄漏排查
通过INFO memory监控evicted_keys和keyspace_hits。源码valgrind支持下编译,检测泄漏。常见问题:未释放client buffer,使用CLIENT KILL关闭闲置连接。优化脚本:cronjob执行MEMORY PURGE。
FAQ
Q: Redis单线程如何处理高并发?
A: 依赖非阻塞I/O和多路复用器,单线程顺序执行命令避免锁。
Q: 如何优化Redis内存使用?
A: 配置maxmemory和eviction策略,使用紧凑数据结构如ziplist。
Q: AOF和RDB哪个更好?
A: RDB快照适合备份,AOF耐久性强,混合使用最佳。
Q: Redis 7的新特性对并发有何提升?
A: 改进多线程I/O和函数API,提升吞吐和开发效率。