导读:redis是一个高性能的key-value数据库 , 在实际开发中常被用于做分布式缓存、消息队列等 。Redis如此受欢迎这其中一个重要原因是因为其读写数据速度快 , 能支持10w+qps(每秒查询率) 。那么Redis快的原因是什么?文本从以下三点展开讨论
- 数据存到内存
- 采用单线程模型
- 使用多路I/O复用的I/O模型
文章插图
1、数据存到内存
Redis数据存在内存中且绝大部分请求是对内存操作 , 因此在进行读写数据操作的时候不会受到硬盘 I/O 速度的限制 , 速度快 。
补充:Redis也提供了两种数据持久化方式:AOF(可回放的命令日志)与 RDB(内存快照) 。两种持久化方式各有优缺点 , 从Redis4.0开始允许使用RDB-AOF混合持久化的方式 , 这种方式结合了两者的优点 。这里本文不做具体讨论 。
2、采用单线程模型
2.1 文件事件处理器
Redis 服务器是一个事件驱动程序 , 处理的事件分为时间事件和文件事件 。Redis基于reactor设计模式开发了文件事件处理器用于高效地处理事件 。
它的组成结构为4部分:多个套接字(socket)、IO多路复用程序、文件事件分派器、事件处理器(如下图所示) 。因为这个文件处理器是单线程的 , 所以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设计模式)
文章插图
3.2 I/O多路复用模型在Redis中的应用
Redis使用epoll同时监听多个Socket连接 , 并给不同Socket关联不同的处理程序 。当被监听的Sokcet准备好连接应答、请求、应答、关闭等操作时 , 就会产生对应的文件事件 。这时文件事件处理器就会调用Socket之前关联好的事件处理器来处理这些事件 。
4.总结
Redis之所以快其中主要三个原因为:数据存到内存、采用单线程模型避免了些不必要的损耗、使用多路I/O复用的I/O模型让单个线程高效的处理多个连接请求 。快也还有包括其他的原因如数据模型等 。
【Redis快的秘诀】
推荐阅读
- 瘦腰最快的运动有哪些呢?
- 喝茶秘诀 早红午绿晚间黑
- Redis内存又不够用了?教你几种集群方案轻松甩掉存储难题
- 让Mac速度变快的八个方法
- Redis实现分布式锁与Zookeeper实现分布式锁区别
- 运动减肥最快的方法有什么?
- 基于redis来实现的分布式锁
- 解析redis备份文件rdb的两种方法及对比
- Redis如何保证接口的幂等性?我前后看了10遍,果断收藏
- 张钧甯|“日版张钧甯”田中美奈实逆龄秘诀大公开!好肌肤离不开5个秘诀