Redis快的秘诀

导读:redis是一个高性能的key-value数据库 , 在实际开发中常被用于做分布式缓存、消息队列等 。Redis如此受欢迎这其中一个重要原因是因为其读写数据速度快 , 能支持10w+qps(每秒查询率) 。那么Redis快的原因是什么?文本从以下三点展开讨论

  • 数据存到内存
  • 采用单线程模型
  • 使用多路I/O复用的I/O模型

Redis快的秘诀

文章插图
 
1、数据存到内存
Redis数据存在内存中且绝大部分请求是对内存操作 , 因此在进行读写数据操作的时候不会受到硬盘 I/O 速度的限制 , 速度快 。
补充:Redis也提供了两种数据持久化方式:AOF(可回放的命令日志)与 RDB(内存快照) 。两种持久化方式各有优缺点 , 从Redis4.0开始允许使用RDB-AOF混合持久化的方式 , 这种方式结合了两者的优点 。这里本文不做具体讨论 。
2、采用单线程模型
2.1 文件事件处理器
Redis 服务器是一个事件驱动程序 ,  处理的事件分为时间事件和文件事件 。Redis基于reactor设计模式开发了文件事件处理器用于高效地处理事件 。
它的组成结构为4部分:多个套接字(socket)、IO多路复用程序、文件事件分派器、事件处理器(如下图所示) 。因为这个文件处理器是单线程的 , 所以Redis是单线程模型 。
Redis快的秘诀

文章插图
文件事件处理器
2.2单线程模型的优点
通过采用单线程避免了多线程中的上下文切换损耗及不需要考虑锁问题以及锁问题带来的损耗等 。
补充:Redis对数据事件的处理是单线程的 , 但它在其他模块仍用了多个线程 , 如异步将数据写入磁盘进行持久化操作 。
3、使用多路I/O复用的I/O模型
3.1 概念介绍
I/O模型分为以下五种:
  • 同步阻塞I/O
  • 同步非阻塞I/O
  • IO多路复用(Reactor设计模式也称为异步阻塞IO , 例子:JAVA的Selector、linux的epoll)
  • 信号驱动I/O模型
  • 异步非阻塞I/O(Proactor设计模式)
在“Redis使用多路I/O复用模型”中“多路”指的是多个Socket连接 , “复用”指的是复用同一个线程 。采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求 。(关于I/O模型的讲解将会在以后的文章里做详细讨论 , 感兴趣的朋友欢迎后续阅读与讨论)
Redis快的秘诀

文章插图
 
3.2 I/O多路复用模型在Redis中的应用
Redis使用epoll同时监听多个Socket连接 , 并给不同Socket关联不同的处理程序 。当被监听的Sokcet准备好连接应答、请求、应答、关闭等操作时 , 就会产生对应的文件事件 。这时文件事件处理器就会调用Socket之前关联好的事件处理器来处理这些事件 。
4.总结
Redis之所以快其中主要三个原因为:数据存到内存、采用单线程模型避免了些不必要的损耗、使用多路I/O复用的I/O模型让单个线程高效的处理多个连接请求 。快也还有包括其他的原因如数据模型等 。

【Redis快的秘诀】


    推荐阅读