
一、设计哲学根源:目标驱动架构选择
(一)Redis:从缓存到数据库的功能进化
1. 复杂功能集的必然选择
- 数据结构多样性:支持String、List、Hash、Set、ZSet、HyperLogLog、Geo等9种数据结构
- 企业级特性:
- 持久化:RDB快照、AOF日志
- 事务:单线程保证原子性(MULTI/EXEC)
- 脚本:Lua脚本支持复杂业务逻辑
- 集群:Redis Cluster自动分片
- 设计约束:复杂功能需要统一的上下文环境,单线程避免多线程同步复杂性
2. 低延迟优先的性能模型
- 核心指标:Redis单线程处理能力可达10万QPS(官方测试数据)
- 延迟敏感场景:
- 实时计数器(如微博点赞)
- 实时排行榜(ZSet有序集合)
- 分布式锁(SET NX原子操作)
(二)Memcached:极简主义的纯粹缓存
1. 单一功能定位
- 数据模型:仅支持Key-Value存储,Value最大1MB
- 操作集合:仅支持GET/SET/DELETE等基础命令(约20个命令)
- 设计目标:极致吞吐量,牺牲功能换取性能
2. 高吞吐场景的架构选择
- 典型应用:
- 电商商品列表页缓存(高并发读)
- 内容分发网络(CDN)的边缘缓存
- 分布式Session存储(简单读写)
二、性能优化维度:单线程与多线程的博弈
(一)CPU利用策略
维度 | Redis单线程 | Memcached多线程 |
---|
核心瓶颈 | 网络I/O(占比70%+) | CPU计算(多核利用率) |
指令执行 | 单线程顺序执行(无上下文切换) | 多线程并行处理(线程池模型) |
CPU亲和性 | 单线程绑定单核,避免CPU缓存失效 | 多线程负载均衡,充分利用多核 |
1. Redis的单线程性能密码
- 非阻塞I/O多路复用:
- 基于epoll/kqueue的事件驱动模型
- 单线程处理10万级并发连接(文件描述符FD limit可达10万+)
- 零拷贝技术:
- 响应大体积数据时(如RDB文件传输)使用sendfile()避免内存拷贝
2. Memcached的多线程扩展方案
- 线程池架构:
- 主线程负责监听端口,子线程处理具体请求
- 每个子线程独立管理连接队列(减少锁竞争)
- CAS机制:
- 乐观锁实现原子更新(Compare-And-Swap)
- 避免多线程写冲突(适用于计数器场景)
(二)内存管理策略
1. R