Redis是大型架构的必备中间件,下面我重点详解Redis如何抗住百万并发@mikechen
非阻塞IO机制
Redis 的非阻塞 I/O ,是其高并发能力的关键。
与阻塞 I/O 不同,非阻塞 I/O 允许 Redis 在发起 I/O 操作(如读取客户端请求、或发送响应)后,立即返回。
还可以,继续处理其他任务,而无需等待操作完成。
非阻塞 IO 、与事件循环紧密结合。
只有在套接字被标记为可读/可写时才进行实际读写,避免任何长时间阻塞。
事件驱动设计
Redis基于Reactor模式的事件驱动模型,是其高并发性能的核心。
Redis 使用一个主循环监听客户端连接、命令执行等事件。
当 I/O 操作(如读写 socket)或定时任务触发时,事件被加入队列,Redis 按序处理。
事件处理完成后,立即返回到事件循环,继续监听新事件。
通过异步回调机制,Redis 在单线程中高效处理大量并发请求。
IO多路复用
Redis 利用 I/O 多路复用技术,通过单个线程监控多个 socket 连接的状态,高效处理并发请求。
Redis 在不同平台上,采用最合适的多路复用机制(Linux 上优先使用 epoll)。
epoll 能以 O(1) 的方式,处理大量连接就绪事件,减少遍历整个 fd 列表的开销,这也是 Redis 支持数万到百万并发连接的核心。
内存操作
Redis 数据全部存储在内存中,访问速度远超磁盘(微秒级 vs 毫秒级)。
并且,Redis还使用到了,高效数据结构。
比如:哈希表、跳跃表、压缩列表…等等,针对不同场景优化存储和查询。
而且,使用内存分配器(如 jemalloc)减少内存碎片,提高分配效率。
这使得Redis能够快速响应客户端的请求,从而更好的支撑高并发场景。
Redis集群扩展
虽然前面四点主要解决单实例的并发处理能力,但要实现更高吞吐(横向线性扩展)必须依赖集群化设计。
将数据按键分布到多个节点(Redis Cluster),从而把负载分摊到多台机器上。
客户端或代理可以通过一致性哈希将请求定向到对应分片,避免单点瓶颈。
通过复制将数据从主节点复制到若干从节点,从节点可以承担读请求,进一步提高整体读吞吐。