Redis6.0新特性、剖析线程模型(单线程和多线程)

article/2025/6/18 14:24:24

一. Redis6.0 新特性

1. 多线程IO

 redis6.0引入多线程IO,只是用来处理网络数据的读写和协议的解析,而执行命令依旧是单线程,所以不需要去考虑set/get、事务、lua等的并发问题。(详细的线程模型见后面)

2. ACL精细化权限控制

 在Redis 5版本之前,Redis 安全规则只有密码控制 还有通过rename 来调整高危命令比如 flushdb , KEYS* , shutdown 等。

 Redis 6 则提供ACL的功能对用户进行更细粒度的权限控制 ,支持对客户端的权限控制,实现对不同的key授予不同的操作权限:

(1)接入权限: 用户名和密码 (2)可以执行的命令 (3)可以操作的 KEY

相关指令如下:

3. 支持RESP3

 RESP(Redis Serialization Protocol)是 Redis 服务端与客户端之间通信的协议。

 Redis 5 使用的是 RESP2,而 Redis 6 开始在兼容 RESP2 的基础上,开始支持 RESP3。推出RESP3的目的:一是因为希望能为客户端提供更多的语义化响应,以开发使用旧协议难以实现的功能;另一个原因是实现 Client-side-caching(客户端缓存)功能。

4. 重新设计了客户端缓存

 基于 RESP3 协议实现的客户端缓存功能。为了进一步提升缓存的性能,将客户端经常访问的数据cache到客户端,减少TCP网络交互,提升RT。

5. 提升了RDB的加载速度

 根据文件的实际组成(较大或较小的值),可以预期20/30%的改进。当有很多客户机连接时,信息也更快了,这是一个老问题,现在终于解决了。

6. 支持SSL  

 连接支持SSL,更加安全。

7. Redis Cluster proxy(集群代理)

 antirez开发了 Proxy 功能,让 Cluster 拥有像单实例一样的接入方式,降低大家使用cluster的门槛。不过需要注意的是代理不改变 Cluster 的功能限制,不支持的命令还是不会支持,比如跨 slot 的多Key操作。

8. Modules API

 Redis 6中模块API开发进展非常大,因为Redis Labs为了开发复杂的功能,从一开始就用上Redis模块。Redis可以变成一个框架,利用Modules来构建不同系统,而不需要从头开始写然后还要BSD许可。Redis一开始就是一个向编写各种系统开放的平台。

 Disque作为一个Redis Module使用足以展示Redis的模块系统的强大。集群消息总线API、屏蔽和回复客户端、计时器、模块数据的AOF和RDB等等。

C/C++Linux服务器开发高级架构师/C++后台开发架构师​免费学习地址

【文章福利】另外还整理一些C++后台开发架构师 相关学习资料,面试题,教学视频,以及学习路线图,免费分享有需要的可以点击领取

二. 剖析线程模型

1. 灵魂拷问

(1). 为什么说redis6.0之前是单线程的?

 redis执行客户端命令的请求从: 获取 (socket 读)→解析→执行→内容返回 (socket 写) 等等都是由一个线程处理,所有操作是一个个挨着串行执行的 (主线程),这就是称redis是单线程的原因。

但是:redis从4.0开始,也有后台线程在工作,处理一些较为缓慢的操作,例如无用连接的释放、大 key 的删除等等,严格意义上来说,redis6.0之前也不完全是单线程的。

(2). 单线程非常快的原因是什么?

 A. 纯内存操作,避免大量访问数据库,减少直接读取磁盘数据,redis将数据储存在内存里面,读写数据的时候都不会受到硬盘 I/O 速度的限制,所以速度快.

 B. 单线程操作,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗.

 C. 采用了非阻塞I/O 多路复用机制.

(3). redis在6.0之前为什么一直坚持单线程?

 官方曾做过类似问题的回复:使用Redis时,几乎不存在CPU成为瓶颈的情况, Redis主要受限于内存和网络。例如在一个普通的Linux系统上,Redis通过使用pipelining每秒可以处理100万个请求,所以如果应用程序主要使用O(N)或O(log(N))的命令,它几乎不会占用太多CPU。

 使用了单线程后,可维护性高。多线程模型虽然在某些方面表现优异,但是它却引入了程序执行顺序的不确定性,带来了并发读写的一系列问题,增加了系统复杂度、同时可能存在线程切换、甚至加锁解锁、死锁造成的性能损耗。Redis通过AE事件模型以及IO多路复用等技术,处理性能非常高,因此没有必要使用多线程。单线程机制使得 Redis 内部实现的复杂度大大降低,Hash 的惰性 Rehash、Lpush 等等 “线程不安全” 的命令都可以无锁进行。

