Redis如何处理并发请求
小樊
40
2026-01-03 03:04:41
核心机制
- 单线程命令执行 + I/O 多路复用:Redis 的核心命令在单线程中串行执行,避免锁竞争与上下文切换;同时通过I/O 多路复用(如 epoll/kqueue/select)在一个线程里同时监听大量连接,配合非阻塞 I/O与事件循环高效分发就绪事件,支撑高并发连接与吞吐。自 Redis 6.0 起引入多线程网络 I/O(读取请求、写回响应),但命令执行依旧单线程,既提升网络吞吐又保持数据一致性。Redis 还使用多种高效数据结构(如哈希表、跳表、压缩列表/快速列表等),多数命令时间复杂度为 O(1)/O(log N),进一步降低单条命令的执行时间。
并发安全与复合操作
- 单命令原子性:单个 Redis 命令具备原子性,多个客户端并发对同一 key 发起单条命令时无需额外同步。
- 多 key/读写混合需额外控制:跨 key 或“先读后写”的业务,需要用 MULTI/EXEC 事务或Lua 脚本将多个操作打包,在服务端以原子方式执行;必要时结合 WATCH 实现乐观锁,避免并发更新丢失。
- 顺序与隔离:事件循环按先到先服务处理请求,来自同一连接或不同连接的命令在单线程下顺序执行,天然隔离,避免传统多线程的内存可见性与锁问题。
扩展并发能力的工程方案
- 读写分离与复制:通过主从复制将读压力分摊到从节点,写仍由主节点承担,显著提升读并发能力。
- Redis Cluster 分片:数据按哈希槽(0~16383)分布到多个节点,实现水平扩展与并行处理;集群内主从配置可提供自动故障转移。
- 高可用:Sentinel 负责健康监控与自动故障转移,在主机异常时提升从节点为主,保障服务连续性。
- 持久化不阻塞主流程:RDB/AOF 持久化以异步为主,可配置策略降低对命令执行的影响,兼顾性能与数据安全。
客户端侧优化实践
- Pipeline 批量:将多个命令打包在一次网络往返中执行,显著降低 RTT 并提升吞吐。
- Lua 脚本:把复杂逻辑下沉到服务端,减少网络往返并保证原子性(如秒杀、限流)。
- 连接池与超时重试:复用连接、合理设置超时与重试,避免频繁建连与长阻塞。
- 监控关键指标:持续关注 QPS、延迟、连接数、内存使用 等,结合如 Prometheus + Grafana 做容量与异常预警。