Redis单线程模型详解
1. Redis单线程模型
Redis 基于 Reactor 模式来设计开发了自己的一套高效的事件处理模型 (Netty 的线程模型也基于 Reactor 模式,Reactor 模式不愧是高性能 IO 的基石),这套事件处理模型对应的是 Redis 中的文件事件处理器(file event handler)。
由于文件事件处理器(file event handler)是单线程方式运行的,所以我们一般都说 Redis 是单线程模型。
2. 既然是单线程,那怎么监听大量的客户端连接呢?
Redis 通过IO 多路复用程序 来监听来自客户端的大量连接(或者说是监听多个 socket),它会将感兴趣的事件及类型(读、写)注册到内核中并监听每个事件是否发生。
这样的好处非常明显:
I/O 多路复用技术的使用让 Redis 不需要额外创建多余的线程来监听客户端的大量连接,降低了资源的消耗(和 NIO 中的
Selector
组件很像)。
另外, Redis 服务器是一个事件驱动程序,服务器需要处理两类事件:
- 文件事件;
- 时间事件。
时间事件不需要多花时间了解,我们接触最多的还是 文件事件(客户端进行读取写入等操作,涉及一系列网络通信)。
《Redis 设计与实现》有一段话是如是介绍文件事件的:
Redis 基于 Reactor 模式开发了自己的网络事件处理器:这个处理器被称为文件事件处理器(file event handler)。文件事件处理器使用 I/O 多路复用(multiplexing)程序来同时监听多个套接字,并根据套接字目前执行的任务来为套接字关联不同的事件处理器。
当被监听的套接字准备好执行连接应答(accept)、读取(read)、写入(write)、关 闭(close)等操作时,与操作相对应的文件事件就会产生,这时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件。
虽然文件事件处理器以单线程方式运行,但通过使用 I/O 多路复用程序来监听多个套接字,文件事件处理器既实现了高性能的网络通信模型,又可以很好地与 Redis 服务器中其他同样以单线程方式运行的模块进行对接,这保持了 Redis 内部单线程设计的简单性。
可以看出,文件事件处理器(file event handler)主要是包含 4 个部分:
- 多个 socket(客户端连接)
- IO 多路复用程序(支持多个客户端连接的关键)
- 文件事件分派器(将 socket 关联到相应的事件处理器)
- 事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)
3. Redis为什么没有使用多线程?
虽然说 Redis 是单线程模型,但是,实际上,Redis 在 4.0 之后的版本中就已经加入了对多线程的支持。
不过,Redis 4.0 增加的多线程主要是针对一些大键值对的删除操作的命令,使用这些命令就会使用主处理之外的其他线程来“异步处理”。
总的来说,Redis 6.0 之前主要还是单线程处理。Redis6.0 之前 为什么不使用多线程?
- 单线程编程容易,开销小,并且更容易维护;
- Redis 的性能瓶颈不在 CPU ,主要在内存和网络;
- 多线程就会存在死锁、线程上下文切换等问题,甚至会影响性能。
4. Redis6.0之后为何引入多线程?
Redis6.0 引入多线程主要是为了提高网络 IO 读写性能,因为这个算是 Redis 中的一个性能瓶颈(Redis 的瓶颈主要受限于内存和网络)。
虽然,Redis6.0 引入了多线程,但是 Redis 的多线程只是在网络数据的读写这类耗时操作上使用了,执行命令仍然是单线程顺序执行。因此,你也不需要担心线程安全问题。
Redis6.0 的多线程默认是禁用的,只使用主线程。如需开启需要修改 redis 配置文件 redis.conf
:
io-threads-do-reads yes
开启多线程后,还需要设置线程数,否则是不生效的。同样需要修改 redis 配置文件 redis.conf
:
io-threads 4 #官网建议4核的机器建议设置为2或3个线程,8核的建议设置为6个线程
Redis单线程模型详解相关推荐
- Redis——单线程模型详解
前言:单线程模型 Redis客户端对服务端的每次调用都经历了发送命令,执行命令,返回结果三个过程.其中执行命令阶段,由于Redis是单线程来处理命令的,所有每一条到达服务端的命令不会立刻执行,所有 ...
- 深度历险:Redis 内存模型详解
Redis 是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说 Redis 是实现网站高并发不可或缺的一部分. 我们使用 Redis 时,会接触 Redis 的 5 种对象 ...
- Redis最全详解(一)——基础介绍
Redis介绍 redis是基于内存可持久化的日志型.Key-Value数据库.redis安装在磁盘,但是数据存储在内存.非关系型数据库NoSql.开源免费,遵守BSD协议,不用关注版权问题. red ...
- Reactor 模型详解
研究背景 其实我们在研究netty的时候我们必定绕不过NIO的,也必定必须研究一下这个Reactor模型的,如果不进行这个Reactor模型和NIO知识点的研究,那么我们必定掌握不了Netty的精髓, ...
- 【后端开发】Reactor 模型详解
研究背景 其实我们在研究netty的时候我们必定绕不过NIO的,也必定必须研究一下这个Reactor模型的,如果不进行这个Reactor模型和NIO知识点的研究,那么我们必定掌握不了Netty的精髓, ...
- Django MVT模型详解
MVT模型详解 ORM简介 使用MySql数据库 开发流程 使用数据库生成模型类 Model 定义模型 定义属性 字段类型 字段选项 关系 元选项 示例演示 测试数据 类的属性 管理器Manager ...
- 云风skynet-如何用skynet手撕万人同时在线游戏丨actor模型详解
如何用skynet手撕万人同时在线游戏 1. 多核并发编程 2. actor模型详解 3. 游戏实现 视频讲解如下,点击观看: 云风skynet-如何用skynet手撕万人同时在线游戏丨actor模型 ...
- Redis之数据类型详解分析
文章目录 1 Redis 1.1 概述 1.2 查看内部编码 1.3 String字符串 1.3.1 简介 1.3.2 应用常景 1.3.3 String内部编码 1.4 Hash散列 1.4.1 简 ...
- Redis底层数据结构详解
Redis底层数据结构详解 我们知道Redis常用的数据结构有五种,String.List.Hash.Set.ZSet,其他的集中数据结构基本上也是用这五种实现的,那么,这五种是Redis提供给你的数 ...
- COM单线程套间详解
COM单线程套间详解 一 简介 高级COM工程项目经常需要跨线程传递对象,以在不同线程中调这些对象方法,激发它们的事件.下面这篇文章针对具有基本的com知识(比如理解IUnkown和IDispatc ...
最新文章
- 双向非循环递增链表——插入,删除,清空
- __block和__weak修饰符的区别
- Intel Realsense D435 如何通过摄像头序列号重置hardware_reset()摄像头?
- python3随笔-相关系数
- sass学习记录及vue实践
- java 上传源码_和付费网盘说再见,跟着本文自己起个网盘(Java)
- stl vector 函数_vector :: crend()函数以及C ++ STL中的示例
- apollo 配置中心小结
- Oracle ODI 12c之多表联合查询以及定时任务设置
- mysql语法子查询_(十四)MySQL语法-子查询(二)
- 设计模式(九): 从醋溜土豆丝和清炒苦瓜中来学习模板方法模式(Template Method Pattern)...
- 9.屏幕宽高比判断(Screen.width,Screen.height)
- 开通微信支付(微信商户平台账户)流程及所需资料
- 【喜讯 · 喜讯】讲师自营销计划奖励又双叒叕来了!
- B001 - 基于STM32的智能生态鱼缸
- 专业办公套件WPS Office 2020 for Mac
- X86汇编常见的寄存器
- Ubuntu16.04升级 Ubuntu18.04
- HP C7000刀片服务器学习三
- 好的积分商城应该具备的功能