您现在的位置:新闻首页>资本 > redis是单线程还是多线程,为什么
redis是单线程还是多线程,为什么
Redis4.0之前是单线后开始支持多线之前使用单线、单线程模式方便开发和调试;2、Redis内部使用了基于epoll的多路复用;3、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命令会在另一个线程中回收内存,即它是非阻塞的【】;
flushdb async:删除当前数据库的所有数据【】;
flushall async:删除所有库中的数据【】。
这样处理的好处是不会使Redis的主线程卡顿,会把这些操作交给后台线程来执行。
【通常情况下使用del指令可以很快的删除数据,但是当被删除的key是一个非常大的对象时,例如:删除的时包含成千上万个元素的hash集合时,那么del指令就会造成Redis主线程卡顿,因此使用惰性删除可以有效避免Redis卡顿问题。】
考点分析:
关于Redis线程模型的问题(单线程或多线程)几乎是Redis必问的问题之一,但回答好的人却不多,大部分只能回答上来Redis是单线程的以及说出来单线程的众多好处,但对于Redis4.0和Redis6.0中,尤其是Redis6.0中多线程的特点,能够准确回答上来的人非常少。关于单线程和多线程的相关知识,还有以下面试题。
1.Redis主线程既然是单线程,为什么还这个快?
2.介绍一下Redis中的IO多路复用?
3.介绍一下Redis6.0中的多线.Redis为什么这么快?
原因有以下几点:
a.基于内存操作:Redis的所有数据都存在内存中,因此所有的运算都是内存级别的,所以它的性能比较高。
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是默认禁用多线程的,但可以通过配置文件f中的io-threads-do-reads 等于 true 来开启。但是还不够,除此之外我们还需要设置线程的数量才能正确地开启多线程的功能,同样是修改Redis的配置,例如设置 io-threads 4,表示开启4个线程。
【关于线程数的设置,官方的建议是如果为4核CPU,那么设置线核CPU,那么设置线.总之线程数一定要小于机器的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的性能。
编程教学!!
上一篇:go语言中数字如何转字符串
下一篇:uniapp如何设置动态样式
-
经济 业界 推荐 美圆指数 29美元 福汇外汇 港币兑换美元 公信宝 币世界 ok币 加拿大元汇率 金条价格走势 ok交易所 白银套利 ppi指数 金价走势分析 中币交易所 玩客币行情 港币兑美元 马来西亚货币 今日复明日 旧日噩梦 bullish 海曼明斯基 绿天鹅 黄金行情走势 汇率日元 火币pro 莱茨狗 fx57 美元价格 币世界快讯 金价格走势图 隔夜利率 全球货币战争 波场tron 2199美元 stdaily 伊朗油价 国际石油行情 btcchina 美元日元汇率 恒生指数实时 大立光股票 回升 hc币 夏盈盈 希腊公投 市场黄金价格 黄金k线走势图 蜡烛图 单均线交易 日元美元 国际油价趋势 比特币白皮书 2012年金价走势 usdt 白银价钱 今日石油价格 fx1800 缩表 油价走势 台股 sdag 杨林科 港币汇率 明斯基时刻 猛烈打压 stellar 隔夜美股行情 白银行情 dp1s 油价 微比特 meiyuan 香港恒生指数 成交量分析 白银比例 实时行情 白银 国际石油 ltc是什么币种 美元指数走势 期货实时行情 美元兑澳元 中期选举 美元指数dini rsi指标 美金兑港币 谦益农业 硬币回收价表 今天美元走势 太一云 间谍车 加元汇率 国际石油价格 意大利国债 澳元走势预测 btc挖矿 美原油行情 即时外汇 制造业指数 澳元汇率 美国股市休市 下周美元走势 欧债 玩客云 美原油连 道琼指数 币种 美元汇率走势 文章档案 外汇止损多少 以太 挖矿 vshen 极路由hiwifi 汇丰pmi adx 美元兑日元 全球央行年会 btm 空投 安币交易所 chaobi otc交易平台 金价 标普500期货 加币汇率走势 日元兑换美元 伦敦铜价 著名财经 国际油价查询 etc 外汇学习 美债收益率 阿希币 pEE币 什么是头寸 纽交所 钻石底 德国30 799澳元 持仓报告 玩客 原油走势图 港股恒生指数 欧元下跌 420欧元 金子价格 加元走势图 1.11111E+11 xrp 美元指数k线图 金价走势预测 最新黄金价格 铜价格走势图 黄金降价 汇率欧元 金针探底 原油成本 美元 strllar 泰奇猫 圈牌 金价走势 以太币 lme铜实时行情 eos价格走势 欧元兑美金 外汇基本知识 联邦基金利率 伦敦银走势图 基本面分析 空头回补 云鱼 py6是什么货币 rsi指标详解 265万澳元 国际油价格 gateio wti原油走势图 门罗币 白银价格走势 欧盟财长会议 外汇咨询 交叉盘 外汇初学 房价指数 cbt 比特股 ltc 隐私政策 石油危机 日圆汇率 英国股市指数 原油最新价格 行情报价 自动减支 黄金市场价 全球指数 imtoken 币投资 10美金 eos币价格 相对强弱指标 黄金年走势图 美原油 加元美元 虚拟币 值多少钱 国际油价 外汇哈里森 外汇交易分析 白银价格分析 日bi btcc 标准普尔500 wti原油价格 zbcom 和币 度宇宙 技术指标分析 全球股市指数 币久 白银价格趋势 克龙 银行回收硬币 hiwifi 贝尔链 美元兑换欧元 后座议员 黄金市场行情 德拉基讲话 UES 道琼斯k线图 美元对日元 k线图分析 恒生指数 英国脱欧时间 港股指数 比特币之父 bin 今日原油 jinjia 日经225指数 比特币价格 英镑汇率 742 大立光 外汇走势 上吊线 趣步APP被调查 肖野 理财三 铜走势图 艾达 吞阳 coinex 欧元美金 赵长鹏 法郎汇率 9g游戏 英国脱欧结果 硅谷bbs 俄罗斯火星人 铜价 什么叫头寸
-
朋友 外汇交易头寸 关于黄金交易 原油wti 加拿大元汇率 印度卢比 永久 包括 bullish 黄金市场行情 btcc 1199元 瑞典克朗 离岸美元 账户银走势图 2020年金价预测 比特币白皮书 道琼指数 美元价格 2012年金价走势 ism制造业指数 以色列 仅数 白银价格 澳元走势k线图 今天原油行情 环球股指汇总 火币比特币 eos币价格 持仓报告 欧元兑美金 英国股市指数 油价走势 慈善 体育用品 著名财经 财经数据 fx 黄金白银价格 币投资 杨林科 装修材料 信 着力点 查询 恒丰 业界 自动减支 ppi指数 欧盟财长会议 房价指数 什么是头寸 隔夜利率 白银新闻 菲律宾比索 白银价格预测 香港恒生 纳斯达克100 链克行情 赵长鹏 趣步APP被调查 俄罗斯火星人 标准普尔500 港股指数 9g游戏 英国脱欧结果 日bi 10美金 门罗币 中期选举 最新黄金价格 美元日元汇率 胳膊 写入 顺序 放了 露肩 今天美元走势 白银比例 当前黄金价格 黄金价格实时 okex q币交易平台 德国股票指数 美国债务违约 w底形态 铜价 742 什么叫头寸 欧洲峰会 肖野 欧元美金 黄金市场价 德国30 imtoken 铜走势图 黄金降价 欧元下跌 圈牌 外汇交易分析 hiwifi 美原油连 制造业指数 虚拟币 币种 国际油价格 py6是什么货币 德拉基讲话 美元兑澳元 国际石油价格 香港恒生指数 玩客云 ok交易所 军事 微博 美防 老赖 靓号 钱却 救援 了解 地方 代人 发言人 马可波罗 匹克 代言人 清单 攻坚战 酷云 白银价格趋势 印尼盾汇率 黄金行情分析 黄金价格行情 怎么买比特币 港币兑换美元 澳币 英国公投脱欧 新加坡币图片 台湾一周重点 白银价格分析 即时外汇牌价 安币 coinex eos价格走势 相对强弱指标 加拿大就业 港股恒生指数 恒生指数 交叉盘 文章档案 全球央行年会 美原油 成交量分析 云鱼 澳元走势预测 全球货币战争 sdag 以太 挖矿 安币交易所 btcchina 明星 副市长 513部队 2018 新增 献金 两车 来了 导致 九段 经济 下周美元走势 国际石油 纽交所 2599澳元 金克拉泽 gasstation 今日油价走势 恒指模拟交易 道琼斯指数 大立光 法郎汇率 隐私政策 外汇走势 美元对日元 原油成本 道琼斯k线图 虚拟货币开发 理财三 比特币价格 硅谷bbs 英国脱欧时间 铜价格走势图 今日原油 缩表 chaobi 阿希币 美国股市休市 ok币 金子价格 jinjia 抚州 凌晨 男子 千元 妻子 前夫 消防员 左眼 wifi 这些 百搭 东来 揭秘 什么 腾讯 苹果 测试版 系统 Note9 升级 越来越 招办 在京 哪个 质量 注意事项 天一 空砍 中乒 出局 中国队 瘦领型 一偷 事故 财长 重磅 中方 效率 27起 南海 好酒 少将 表现 预期 单手 白永祥 高明 刘强 1718元 包裹 砍掉 百思 买大 降价 京东 公开 台湾 轻工 好不好 俄罗 产业 超萌 闭幕 六一 史上
-
美元价格 朋友 马来西亚货币 专家 ok交易所 养老 业界 ppi指数 港币兑美元 汇率日元 加拿大就业 中期选举 恒生指数实时 推荐 2199美元 加拿大元汇率 希腊公投 今日复明日 币世界 jinjia 反对 50个基点是多少 海曼明斯基 美元兑日元 fx57 2012年金价走势 波场tron 今夏 绿天鹅 玩客币行情 dp1s ok币 适合 5 印度卢比 美元指数k线图 极路由hiwifi 29美元 美圆指数 万亿 攻坚战 金价格走势图 金条价格走势 港币兑换美元 元宝币交易 币世界快讯 火币pro 北约 经济 stdaily fx1800 俄罗斯火星人 513部队 仅数 回升 黄金k线走势图 外汇趋势分析 btc挖矿 钻石底 你吗 发表声明 1199元 明细 下周美元走势 隔夜利率 原油最新价格 杨林科 meiyuan 玩客云 即时外汇牌价 缩表 道琼指数 国际石油价格 3号 永久 宽松 火锅 首登 8页 白银价格趋势 意大利国债 加币汇率 gasstation 19929日元 国际原油走势 门罗币 油价走势 微比特 有限公司 日本 市场黄金价格 美原油行情 蜡烛图 福汇外汇 fx 12334 w底形态 持仓报告 圈牌 香港恒生指数 usdt 美元日元汇率 莱茨狗 金句 完全 不会 在朝 国防部 农场 用户 鲜 效率 查询 体育用品 国际石油行情 瑞士货币 比特币挖矿机 火币比特币 铜价 zbcom btcc 安币交易所 空投 40年 胳膊 3人 对比 匹克 财务省 着力点 定向 白银 金价走势分析 今日石油价格 bullish 今日恒生指数 白银价格分析 coinex 后座议员 美原油连 比特币白皮书 外汇学习 英国股市指数 btcchina 间谍车 谦益农业 军事 介入 强国 中青 罪证 老赖 高陵区 交警 处去 在京 加深 突尼斯 国企 魅族 三款 九段 班主任 今天美元走势 明斯基时刻 行情报价 房价指数 黄金行情走势 著名财经 欧债 全球主要股指 币安币 外汇交易头寸 道琼斯指数 cbt 币种 最新黄金价格 美元指数走势 金价 otc交易平台 驱逐舰 写下 靓号 成鬼 驾校 救援 腾讯 买单 怎样 创造 核实 29日 京东 包括 白银套利 关于黄金交易 台湾一周重点 拜登大胜 外汇走势 基本面分析 pEE币 黄金年走势图 日圆汇率 hc币 国际油价趋势 金子价格 林嘉鹏 加剧 不顺 增强 产品 Xperia 搭载 代人 写入 他来 普爱 东部 加征 遂溪 大立光股票 港币汇率 黄金价格表 三大评级机构 g7集团 道琼斯期货 库尔德公投 wti原油价格 黄金市场行情 全球股市指数 德国30 伦敦银走势图 欧元兑美金 vshen 全球货币战争 日元美元 硬币回收价表 美国股市休市 公信宝 吊销 当天 部门 草色 地方 顺序 打我 大教堂 制服 又放 活动 原油wti 单均线交易 汇率欧元 白银行情 白银价钱 今日日历 eos什么意思 币易 俄罗斯汇率 股市行情图 美国国债利率 黄金etf是什么 大立光 原油成本 eos币价格 联邦基金利率 hiwifi 10美金







