Redis6.0多线程的疑惑解答

news2024/11/24 7:46:00

1.Redis6.0之前的版本真的是单线程吗?

Redis在处理客户端的请求是,包括获取(socket读)、解析、执行、内容返回(socket 写)等都有一个
顺序串行的主线程处理,这就是所谓的"单线程"。但如果严格来讲并不是单线程,除了主线程外,它
也有后台线程在处理一些较为缓慢的操作,例如清理脏数据、无用连接的释放、大key的删除等等

2.Redis6.0之前为什么一直不使用多线程?

官方曾做过类似问题的回复:使用Redis时,几乎不存在CPU成为瓶颈的情况,Redis主要受限于内存和网络。例如在一个普通的Linux系统上,Redis通过使用pipelining每秒可以处理100w个请求,所以如果
应用程序主要使用O(N)或O(log(N))的命令,它几乎不会占用太多CPU.
使用了单线程后,可维护性高。多线程模型虽然在某些方面表现优异,但是它却引入了程序执行顺序的不确定性,带来了并发读写的一系列问题,增加了系统复杂度、同事还可能存在线程切换、甚至加锁解锁、
死锁造成的性能损耗。Redis通过AE事件模型以及IO多路复用等技术,处理性能非常高,因此没有必要使用多线程。单线程机制使得Redis内部实现的复杂度大大降低,Hash的惰性、Rehash、Lpush等等"线程不安全"
的命令都可以无锁进行

3.Redis6.0为什么要引入多线程呢?

Redis将所有数据放在内存中,内存的响应时长大约为100纳秒,对于小数据包,Redis服务器可以处理8w~10w QPS,这也是Redis处理的极限了,对于80%的公司来说,单线程的Redis已经足够使用了。但随着越来越复杂的业务场景,有些公司动不动就上亿的交易量,因此需要更大的QPS。常见的解决方案是在分布式架构中对数据进行分区并采用多个服务器,
但该方案有非常大的缺点,例如要管理的Redis服务器太多,维护代价大;某些适用于单个Redis服务器的命令不适用于数据
分区;数据分区无法解决热点读/写问题;数据倾斜,重新分配和放大/缩小变得更加复杂等等。

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

  • 1.提高网络IO性能,典型的实现比如使用DPDK来替代内核网络栈的方式
  • 2.使用多线程充分利用多核,典型的实现比如Memcached协议栈优化的这种方式跟Redis关系不大,支持多线程是一种最有效最便捷的操作方式,所以总结起来,Redis支持多线程就是两个原因:
  • 1.可以充分利用服务器的CPU资源,,目前主线程只能利用一个核
  • 2.多线程任务可以分摊Redis同步IO读写负荷

4.Redis6.0默认是否开启了多线程?

Redis6.0的多线程默认是禁用的,只使用主线程。如需开启需要修改redis.conf配置文件

io-threads 4

io-threads-do-reads no

开启多线程后,还需要设置线程数,否则是不生效的。关于线程数的设置,官方有一个建议:
4核的机器建议设置为2或3个线程,
8核的建议设置6个线程,线程数一定要小于机器核数,因为Redis还有预留出其他线程做后台任务
比如备份、删除过期键等操作,还需要注意的是,线程数并不是越大越好,官方认为超过了8个基本就没什么意义了,因为主线程命令执行会存在一个瓶颈点,如果达到瓶颈,即便IO线程设置得再多,也是空转

5.Redis6.0采用多线程后,性能的提升效果如何?

Redis作者antirez在RedisConf2019分享时曾提到:Redis6引入的多线程IO特性对性能提升
至少是一倍以上。国内也有大牛曾使用unstable版本在阿里云ESC进行过测试,GET/SET命令
在4线程IO时性能相比单线程是几乎翻倍了。如果开启多线程,至少要4核的机器,且Redis实例
已经占用相当大的CPU的耗时的时候才建议使用,否则使用多线程没有意义

6.Redis60多线程的实现机制?

在这里插入图片描述

流程简述:

  • 1.主线程负责接收建立连接请求,获取socket放入全局等待读处理队列
  • 2.主线程处理完读事件之后,通过RR(Round Robin)将这些连接分配给这些IO线程
  • 3.主线程阻塞等待IO线程读取socket完毕
  • 4.主线程通过单线程的方式执行请求命令,请求数据读取并解析完成,但并不执行回写socket
  • 5.主线程阻塞等待IO线程将数据回写socket完毕
  • 6.解除绑定,清空等待队列

