redis是单线程还是多线程,为什么


Redis4.0之前是单线程运行的;Redis4.0后开始支持多线程。Redis4.0之前使用单线程的原因:1、单线程模式方便开发和调试;2、Redis内部使用了基于epoll的多路复用;3、Redis主要的性能瓶颈是内存或网络带宽。

redis是单线程还是多线程,为什么

(学习视频分享:redis视频教程)

不同版本的Redis是不同的,在Redis4.0之前,Redis是单线程运行的,但单线程并不代表效率低,像Nginx、Nodejs也是单线程程序,但是它们的效率并不低。

原因是Redis是基于内存的,它的瓶颈在于机器的内存、网络带宽,而不是CPU,在CPU还没达到瓶颈时机器内存可能就满了、或者带宽达到瓶颈了。因此CPU不是主要原因,那么自然就采用单线程了,况且使用多线程比较麻烦。

但是在Redis4.0的时候,已经开始支持多线程了,比如后台删除等功能。

简单来说,Redis在4.0之前使用单线程的模式是因为以下三个原因:

  • 使用单线程模式的Redis,其开发和维护更简单,因为单线程模式方便开发和调试。

  • 即使使用单线程模型也能够并发地处理多客户端的请求,主要是因为Redis内部使用了基于epoll的多路复用。

  • 对于Redis来说,主要的性能瓶颈是内存或网络带宽,而非CPU。

但Redis在4.0以及之后的版本中引入了惰性删除(也叫异步删除),意思就是我们可以使用异步的方式对Redis中的数据进行删除操作,例如:

  • unlink key:和del key类似,删除指定的key,若key不存在则key被跳过。但是del会产生阻塞,而unlink命令会在另一个线程中回收内存,即它是非阻塞的【http://www.redis.cn/commands/unlink.html】;

  • flushdb async:删除当前数据库的所有数据【http://www.redis.cn/commands/flushdb.html】;

  • flushall async:删除所有库中的数据【http://www.redis.cn/commands/flushall.html】。

这样处理的好处是不会使Redis的主线程卡顿,会把这些操作交给后台线程来执行。

【通常情况下使用del指令可以很快的删除数据,但是当被删除的key是一个非常大的对象时,例如:删除的时包含成千上万个元素的hash集合时,那么del指令就会造成Redis主线程卡顿,因此使用惰性删除可以有效避免Redis卡顿问题。】

考点分析:

关于Redis线程模型的问题(单线程或多线程)几乎是Redis必问的问题之一,但回答好的人却不多,大部分只能回答上来Redis是单线程的以及说出来单线程的众多好处,但对于Redis4.0和Redis6.0中,尤其是Redis6.0中多线程的特点,能够准确回答上来的人非常少。关于单线程和多线程的相关知识,还有以下面试题。

1.Redis主线程既然是单线程,为什么还这个快?

2.介绍一下Redis中的IO多路复用?

3.介绍一下Redis6.0中的多线程?

1.Redis为什么这么快?

原因有以下几点:

a.基于内存操作:Redis的所有数据都存在内存中,因此所有的运算都是内存级别的,所以它的性能比较高。

智慧车行预约小程序 智慧车行预约小程序

智慧车行小程序,是一个专门为洗车/4S/车辆维修行业打造的小程序,前后端完整代码包括车行动态,养车常识,保养预约,维修预约,洗车美容预约,汽车检测预约等功能。采用腾讯提供的小程序云开发解决方案,无须服务器和域名预约管理:开始/截止时间/人数均可灵活设置,可以自定义客户预约填写的数据项预约凭证:支持线下到场后校验签到/核销/二维码自助签到等多种方式详尽的预约数据:支持预约名单数据导出Excel,打印

智慧车行预约小程序 0 查看详情 智慧车行预约小程序

b.数据结构简单:Redis的数据结构比较简单,是为Redis专门设计的,而这些简单的数据结构的查找和操作的时间复杂度都是O(1)。

c.多路复用和非阻塞IO:Redis使用IO多路复用功能来监听多个socket连接的客户端,这样就可以使用一个线程来处理多个情况,从而减少线程切换带来的开销,同时也避免了IO阻塞操作,从而大大提高了Redis的性能。

