一、Redis特点
- 特性:速度快、基于键值对的数据结构服务器、功能丰富、简单稳定、客户端语言多、持久化、主从复制、支持高可用和分布式
- 单线程架构:redis使用单线程架构和I/O多路复用模型来实现高性能的内存数据库服务。一条命令从客户端到服务端不会立刻被执行,所有命令都会进入一个队列中,然后逐个被执行。(执行顺序不确定的)。
单线程如何满足线上运行速度?
- 纯内存访问:所有数据放在内存中,响应时长大约100纳秒。
- 非阻塞I/O,使用epoll作为I/O多路复用技术的实现,再加上Redis自身的事件处理模型将poll中的连接、读写、关闭都转换为事件,不在网络I/O上浪费过多的时间。
- 单线程避免了线程切换和竞态产生的消耗。
二、事件
Redis服务器是一个事件驱动程序。处理以下两类事件:
- 文件事件:Redis服务器通过套接字与客户端进行连接,文件事件就是服务器对套接字操作的抽象。
- 时间事件:服务器对定时操作的抽象。
1.文件事件
Redis 基于Reactor模式开发了自己的网络事件处理器即文件事件处理器
文件事件处理器使用I/O多路复用程序来同时监听多个套接字,并根据套接字目前执行的任务来为套接字关联不同的事务处理器。
当被监听的套接字准备好执行连接应答、读取、写入、关闭等操作时,与操作相对应的文件事件就会产生,这时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件。
-
文件事件处理器 由四个部分组成:套接字、I/O多路复用程序、文件事件分派器以及事件处理器 I/O多路复用程序总是会将所有产生事件的套接字放到一个队列里面,然后通过这个队列以有序、同步、每次一个套接字的方式向文件事件分派器传送套接字。当上一个套接字产生的事件被处理完毕之后,I/O多路复用程序才会继续向文件事件分派器传送下一个套接字。
-
I/O多路复用程序 I/O多路复用程序的功能是通过包装常见的select、epoll、evport和kqueue这些I/O多路复用函数库来实现的。
2.时间事件
- 分类
- 定时事件:指定时间执行一次。
- 周期性事件:每隔一段时间执行一次。
目前Redis只使用周期性事件,而没有使用定时事件。 一个事件时间主要由三个属性组成:
1)id:服务器为时间事件创建的全局唯一ID
2) when:毫秒精度的UNIX时间戳,记录了时间事件的到达时间
3) timeProc:时间事件处理器,一个函数
- 实现 服务器将所有时间事件都放在一个无序链表中,每当时间事件执行器运行时,遍历整个链表,查找所有已到达的时间事件,并调用相应的事件处理器。(该链表为无序链表,不按when属性的大小排序)