该设计有如下特定:

  • 1.IO线程要么同时在读socket,要么同时在写,不会同时读或写
  • 2.IO线程只负责读写socket解析命令,不负责命令处理

7.开启多线程后,是否会存在线程并发安全问题?

Redis的多线程部分只是用来处理网络数据的读写和协议解析,执行命令仍然是单线程顺序执行。
所以我们不需要去考虑控制key、lua、事务,LPUSH/LPOP等等的并发及线程安全问题

8.Redis6.0的多线程和Memcached多线程模型进行对比

Memcached服务器采用master-worker模式进行工作。服务端采用socket与客户端通讯。主线程、工作线程采用pipe管道进行通讯。主线程采用libevent监听listen、accept的读事件,事件响应后将连接信息的数据结构封装起来,根据算法选择合适的工作线程,将连接任务携带
连接信息分发出去,响应的线程利用连接描述符建立与客户端的socket连接并进行后续的存取数据操作

  • 相同点:都采用了master线程-worket线程的模型
  • 不同点:Memcached执行主逻辑也是在worker线程里,模型更加简单,实现了真正的线程隔离,符合我们对线程隔离的常规理解。而Redis吧处理逻辑交还给master线程,虽然一定程度上增加了模型复杂度,但也解决了线程并发安全等问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1532198.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024蓝桥杯每日一题(并查集)

备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一:奶酪 试题二:合并集合 试题三:连通块中点的数量 试题四:网络分析 试题一:奶酪 【题目描述】 现有一块大奶酪,它的高度为 hℎ…

Java SE入门及基础(44)

目录 I / O流(上) 1. 什么是I / O流 过程分析 I / O的来源 Java 中的 I / O流 2. 字节流 OutputStream 常用方法 文件输出流 FileOutputStream 构造方法 示例 InputStream 常用方法 文件输入流 FileInputStream 构造方法 示例 综合练习 字节流应用场景 Java SE文…

命名空间——初识c++

. 个人主页:晓风飞 专栏:数据结构|Linux|C语言 路漫漫其修远兮,吾将上下而求索 文章目录 经典的Hello Word 起航c关键字c语言的命名冲突问题域作用限定符::命名空间 namespace命名空间定义命名空间的使用1.加命名空间名称及作用域限定符2.使用…

web集群-lvs-DR模式基本配置

目录 环境: 一、配置RS 1、安装常见软件 2、配置web服务 3、添加vip 4、arp抑制 二、配置LVS 1、添加vip 2、安装配置工具 3、配置DR 三、测试 四、脚本方式配置 1、LVS-DR 2、LVS-RS 环境: master lvs 192.168.80.161 no…

数据结构与算法4-冒泡排序

文章目录 1. 认识冒泡排序2. 图示2.1 图示12.2 图示2 3. 代码 1. 认识冒泡排序 双层for循环,每次选出最大的数“浮”到数组的最后面;时间复杂度O( n 2 n^2 n2),空间复杂度O(1);重复地遍历待排序的数列,一次比较两个元素&#xff…

HCIP配置实验(路由配置)

要求: 1、R6为ISP,接口IP地址均为公有地址,该设备只能配置IP地址,之后不能冉对其进行任何配置; 2、R1-R5为局域网,私有IP地址192.168.1.0/24;请合理分配; 3、R1、R2、R4,各有两个环回IP地址; R5, R6各有一个…

小字辈[天梯赛]

文章目录 题目描述思路AC代码 题目描述 思路 深度优先搜索 具体流程 1.读入每个人的祖先,标记辈分最高的老祖宗对应的下标pos 2.从pos开始dfs,每次判断当前遍历的深度,如果>原来的深度,更新,并将存储最小辈分的数组…

【C语言】文件操作揭秘:C语言中文件的顺序读写、随机读写、判断文件结束和文件缓冲区详细解析【图文详解】

欢迎来CILMY23的博客喔,本篇为【C语言】文件操作揭秘:C语言中文件的顺序读写、随机读写、判断文件结束和文件缓冲区详细解析【图文详解】,感谢观看,支持的可以给个一键三连,点赞关注收藏。 前言 欢迎来到本篇博客&…

Linux编程4.9 网络编程-建立连接

1、TCP的连接与断开 三次握手与四次挥手 2、服务器端并发性处理 2.1 多进程模型 一个父进程,多个子进程父进程负责等待并接受客户端连接子进程: 完成通信,接受一个客户端连接,就创建一个子进程用于通信。 2.2 多线程模型 多线程服务器是…