d.避免上下文切换:因为是单线程模型,因此就避免了不必要的上下文切换和多线程竞争,这就省去了多线程切换带来的时间和性能上的开销,而且单线程不会导致死锁的问题发生。

官方使用的基准测试结果表明,单线程的Redis可以达到10W/S的吞吐量。

2.IO多路复用是什么?

套接字的读写方法默认是阻塞的,例如当调用读取操作read方法时,缓冲区没有任何数据,那么这个线程会卡在这里,直到缓冲区有数据或者连接被关闭时,read方法才会返回,该线程才能继续处理其他业务。

但这样显然就降低了程序的执行效率,而Redis使用的时非阻塞的IO,这就意味着IO的读写流程不再是阻塞的,读写方法都是瞬间完成并且返回的,也就是它会采用能读多少就读多少、能写多少就写多少的策略来执行IO操作,这显然更符合我们对性能的追求。

但这种非阻塞的IO也面临一个问题,那就是当我们执行读取操作时,有可能只读取了一部分数据;同理写数据也是这种情况,当缓冲区满了,而我们的数据还没有写完,那么生效的数据何时写就成了一个问题。

而IO的多路复用就是解决上面的这个问题的,使用IO多路复用最简单的方式就是使用select函数,此函数是操作系统提供给用户程序的API接口,用于监控多个文件描述符的可读和可写情况的,这样就可以监控到文件描述符的读写事件了。当监控到相应的时间之后就可以通知线程处理相应的业务了,这样就保证了Redis读写功能的正常执行。

【不过现在的操作系统已经基本上不适用select函数了,改为调用epoll函数(Linux)了,macOS则是使用Kqueue(继承与Unix),因为select函数在文件描述符非常多的时候性能非常差。】

3.Redis6.0中的多线程?

Redis单线程的优点非常,不但降低了Redis内部实现的负责性,也让所有操作都可以在无锁的情况下进行,并且不存在死锁和线程切换带来的性能以及时间上的消耗;但是其缺点也很明显,单线程机制导致Redis的QPS(Query Per Second,每秒查询数)很难得到有效的提高(虽然够快了,但人毕竟还是要有更高的追求的)。

Redis在4.0版本中虽然引入了多线程,但是此版本的多线程只能用于大数据量的异步删除,对于非删除操作的意义并不是很大。

如果我们使用Redis多线程就可以分摊Redis同步读写IO的压力,以及充分利用多核CPU资源,并且可以有效的提升Redis的QPS。在Redis中虽然使用了IO多路复用,并且是基于非阻塞的IO进行操作的,但是IO的读写本身是阻塞的。比如当socket中有数据时,Redis会先将数据从内核态空间拷贝到用户态空间,然后再进行相关操作,而这个拷贝过程是阻塞的,并且当数据量越大时拷贝所需要的的时间就越多,而这些操作都是基于单线程完成的。

因此在Redis6.0中新增了多线程的功能来提高IO的读写性能,它的主要实现思路是将主线程的IO读写任务拆分给一组独立的线程去执行,这样就可以使用多个socket的读写并行化了,但Redis的命令依旧是主线程串行执行的。

但是注意:Redis6.0是默认禁用多线程的,但可以通过配置文件redis.conf中的io-threads-do-reads 等于 true 来开启。但是还不够,除此之外我们还需要设置线程的数量才能正确地开启多线程的功能,同样是修改Redis的配置,例如设置 io-threads 4,表示开启4个线程。

【关于线程数的设置,官方的建议是如果为4核CPU,那么设置线程数为2或3;如果为8核CPU,那么设置线程数为6.总之线程数一定要小于机器的CPU核数,线程数并不是越大越好。】

关于Redis的性能,Redis的作者在2019年的RedisConf大会上提到,Redis6.0引入的多线程IO特性对性能的提升至少是一倍以上。国人也有在阿里云使用4个线程的Redis版本和单线程的Redis进行比较测试,发现测试结果和Redis作者说的一致,性能基本可以提高一倍。

总结:

本文介绍了Redis在4.0之前单线程依然快的原因:基于内存操作、数据结构简单、IO多路复用和非阻塞IO、避免了不必要的线程上下文切换。并且在Redis4.0开始支持多线程,主要体现在大数据的异步删除方面,例如:unlink key、flushdb async、flushall async等。而Redis6.0的多线程则增加了对IO读写的并发能力,用于更好的提升Redis的性能。

更多编程相关知识,请访问:编程教学!!

以上就是redis是单线程还是多线程,为什么的详细内容,更多请关注其它相关文章!


# 死锁  # 河南企业网站建设价格  # 公司seo需要几人  # 校园文化建设网站  # 长宁营销型网站建设  # 高指数词的seo策略  # 泰安seo优化平台  # 重庆天狼seo博客  # 汾阳本地网站推广咨询  # 淘宝seo怎么上下架  # 金华官方平台网站建设  # redis  # 网络带宽  # 数据结构  # 多个  # 车行  # 都是  # 复用  # 多路  # 多线程  # 单线程 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 鸿蒙单条备忘录如何加密  Sublime怎么快速复制文件路径_Sublime右键菜单增强技巧  快递优选如何查优选物流_快递优选专属物流渠道查询与配送时效  Python自动化抓取GBGB赛狗比赛结果:日期范围与赛道筛选教程  漫蛙漫画直连入口 _ manwa官方备用入口实时检测  《糖豆》添加舞曲方法  如何取消数字签名  《雷电模拟器》自动点击设置方法  获取WooCommerce产品在后台编辑页面的分类ID  以下哪一个是适应长期护理制度发展而设立的新职业  天堂漫画网页版在线阅读 天堂漫画手机版入口  如何在Python中安全地将环境变量转换为整数并满足Mypy类型检查  虫虫漫画排行榜单入口_虫虫漫画编辑推荐入口  《爱笔思画x》涂色教程  阿里云共享相册入口在哪  向往的生活小游戏启动处_向往的生活小游戏立即启动  Win10如何查看已安装的更新补丁 Win10卸载指定更新教程【教程】  解决C#跨线程访问XML对象的异常 安全的并发XML处理模式  大众点评了却看不到是怎么回事  小米civi如何设置锁屏时间  Excel宏怎么删除_Excel中删除宏的详细操作流程  《百果园》充值余额方法  Windows Audio服务启动失败怎么办_电脑没声音的终极服务修复法【修复】  键盘声音异常怎么回事_键盘异响怎么处理  Excel如何制作月度销售统计图_Excel动态图表制作与控件应用  如何在mysql中比较InnoDB和MyISAM区别  《密马》发布账号方法  如何通过settings.json个性化您的VS Code体验  TikTok私信无法发送表情怎么办 TikTok消息表情发送修复方法  《广发易淘金》国债逆回购操作教程  解决CSS容器溢出问题:使用calc()实现精确布局与边距控制  《淘票票》添加到苹果钱包教程  《梦想世界:长风问剑录》药师一图流分享  虫虫漫画绿色安全入口_虫虫漫画绿色安全入口安全看漫画  谷歌邮箱怎么换绑定邮箱Gmail安全备份邮箱修改方法  sublime text 4如何安装_最新版sublime下载与汉化教程  铁路12306官网登录入口 铁路12306在线购票官方平台  CSS绝对定位与溢出控制:实现背景元素局部显示不触发滚动条  哔哩哔哩的|直播|间怎么送礼物_哔哩哔哩|直播|送礼操作指南  Golang中的rune与byte类型区别是什么_Golang字符与字节处理详解  vivo浏览器怎么离线保存网页 vivo浏览器下载完整页面以便无网络时阅读  Fedora怎么安装 Fedora Workstation安装步骤  怎么恢复删除的电脑文件_数据恢复软件使用教程  mysql触发器如何编写_mysql触发器编写规范与代码示例讲解  Mac如何开启画中画模式_Mac Safari浏览器视频画中画功能  Linux如何优化系统启动流程_Linux启动项优化方案  猫眼app抢票快还是小程序快  sublime怎么在文件中显示代码结构大纲_sublime符号列表功能  一加 Ace 6V 快充无法启用_一加 Ace 6V 充电优化  《漫蛙manwa2》防走失网页版链接2025 

 2020-12-18

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.