Redis 究竟是单线程还是多线程呢?
1 前言
Redis到底是单线程还是多线程的?
首先,Redis是一个高性能的分布式缓存中间件。其复杂性不言而喻,对于Redis整体而言肯定不是只有一个线程。
我们常说的Redis 是单线程,主要是指 Redis 在网络 IO和键值对读写是采用一个线程来完成的,这也是 Redis 对外提供键值存储服务的核心流程。但对于 Redis 的其他功能来说,比如持久化、异步删除、集群数据同步等,其实都是由额外的线程执行的。
2 为什么要融入多线程?
单线程的优势:
- 使用单线程可以避免频繁的上下文切换
- Redis 中有各种类型的数据操作,甚至包括一些事务处理,如果采用多线程,还可能因为加锁导致软件复杂度提升,更有可能会因为加解锁,甚至出现死锁,造成的性能损耗,所以使用单线程反而性能会更好
单线程的劣势:
- 无法发挥多核CPU的优势
- 当删除大建,会导致服务阻塞
- QPS达到瓶颈
基于上诉劣势,Redis也进行了相关优化,在4.0版本和6.0版本分别引入了Lazy Free和多线程IO。
3 Redis单线程模型
Redis基于Reactor模式开发了网络事件处理器,这个处理器被称为文件事件处理器。
文件事件处理器的四个重要组成部分:
- 多个套接字请求
- IO多路复用器
- 文件事件派发器
- 事件处理器
Redis客户端对服务端的每次调用都经历了发送命令,执行命令,返回结果三个过程。其中执行命令阶段,由于Redis是单线程来处理命令的,所有每一条到达服务端的命令不会立刻执行,所有的命令都会进入一个队列中,然后逐个被执行。并且多个客户端发送的命令的执行顺序是不确定的。但是可以确定的是不会有两条命令被同时执行,不会产生并发问题,这就是Redis的单线程基本模型,如下图所示。
4 带你理解Redis处理流程
4.1 Redis 4.0之前的事件处理流程
我们先介绍一下Redis( 4.0之前)的执行原理,我们通过IO多路复用器监听来自客户端的socket网络连接,然后由主线程进行IO请求的处理以及命令的处理,所有操作都是线性的,我们可以抽象的理解为下图。
4.2 Redis 4.0 之后加入Lazy Free机制
Redis 4.0 之前在处理客户端命令和IO操作时都是以单线程形式运行,期间不会响应其他客户端请求,但若客户端向Redis发送一条耗时较长的命令,比如删除一个含有上百万对象的Set键,或者执行flushdb,flushall操作,Redis服务器需要回收大量的内存空间,这事就会导致Redis服务阻塞,对于负载较高的缓存系统来说将会是个灾难。为了解决这个问题,在Redis 4.0版本引入了Lazy Free,目的是将慢操作异步化,这也是在事件处理上向多线程迈进了一步,其过程我们可以理解为下图。
4.3 Redis 6.0 之后将网络IO异步化
从以上的发展历程中,我们也能看出Redis 的瓶颈并不在CPU上,即使是单线程Redis也能做到很快的响应,除非是遇到个别极其耗时的命令,这一块我们的Redis也在4.0版本做出了优化,但是我们是不是能更进一步优化Redis呢?从上图中我们可以看出主线程不光处理大量的命令,还需要处理大量的网络IO,Redis6.0就是基于此,将IO操作交由其他线程处理,抽象的理解如下图所示。
Redis6.0的多线程默认是禁用的,只使用主线程。如需开启需要修改redis.conf配置文件:io-threads-do-reads yes
开启多线程后,还需要设置线程数,否则是不生效的。
线程数一定要小于机器核数。线程数并不是越大越好,官方认为超过了 8 个基本就没什么意义了。
设置线程数,修改redis.conf配置文件: io-threads 6
Redis 究竟是单线程还是多线程呢?相关推荐
- Redis 到底是单线程还是多线程?
1 Redis单线程问题 主要是指Redis的网络IO和键值对读写是由一个线程来完成的,Redis在处理客户端的请求时包括获取 (socket 读).解析.执行.内容返回 (socket 写) 等都由 ...
- 【Redis】到底是单线程还是多线程以及Redis为什么这么快?
文章目录 Redis到底是单线程还是多线程的? Redis为什么是单线程的? Redis为什么基于内存? 为什么要为Redis绑定某一固定CPU? Redis的多线程情况 Redis的单线程到底有多快 ...
- Redis为什么又引入了多线程?单线程不香了?
相信你一定不止一次见过Redis是单线程模式,不过说实话那只是个老版本,这个问题是一位老哥的大厂面试题,跟我分享了一下.想着自己就知道redis6.0以前一直都是单线程,到了6的版本才加入了多线程 ...
- Redis 属于单线程还是多线程?不同的版本有什么区别?
Redis 是普及率最高的技术之一,同时也是面试中必问的一个技术模块,所以从今天开始我们将从最热门的 Redis 面试题入手,更加深入的学习和了解一下 Redis. 我们本文的面试题是 Redis 属 ...
- Redis 5.0.8+常见面试题(单线程还是多线程、先更新缓存还是数据库、雪崩穿透击穿解决办法...)
Redis 6.0 保姆级教程(含微服务案例与完整面试题):https://www.yuque.com/yuxuandmbjz/redis Redis是单线程还是多线程 ?为什么这么设计 ? Redi ...
- Redis单线程和多线程
Redis单线程 Reids是单线程! Reids是单线程! Reids是单线程! Redis架构模型:Redis 基于 Reactor 模式来设计开发了自己的一套高效的事件处理模型 ,即文件事件处理 ...
- redis是单线程还是多线程?
1.Redis单线程 在一开始的时候,Redis采用的是单线程模型,因为Redis是一个基于内存的数据库,将所有的数据放入内存,所以使用单线程的操作效率是最高的,多线程会上下文切换消耗大量时间,对于内 ...
- Redis是单线程还是多线程问题
在学习redis的过程中,很多文章都说redis是单线程,但在官方给出的说明中显示,redis6.0已经引入了多线程,对此我找了许多文档,将学习过程整理记录下来. 1.Redis单线程 在一开始的时候 ...
- Redis新特性、剖析线程模型(单线程与多线程)
一. Redis6.0 新特性 1. 多线程IO redis6.0引入多线程IO,只是用来处理网络数据的读写和协议的解析,而执行命令依旧是单线程,所以不需要去考虑set/get.事务.lua等的并发问 ...
最新文章
- 北航机器人研究所 裴旭_三年亏损近29亿!北航硕士痴迷平衡车,让“中国智造”走向世界...
- Linux安装git和maven的详细过程
- android主流开源自动化框架(monkeyrunner,robotium,uiautomator
- 有关指针的数据类型的小结
- android 记一次富文本加载之路
- VB 宏+mysql解决EXCEL表格实现自动化处理
- PAT甲级1024 Palindromic Number:[C++题解]回文串和高精度加法
- hadoop(5)——mrjob的使用(1)——直接在本地测试
- spark的Web UI中的Storage啥信息都没有
- mysql lenenc int_MySQL-NonMySQL同步工具源码解读——确定同步位置
- 场景服务只创建了 Service Difinition 和feature layer
- DDL 创建与查询数据库
- centos7安装jdk只有几k的坑
- 苹果为CloudKit云服务添加服务器端API
- 西门子/软件/S7-300.400/simatic step 7 v5.5 sp4 chinese
- Viso各版本网盘免费下载
- eclipse导入静态网页模板+搭建springboot环境示例+细节问题解决(详细)
- 相敏解调 matlab,Matlab-信号与系统实验
- a卡 n卡 html5性能,a卡n卡天梯图_a卡n卡显卡性能对照表2020年5月
- 【原创】《华杉讲透《孙子兵法》》阅读有感(三)