Vue3+.NET6前后端分离式管理后台实战(四)

1,Vue3.NET6前后端分离式管理后台实战(四)已经发布, 程序源码已打包,感兴趣的可以关注下载。 2,源码打包可以下载:

整合qq邮箱发送

目录 &#x1f32e;1.获取qq授权码 &#x1fad3;2.引入依赖 &#x1f9c8;3.配置mail信息 &#x1f95e;4.创建实现类 &#x1f956;5.测试 1.获取qq授权码 点击开启服务&#xff0c;发送信息获取授权码 2.引入依赖 <!--邮件--><dependency><groupId&…

FL Studio for Mac 21.2.3.3586中文版的一些特点

FL Studio&#xff08;Fruity Loops&#xff09;是一款非常流行的数字音乐工作站软件&#xff0c;它可以让用户轻松地制作各种类型的音乐。前不久&#xff0c;FL Studio发布了最新的Mac版21.2.3.3586中文版&#xff0c;这个新版本的发布让广大Mac用户感到非常兴奋。本文将介绍F…

OSI(Open Systems Interconnection)网络架构模型简介

OSI&#xff08;Open Systems Interconnection&#xff09;参考模型是一种概念性的网络架构模型&#xff0c;它将计算机通信系统划分为7个层次&#xff0c;每个层次都有自己的功能和职责&#xff0c;通过相互合作来实现整个网络的通信。这7个层次分别是&#xff1a; 应用层&…

刷力扣看见一个寻找单身狗的问题?【力扣题解】

今天刷力扣遇到一道有意思的题目&#xff0c;题目是写着撞色问题177 &#xff0c;当我写完这个题去看看有什么好的解题方式的时候&#xff0c;看见一个有趣的题解问题&#xff0c;他对这个题目的描述是几对情侣&#xff0c;带几个单身狗出去玩&#xff0c;然后现在我们要把这几…

Android分区存储到底该怎么做

文章目录 一、Android存储结构二、什么是分区存储&#xff1f;三、私有目录和公有目录三、存储权限和分区存储有什么关系&#xff1f;四、我们应该该怎么做适配&#xff1f;4.1、利用File进行操作4.2、使用MediaStore操作数据库 一、Android存储结构 Android存储分为内部存储和…

AI算力池化赋能企业大模型价值探索

1. 大语言模型企业落地中的算力痛点 随着人工智能技术的飞速发展&#xff0c;自然语言处理&#xff08;NLP&#xff09;成为了热门的研究领域之一。在这一领域中&#xff0c;大语言模型&#xff08;Large Language Models&#xff09;凭借其强大的语言理解和生成能力&#xff…

ArcGIS Pro、R与INVEST的多技术融合:生态系统服务权衡与协同研究的新纪元

生态系统服务是指生态系统所形成的用于维持人类赖以生存和发展的自然环境条件与效用&#xff0c;是人类直接或间接从生态系统中得到的各种惠益。联合国千年生态系统评估&#xff08;Millennium ecosystem assessment&#xff0c;MA&#xff09;提出生态系统服务包括供给、调节、…

突发!OpenAI服务异常!!!

2024/3/20傍晚7点&#xff0c;笔者的朋友在使用OpenAI时&#xff0c;页面提示服务异常&#xff0c;由此引发了我的深思&#xff1a;人工智能的脆弱性与未来的挑战 2024年3月20日&#xff0c;傍晚7点&#xff0c;一个普通的周二&#xff0c;我的朋友在尝试使用OpenAI时&#xf…

媒体发稿途径,怎么样去网络媒体投稿,媒体发布一般价格多少钱?

在信息爆炸的时代&#xff0c;媒体作为传递信息的重要渠道&#xff0c;成为企业推广的重要手段。然而&#xff0c;如何去网络媒体投稿&#xff0c;以及媒体发布的价格却是困扰很多企业和个人的问题。今天&#xff0c;我们将会为大家介绍一种简单易行的方式&#xff1a;媒介多多…

vue3 几种实现点击复制链接的方法

vue3 几种实现点击复制链接的方法 环境&#xff1a;vue3tselment plus 目的&#xff1a;常用到的地方就是点击复制分享链接功能 1.复制当前页面链接&#xff0c; <template><div class"news" style"margin-top: 30px"><el-button type&q…