(4). redis6.0引入多线程机制的背景是什么?

 从Redis自身角度来说,因为读写网络的read/write系统调用占用了Redis执行期间大部分CPU时间,瓶颈主要在于网络的 IO 消耗, 优化主要有两个方向:

  (1). 提高网络 IO 性能,典型的实现比如使用 DPDK 来替代内核网络栈的方式

  (2). 使用多线程充分利用多核,典型的实现比如 Memcached。

 协议栈优化的这种方式跟 Redis 关系不大,支持多线程是一种最有效最便捷的操作方式。所以总结起来,redis支持多线程主要就是两个原因:

  (1). 可以充分利用服务器 CPU 资源,目前主线程只能利用一个核

  (2). 多线程任务可以分摊 Redis 同步 IO 读写负荷

2. redis单线程模型(6.0之前)

 Redis客户端对服务端的每次调用都经历了发送命令,执行命令,返回结果三个过程。其中执行命令阶段,由于Redis是单线程来处理命令的,所有每一条到达服务端的命令不会立刻执行,所有的命令都会进入一个队列中,然后逐个被执行。并且多个客户端发送的命令的执行顺序是不确定的。但是可以确定的是不会有两条命令被同时执行,不会产生并发问题,这就是Redis的单线程基本模型。

PS:可以修改redis的最大链接数,默认为10000,如下图,如果要修改的话,直接修改配置文件重点maxclients即可。

(1). 什么是非阻塞IO?

 非阻塞 IO 在 Socket 对象上提供了一个选项Non_Blocking ,当这个选项打开时,读写方法不会阻塞,而是能读多少读多少,能写多少写多少。

 能读多少取决于内核为 Socket 分配的读缓冲区的大小,能写多少取决于内核为 Socket 分配的写缓冲区的剩余空间大小。读方法和写方法都会通过返回值来告知程序实际读写了多少字节数据。

 有了非阻塞 IO 意味着线程在读写 IO 时可以不必再阻塞了,读写可以瞬间完成然后线程可以继续干别的事了。

补充阻塞IO概念:

 当我们调用 Scoket 的读写方法,默认它们是阻塞的。

 read() 方法要传递进去一个参数 n,表示读取这么多字节后再返回,如果没有读够 n 字节线程就会阻塞,直到新的数据到来或者连接关闭了, read 方法才可以返回,线程才能继续处理。

 write() 方法会首先把数据写到系统内核为 Scoket 分配的写缓冲区中,当写缓存区满溢,即写缓存区中的数据还没有写入到磁盘,就有新的数据要写道写缓存区时,write() 方法就会阻塞,直到写缓存区中有空闲空间。

(2). 什么是IO多路复用?

背景:

 非阻塞 IO 有个问题,那就是单个线程要处理多个读写请求,处理某个客户端的的读数据的请求,结果读了一部分就返回了,线程如何知道什么时候才应该继续读数据。处理写请求的时候,如果缓冲区满了,写不完,剩下的数据何时才应该继续写?在什么时候处理什么请求?redis 单线程处理多个IO请求时就用到了IO多路复用技术。

原理:

 如下图,redis 需要处理 3 个 IO 请求,同时把 3 个请求的结果返回给客户端,所以总共需要处理 6 个 IO 事件,由于 redis 是单线程模型,同一时间只能处理一个 IO 事件,于是 redis 需要在合适的时间暂停对某个 IO 事件的处理,转而去处理另一个 IO 事件,这样 redis 就好比一个开关,当开关拨到哪个 IO 事件这个电路上,就处理哪个 IO 事件,其他 IO 事件就暂停处理了。这就是IO多路复用技术。

 以上是大致的理解下 IO 多路复用技术,在系统底层,IO 多路复用有 3 种实现机制:select、poll、epoll。

(3). 什么是文件处理器?

 A. Redis 基于 Reactor 模式开发了自己的网络事件处理器: 这个处理器被称为文件事件处理器(file event handler)

 B. 文件事件处理器使用 I/O 多路复用(multiplexing)程序来同时监听多个套接字, 并根据套接字目前执行的任务来为套接字关联不同的事件处理器。

 C. 当被监听的套接字准备好执行连接应答(accept)、读取(read)、写入(write)、关闭(close)等操作时, 与操作相对应的文件事件就会产生, 这时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件。

 D. 文件事件处理器以单线程方式运行, 但通过使用 I/O 多路复用程序来监听多个套接字, 文件事件处理器既实现了高性能的网络通信模型, 又可以很好地与 redis 服务器中其他同样以单线程方式运行的模块进行对接, 这保持了 Redis 内部单线程设计的简单性。

