NoSql之Redis系列四: Redis为什么这么快之服务器事件驱动
NoSql之Redis系列四: Redis为什么这么快之服务器事件驱动
前言
Redis 是使用 C语言编写的 key-value 数据库, 操作速度极快, 整体来说, 可以从数据结构和服务器事件驱动两个方面类来解释. 下面就介绍redis的服务器事件驱动.
Redis 服务器事件驱动类型
- 文件事件 (file event) Redis 通过套接字连接客户端, 文件事件就是服务器对套接字的抽象.
- 时间事件 (time event) 服务器中的一些操作需要定时执行, 时间事件就是服务器对这类型操作的抽象.
文件事件(file event)
Redis 使用了 Reactor 模式来开发自己的网络事件处理器, 这里叫文件事件处理器, 其特点是
- 使用 IO多路复用(multiplexing) 程序来同时监听多个套接字, 并根据套接字目前的执行任务来为套接字关联不同的事件处理器.
- 当被监听的套接字准备好执行 连接(accept), 读取(read), 写入(write), 关闭(close)时, 就会产生对应的文件事件, 网络事件处理器就是调用关联的事件处理器处理事件.
- 事件处理器是单线程方式运行, 通过使用IO多路复用程序来监听多个套接字, 这样即实现了高效网络通信, 又方便与Redis中其他单线层模块对接, 也保持了设计的简单性.
文件事件构成
- 套接字Socket
- IO多路复用程序 (Reactor 模式)
主要将1的套接字放入一个队列, 然后有序同步的将套接字传输给文件事件分派器, 当上一个套接字处理完毕后, 再继续传输下一个套接字.
主要实现是 利用select, poll, epoll 同时监察多个IO流, 空闲时阻塞, 有IO流时, 轮训一遍所有流并按照顺序依次处理, 避免了大量无用操作. 提高了整体IO效率. - 文件事件分派器dispatcher
- 事件处理器
时间事件
- 定时事件: 指定时间之后执行一次.
- 周期事件: 间隔时间执行一次.
周期事件是一个无序的链表, 每个节点由一个编号, 一个时间戳, 一个处理事件构成. 遍历一次曾可以保证所有到达时间的事件全部处理.
总结 为什么这么快
- Redis 是使用内存操作
- Redis 的IO 因为使用了多路复用模型, 非阻塞IO. 所以在IO上非常高效;
- Redis 基于内存操作, 所以CPU不是Redis的瓶颈, 所以省去了多线程的加锁, 竞争, 切换等的性能消耗.
- Redis 中所有的数据结构都是根据KeyValue的具体类型而定, 非常高效.
参考资料
Redis 设计与实现