NoSql之Redis系列四: Redis为什么这么快之服务器事件驱动

前言

Redis 是使用 C语言编写的 key-value 数据库, 操作速度极快, 整体来说, 可以从数据结构和服务器事件驱动两个方面类来解释. 下面就介绍redis的服务器事件驱动.

Redis 服务器事件驱动类型

  • 文件事件 (file event) Redis 通过套接字连接客户端, 文件事件就是服务器对套接字的抽象.
  • 时间事件 (time event) 服务器中的一些操作需要定时执行, 时间事件就是服务器对这类型操作的抽象.

文件事件(file event)

Redis 使用了 Reactor 模式来开发自己的网络事件处理器, 这里叫文件事件处理器, 其特点是

  1. 使用 IO多路复用(multiplexing) 程序来同时监听多个套接字, 并根据套接字目前的执行任务来为套接字关联不同的事件处理器.
  2. 当被监听的套接字准备好执行 连接(accept), 读取(read), 写入(write), 关闭(close)时, 就会产生对应的文件事件, 网络事件处理器就是调用关联的事件处理器处理事件.
  3. 事件处理器是单线程方式运行, 通过使用IO多路复用程序来监听多个套接字, 这样即实现了高效网络通信, 又方便与Redis中其他单线层模块对接, 也保持了设计的简单性.

文件事件构成

在这里插入图片描述

  1. 套接字Socket
  2. IO多路复用程序 (Reactor 模式)
    主要将1的套接字放入一个队列, 然后有序同步的将套接字传输给文件事件分派器, 当上一个套接字处理完毕后, 再继续传输下一个套接字.
    主要实现是 利用select, poll, epoll 同时监察多个IO流, 空闲时阻塞, 有IO流时, 轮训一遍所有流并按照顺序依次处理, 避免了大量无用操作. 提高了整体IO效率.
  3. 文件事件分派器dispatcher
  4. 事件处理器

时间事件

  • 定时事件: 指定时间之后执行一次.
  • 周期事件: 间隔时间执行一次.
    周期事件是一个无序的链表, 每个节点由一个编号, 一个时间戳, 一个处理事件构成. 遍历一次曾可以保证所有到达时间的事件全部处理.

总结 为什么这么快

  1. Redis 是使用内存操作
  2. Redis 的IO 因为使用了多路复用模型, 非阻塞IO. 所以在IO上非常高效;
  3. Redis 基于内存操作, 所以CPU不是Redis的瓶颈, 所以省去了多线程的加锁, 竞争, 切换等的性能消耗.
  4. Redis 中所有的数据结构都是根据KeyValue的具体类型而定, 非常高效.

参考资料

Redis 设计与实现

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值