3. redis多线程模型(6.0开始)

(1). 流程如下:(如下图)

  • 主线程获取 socket 放入等待列表
  • 将 socket 分配给各个 IO 线程(并不会等列表满)
  • 主线程阻塞等待 IO 线程(多线程)读取 socket 完毕
  • 主线程执行命令 - 单线程(如果命令没有接收完毕,会等 IO 下次继续)
  • 主线程阻塞等待 IO 线程(多线程)将数据回写 socket 完毕(一次没写完,会等下次再写)
  • 解除绑定,清空等待队列

(2). 特点如下:

  • IO 线程要么同时在读 socket,要么同时在写,不会同时读或写
  • IO 线程只负责读写 socket 解析命令,不负责命令处理(主线程串行执行命令)
  • IO 线程数可自行配置

原文链接:第十一节:Redis6.0新特性、剖析线程模型(单线程和多线程) - Yaopengfei - 博客园


http://chatgpt.dhexx.cn/article/S2wTOj5L.shtml

相关文章

「Redis线程模型」Redis的单线程与多线程

「Redis线程模型」Redis的单线程与多线程 文章目录 「Redis线程模型」Redis的单线程与多线程[toc]Redis 是单线程吗?Redis 单线程模式是怎样的?Redis 采用单线程为什么还这么快?Redis 6.0 之前为什么使用单线程?Redis 6.0 之后为什…

Redis 是单线程的正确理解

一、为什么Redis是单线程的 1️⃣官方答案 因为 Redis 是基于内存的操作,CPU不是 Redis 的瓶颈。Redis 的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且 CPU 不会成为瓶颈,那就顺理成章地采用单线程的方案了。 2️⃣…

Python单线程/多线程

Python里的多线程是假的多线程,不管有多少核,同一时间只能在一个核中进行操作! 利用Python的多线程,只是利用CPU上下文切换的优势,看上去像是并发,其实只是单线程。 import threading import timedef tes…

为什么 Redis 是单线程的

文章目录 3.6 为什么 Redis 是单线程的3.6.1 Redis的单线程理解3.6.2 单线程的 Redis 为何高并发快 3.6 为什么 Redis 是单线程的 参考地址:https://blog.csdn.net/ChineseSoftware/article/details/122562476 官方答案 因为 Redis 是基于内存的操作,CP…

Python的单线程和多线程

1.发展背景 2.进程和线程的区别 线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;一个进程由一个线程组成,线程是一个进程中代码的不同执行路线;进程之间相互独立,但同一进程下的各个线程之间共享程序的…

JavaNIO——单线程(笔记)

文章目录 一、 三大组件1.1 Channel & Buffer1.2 Selector 二、 ByteBuffer字节缓存2.1 结构2.2 堆内存与直接内存2.3 读与写2.4 Scattering Reads与Gathering Writes2.5 简单处理黏包与半包 三、FileChannel文件编程3.1 读取3.2 写入3.3 关闭3.4 位置3.5 大小3.6 强制写入…

单线程简介

单线程顾名思义,就是只有一个线程,默认情况下,系统为应用程序分配一个主线程,该线程执行程序中以Main方法开始和结束的代码。线程具有生命周期,它包含3个状态,分别为出生状态、就绪状态和运行状态。 出生状…

小米更新显示非官方rom_MIUI官改篇对比分析-极光ROM-台湾W大-星空未来-其他官改官网...

说起安卓刷机,最有趣味性的就是小米手机了,能解锁BL,能ROOT,基本成功刷机 主流机型,而小米的开源也确确实实得到了认可。小米刷机基本分出2条线路,一个 是第三方ROM,一条是官方修改版ROM,今天ROM乐园小编就和大家分析下以下常 见的几个官方修改版ROM:极光ROM-台湾W大-…

安卓rom制作教程_MIUI官改篇对比分析-极光ROM-台湾W大-星空未来-其他官改官网

说起安卓刷机,最有趣味性的就是小米手机了,能解锁BL,能ROOT,基本成功刷机 主流机型,而小米的开源也确确实实得到了认可。小米刷机基本分出2条线路,一个 是第三方ROM,一条是官方修改版ROM,今天ROM乐园小编就和大家分析下以下常 见的几个官方修改版ROM:极光ROM-台湾W大-…

如何将以前wm手机所备份的bkg文件导入android手机,【极光ROM】-【三星S20(国行/港版/台版/韩版/美版) G981X-高通865】-【V5.0 Android-Q-TI8】...

