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 究竟是单线程还是多线程呢?相关推荐

  1. Redis 到底是单线程还是多线程?

    1 Redis单线程问题 主要是指Redis的网络IO和键值对读写是由一个线程来完成的,Redis在处理客户端的请求时包括获取 (socket 读).解析.执行.内容返回 (socket 写) 等都由 ...

  2. 【Redis】到底是单线程还是多线程以及Redis为什么这么快?

    文章目录 Redis到底是单线程还是多线程的? Redis为什么是单线程的? Redis为什么基于内存? 为什么要为Redis绑定某一固定CPU? Redis的多线程情况 Redis的单线程到底有多快 ...

  3. Redis为什么又引入了多线程?单线程不香了?

    ​ 相信你一定不止一次见过Redis是单线程模式,不过说实话那只是个老版本,这个问题是一位老哥的大厂面试题,跟我分享了一下.想着自己就知道redis6.0以前一直都是单线程,到了6的版本才加入了多线程 ...

  4. Redis 属于单线程还是多线程?不同的版本有什么区别?

    Redis 是普及率最高的技术之一,同时也是面试中必问的一个技术模块,所以从今天开始我们将从最热门的 Redis 面试题入手,更加深入的学习和了解一下 Redis. 我们本文的面试题是 Redis 属 ...

  5. Redis 5.0.8+常见面试题(单线程还是多线程、先更新缓存还是数据库、雪崩穿透击穿解决办法...)

    Redis 6.0 保姆级教程(含微服务案例与完整面试题):https://www.yuque.com/yuxuandmbjz/redis Redis是单线程还是多线程 ?为什么这么设计 ? Redi ...

  6. Redis单线程和多线程

    Redis单线程 Reids是单线程! Reids是单线程! Reids是单线程! Redis架构模型:Redis 基于 Reactor 模式来设计开发了自己的一套高效的事件处理模型 ,即文件事件处理 ...

  7. redis是单线程还是多线程?

    1.Redis单线程 在一开始的时候,Redis采用的是单线程模型,因为Redis是一个基于内存的数据库,将所有的数据放入内存,所以使用单线程的操作效率是最高的,多线程会上下文切换消耗大量时间,对于内 ...

  8. Redis是单线程还是多线程问题

    在学习redis的过程中,很多文章都说redis是单线程,但在官方给出的说明中显示,redis6.0已经引入了多线程,对此我找了许多文档,将学习过程整理记录下来. 1.Redis单线程 在一开始的时候 ...

  9. Redis新特性、剖析线程模型(单线程与多线程)

    一. Redis6.0 新特性 1. 多线程IO redis6.0引入多线程IO,只是用来处理网络数据的读写和协议的解析,而执行命令依旧是单线程,所以不需要去考虑set/get.事务.lua等的并发问 ...

最新文章

  1. 北航机器人研究所 裴旭_三年亏损近29亿!北航硕士痴迷平衡车,让“中国智造”走向世界...
  2. Linux安装git和maven的详细过程
  3. android主流开源自动化框架(monkeyrunner,robotium,uiautomator
  4. 有关指针的数据类型的小结
  5. android 记一次富文本加载之路
  6. VB 宏+mysql解决EXCEL表格实现自动化处理
  7. PAT甲级1024 Palindromic Number:[C++题解]回文串和高精度加法
  8. hadoop(5)——mrjob的使用(1)——直接在本地测试
  9. spark的Web UI中的Storage啥信息都没有
  10. mysql lenenc int_MySQL-NonMySQL同步工具源码解读——确定同步位置
  11. 场景服务只创建了 Service Difinition 和feature layer
  12. DDL 创建与查询数据库
  13. centos7安装jdk只有几k的坑
  14. 苹果为CloudKit云服务添加服务器端API
  15. 西门子/软件/S7-300.400/simatic step 7 v5.5 sp4 chinese
  16. Viso各版本网盘免费下载
  17. eclipse导入静态网页模板+搭建springboot环境示例+细节问题解决(详细)
  18. 相敏解调 matlab,Matlab-信号与系统实验
  19. a卡 n卡 html5性能,a卡n卡天梯图_a卡n卡显卡性能对照表2020年5月
  20. 【原创】《华杉讲透《孙子兵法》》阅读有感(三)

热门文章

  1. 用python写个画狐狸头像的程序
  2. 泰山医学院的计算机专业,泰山医学院专业排名及介绍 哪些专业最好
  3. MATLAB绘制空间曲线和曲面图像
  4. 千里走单骑:01-北京到上海骑记之前言
  5. 立式数控铣床传动系统(论文+CAD图纸+开题报告+任务书+外文翻译+文献综述)
  6. 操作系统的内存管理方式
  7. 苹果都用自己系统,旧手机我也改成服务器!
  8. [Unity 3D] 重力感应与罗盘(二)
  9. java switch语句套循环_java中switch语句和循环语句的使用
  10. 多线程--->守护线程