redis 为啥那么快?redis 单进程轻松并发 10w+ 。
本文将从这几个角度进行分析:单进程,单线程,多线程,多进程,多实例,集群。
1. 单进程
redis 核心逻辑在单进程主线程里实现。
1.1. 单线程
特点 | 描述 |
---|---|
内存 | redis 一般作为缓存,它的数据存储在内存,cpu 访问内存速度非常快。 |
哈希表 | redis 是 Nosql 数据库,通过哈希表(k/v)管理数据,查询数据时间复杂度是 O(1)。 |
多路复用技术 | redis 运用了高效的多路复用技术对 I/O 事件进行管理。例如:Linux 用 epoll 。 |
非阻塞异步 I/O | 主逻辑在单进程,单线程,需要尽量减少有阻塞的缓慢操作,所以网络通信大部分设置为非阻塞模式。 |
pipeline | 支持客户端/服务端一次发送/接收处理多个命令。(详细请参考官方文档) 1. 减少了客户端和服务端通信的往返时间(RTT –> Round-Trip Time)。 2. 也减少了读写数据的系统调用次数,降低系统性能损耗。 |
1.2. 多线程
redis 有部分场景需要子进程和子线程辅助。
功能 | 描述 |
---|---|
数据回收 | redis 惰性异步释放数据。释放数据量比较大的数据集,redis 会通过后台线程(bio)进行回收处理。主线程先从哈希表删除 key,切断数据与主逻辑的联系,再把数据(value)放进后台线程里异步释放,这样不影响主线程主业务的运行。 |
通信 | redis 6.0 增加多线程读写网络事件功能。 |
2. 多进程
redis 主服务是单进程的。单进程不能充分利用系统 cpu 核心,可以通过多进程方式提高系统的并发能力。
进程关系 | 描述 |
---|---|
子进程 | redis 有持久化功能:aof 和 rdb 方式。持久化需要将内存数据写入磁盘,写磁盘是缓慢的 I/O,为了避免影响主进程性能,有些需要对整个内存数据集落地的操作,会通过 fork 子进程进行工作。例如 aof 的 rewrite 操作,rdb 持久化。 |
主从节点 | (master/slave)redis 主从节点通过数据复制,使得主服务有多个数据副本实例,实现读写分离。 |
3. 高可用集群
对于一些超高并发服务场景,单个 master 往往无法满足需求,那么可以对数据进行分片处理,从逻辑上创建多个 master 协调工作,这样 redis 集群应运而生,以下是一些比较常用的集群管理方案:
模式 | 描述 |
---|---|
哨兵 | redis 内部功能,类似于中心服务,管理 redis 节点群;它只负责 redis 节点的监控管理,没有数据分片功能;数据分片逻辑需要用户自己实现。 |
cluster | 内部功能,cluster 无中心架构,通过 Gossip 协议,多个节点相互关联建立成一个整体,支持节点监控和数据分片。 |
proxy | 第三方代理(例如 codis),支持 redis 节点监控,数据分片,节点扩容缩容,可视化页面管理等功能。 |
4. 小结
从以上几个视角分析了 redis 快的主要原因。
天下大事,必作于细,redis 的快,还建立在很多细节的优化上,如要详细理解,须要通过阅读源码。