● 支持机型: ● G9810(国行S20/港版S20/台版S20) ● G981N(韩版S20) ● G981U(美版S20) ● 注意事项: 1、ROM为卡刷包,请先刷入TWRP后再进行刷机,TWRP在刷机工具中获取。 2、刷本ROM前请先使用ODIN刷入官方2.5的底包4件套(TH*系列…

香港 三星 android6.0,【极光ROM】-【三星NOTE20高通全系列(国行/港版/台版/韩版/美版) N98XX】-【V6.0 Android-R-UC1】...

● 支持机型: ● NOTE20系列国行/港版/台版(N9810/N9860) ● NOTE20系列韩版(N981N/N986N) ● NOTE20系列美版(N981U/N986U) ● 写在前面: 1、刷机以后可能出现的问题:安全性降低、失去保修、KNOX物理熔断、无法使用三星PAY、无法支持支付宝指…

三星note10 android q,【极光ROM】-【三星NOTE10/NOTE10+/5G N97XX-855 国行/港行/美版】-【V10.0 Android-Q-TK1】...

● 支持机型: ● N970X(国行/港版/美版N10) ● N975X(港版/台版/美版N10+) ● N976X(国行/美版N10+5G) ● 写在前面: 1、刷机以后可能出现的问题:安全性降低、失去保修、KNOX物理熔断、无法使用三星PAY、无法支持支付宝指纹、无法连接三星手表等问题。 2、刷机后开机会提示红…

三星S7edge刷极光ROM的总结_我是亲民_新浪博客

因为极光ROM的众多好处,所以在中秋节前,下决心刷了一次,小小总结一下,以后备用。 [ROM特性] 系统: 基于G9350国行官方最新G9350ZCU2APD1底包完美移植。 完美ROOT权限,自带SUPERSU管理程序。 精简官方大量无…

香港 三星 android6.0,【极光ROM】-【三星S20(国行/港版/台版/韩版/美版) G981X-高通865】-【V6.0 Android-Q-TJA】...

● 支持机型: ● G9810(国行S20/港版S20/台版S20) ● G981N(韩版S20) ● G981U(美版S20) ● 注意事项: 1、ROM为卡刷包,请先刷入TWRP后再进行刷机,TWRP在刷机工具中获取。 2、刷本ROM前请先使用ODIN刷入官方2.5的底包4件套(TH*系列…

三星android rom开发者,三星s10刷机包安卓10(极光AuroraROM 13.0)

三星s10是三星的上一代发烧级旗舰系列,其优秀的屏幕和良好的体验让各位用户都沉浸其中,针对中国做出了国行优化的系统更是让中国用户拍手叫好,现在就来给大家分享一款第三方开发的极光AuroraROM,祝大家刷机愉快 刷机前注意 1、刷机以后可能将会失去保修、无法使用三星PAY、…

三星S7edge刷极光ROM的总结

因为极光ROM的众多好处,所以在中秋节前,下决心刷了一次,小小总结一下,以后备用。 [ROM特性]系统: 基于G9350国行官方最新G9350ZCU2APD1底包完美移植。完美ROOT权限,自带SUPERSU管理程序。精简官方大量无用…

IDEA、MySQL、SQLyog安装教程

IDEA、MySQL、SQLyog安装教程 IDEA安装以及jdk环境变量设置 从官网上根据操作系统下载对应IntelliJ IDEA版本下载完成后,双击安装程序,进入安装界面,点击Next更改安装目录或保留默认安装目录后,点击Next根据本地操作系统的版本选…

<SQL编程工具MySQL、SQLyog安装及环境配置教程>——《SQL》

目录 1.MySQL安装: 1.1 MySQL下载安装: 1.2 MySQL环境变量配置: 2.SQLyog安装: 2.1 SQLyog下载安装: 3.写在最后的话: 后记:●由于作者水平有限,文章难免存在谬误之处&…

mysql+sqlyog的超详细完整安装+数据库基础知识

目录 一、安装mysql下载解压添加环境变量创建文件启动mysql安装mysql 二、sqlyog安装sqlyog下载 三 补充3.1 常用的数据库命令3.2 基本操作3.2.1 常用的sql语言命令3.2.2 sql语句示例3.2.3常用函数表关系分类一对多多对多关系多表查询的推荐方式 SQL语言在功能上主要分为如下3大…

mysql yog连接教程,MySQL与sqlyog安装教程图文详解

1. MySQL1.1 MySQL安装 mysql-5.5.27-winx64下载 (1)欢迎安装 (2)协议接受 (3)安装模式选择 Typical:表示一般常用的组件都会被安装,默认情况下安装到C:\Program Files\MySQL\MySQL Server 5.5\下。 Complete:表示会安装所有的组件。此套件会…