redis 多线程_唬人的Redis多线程,也就那么回事

不羡鸳鸯不羡仙,一行代码调半天。原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。

周末被一位小同学憋的很窝火。 他要和我探讨一下,redis到底是多线程的还是单线程的。这个问题本来比较好解释,但我遇到的却是一个杠精。

答案是显而易见的:redis6,逃不过真香定理,引入了多线程;而在redis6之前,却是单线程的。

也就是说,这不是一个是和否的问题,还涉及到第二维度的版本参与。

可是,这位同学要打我的脸。不知道小姐姐的脸皮很嫩么?摸不得。

“照你的逻辑,redis5是单线程的了?”

“是的。”

“那下面这张截图是怎么回事?”

同学甩给我一张图,并送来一个鄙视的眼神。

b8f96e6bd41be46f7ff149c754153d64.png

“使用top -Hp 查看。redis5有4个线程。该怎么解释?”

这个问题,我也不知道怎么跟他解释。使用top命令去观测,redis5肯定是多线程的,比如bgsaveaof等,肯定要开启一个线程去操作,否则早就炸了。

按照这个逻辑去说,redis就从来没有单进程过。看着这张图,我陷入了无尽的忧愁。

“Redis是否是单进程,主要是针对Redis的读写操作来说的”。但这句话对于杠精并没有什么信服力。

“写程序要严谨,你们这些人都太不严谨了。多线程就是多线程,你应该问’redis的读写操作到底是不是多线程的’”。

我问你个大头鬼。我并不想再和他交流,因为我为自己的博学感到无地自容。

但他接下来的一个问题,却让我陷入了真正的沉思。

1. redis的多线程有多快?

redis的多线程到底有什么性能提升呢?

官方的说法是:possible to easily speedup two times。可能会比较容易的提升到两倍速度。

我英文不太好,对这种英文的修饰感到很迷惑。既然easily了,为什么还有possibletwo times,到底是提升了2倍,还是提升到2倍。

官方说,到底能够提升多少,还要看硬件的能力。

官方推荐,只有你的CPU核数,达到4个的时候,才有必要试一试这个多线程的Feature。

不要用土豪的眼睛盯着我,这种4core的配置,已经打死了大多数公司了。所以Redis贴心的把多线程功能是关闭的。(好像有点语病)

我只能求助那些在一线的前同事们。他们有没有在生产环境,用上这划时代的多线程Redis6x呢?

结果很令我满意,没有!

其中有一个回复我特别满意。他说:“你竟然在问一个停留在JDK1.6的我,跑着Windows版本Redis的我,是否用到了Redis6。我还在用着Redis3呢。”

另外一个回复我感到更满意,他说:“滚!”

2. 怎么用?

新技术肯定是要吹捧一下的,否则没人实践踩坑,作为追随者就只能吃翔。

多线程在理论上,肯定是会有性能提升的。一个爸爸赚钱和2个爸爸赚钱,效果自然不一样,只是苦了妈妈了。

Redis6的多线程开启,需要配置一个参数。

io-threads 4

当开启之后,只有出流量使用多线程,如果你想要入流量也走多线程,那也可以配置以下参数。

io-threads-do-reads yes

就这么两个参数,可以看到现在的redis多线程,还是稍显寒碜了一些。

我们把它开启之后,仍然使用top -Hp 查看相关进程,可以看到多了3个io_thd进程。

aef2cd6b951adea1fa1755515bd7f340.png

这部分逻辑,是在networking.c种实现的。这个文件已经达到了3k多行,也是够庞大的了。

3. Redis为什么又搞多线程了

使用redis-benchmark测试,单机单核的吞吐量,能够达到10w+。

1秒是1000000000纳秒,单次内存操作大约是100纳秒左右,那内存操作可以达到1000w/s的速度。那Redis的瓶颈在哪里呢?

使用perf进行追踪,可以发现它的耗时,主要是体现在sys_write系统调用上,也就是向socket写数据。

既然瓶颈找到了,那就把它优化掉。redis选择的方式是使用多线程。

我使用benchmark测试了一下,4core的机器,CPU跑满的时候,QPS达到了16w,并没有翻倍(相对于单核的9w/s)。

benchmark 6379 clients 32164519.20 requests per second165411.09 requests per second

用这么强的硬件,获得这样有限的性能提升,差强人意。

这就不难解释为什么现在实践的人那么少。出了因为新,还是不够吸引人。

毕竟,4core的机器,我部署上3台redis cluster的实例,理论上会提升三倍呢。

redis配置文件里,有不少内容在注释这个新特性。

4. 怎么实现?

如图,一次redis请求,要建立连接,然后获取操作的命令,然后执行命令,最后将响应的结果写到socket上。

2b7921e88d5e22051a6dede4049fb70b.png

在redis的多线程模式下,获取、解析命令,以及输出结果着两个过程,可以配置成多线程执行的,因为它毕竟是我们定位到的主要耗时点。

但命令的执行,也就是内存操作,依然是单线程运行的。

这种设计造成了一个特性。

redis现在依然没有多线程的锁竞争和线程安全问题,因为它的数据读取这一步骤,仍然是单线程的,要排队运行。一些耗时的操作,比如keys *hgetall等,仍然要注意。

redis并不是传统的reactor模型,说实话很多东西硬套概念的话肯定只能钻进个头去漏出个尾巴。它也并不是master,worker这种干干净净的类似于memcached的模型,因为它把命令执行操作给抽取出来了。其中缘由,看上面这张图就够了。

End

那么,下一个吸引杠精的问题难题来了:在这种多线程应用场景下,redis算是I/O密集型,还是计算密集型呢?

或许,如果redis多线程中,无处不在的轮询,属于“计算”的话,它算是一个计算密集型应用吧。

作者简介:小姐姐味道 (xjjdog),一个不允许程序员走弯路的公众号。聚焦基础架构和Linux。十年架构,日百亿流量,与你探讨高并发世界,给你不一样的味道。我的个人微信xjjdog0,欢迎添加好友,​进一步交流。​

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

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

相关文章

关于客户端无法获得服务器端GP服务(Geoprocessing Service)结果的解决办法

之前发布了一个绘制等值面的服务,在本机测试的时候始终都可以访问,没有任何的问题,但是在远程访问时,出现了无法获得GP服务结果(注:结果为图片)的问题,而在服务器端确实生成了正确的结果。困扰了很久之后&a…

c++界面开发_QT开发(三)——GUI原理分析

一、命令行程序命令行程序是面向过程的程序设计。命令行程序的特点:A、基于顺序结构执行B、程序执行过程中不需与用户交互C、程序执行结束给出最终运行结果命令行程序适用场合:A、单任务场合B、无交互、简单交互场合C、服务器应用场合二、GUI程序GUI程序…

pycharm使用_后端开发使用pycharm的技巧

1、使用说明首先说明,本文所使用的功能为pycharm专业版所支持,其他版本如社区版,教育版,则不一定支持。作为一名后端开发,我猜你的桌面上一定打开着一系列的软件,用作开发调试工具,比如navicat数…

@value 静态变量_Java中的变量——通过示例学习Java编程(4)

作者:CHAITANYA SINGH来源:通过示例学习Java编程(4):Java中的变量-方家话题​www.koofun.com变量是用来存放可以更改的值的容器。例如,当我写int i 10; 这里变量名是i,它与值10相关联&#xff…

nmf算法 python_NMF算法简介及python实现

[ pca算法用于原始数据维数较高时对数据进行降维 关于pca算法的学习,有一篇分析特别详细的论文http://www.cs.otago.ac.nz/cosc453/student_tutorials/principal_componen基本原理NMF,非负矩阵分解,它的目标很明确,就是将大矩阵分…

python网络爬虫_Python爬虫实战之网络小说

今天和大家分享的是python爬虫实战,由于本人最近迷上了看网络小说,学生党又穷,只能看看网络dao版小说,现在这类dao版小说网站可以说非常的多,但是所有的网站进去都可以看见一大把的广告信息,非常影响我们的…

java反射机制详解_JAVA反射机制详解_JSP/Java编程_互联网开发技术网_传播最新的编程技术_php361.com...

今天,下午在和朋友聊天的时候,聊起了反射这个话题。我们就从下面这个段简单的代码开始吧。这个代码输出什么,想必大部分的读者跟我一样,会很快地知道答案:0 1 2 3 4 5 6 7 8 9。事实也是如此:朋友这个时候就…

activity 点击后传递数据给fragment_Fragment 新特性 : Fragment Result API 使用以及源码分析

原标题: Android Fragments: Fragment Result原文地址: https://proandroiddev.com/android-fragments-fragment-result......原文作者: Husayn Hakeem今年 Google 推出了 Fragment Result API 和 Activity Results API,用来取代之前的 Activity 和 Fragment 之间通…

android卡片层叠效果_ReactNative之Android绝对布局position:#x27;absolute#x27;问题

工作中会遇到各种各样的问题,ReactNative开发也是填坑不止。比如最近在开发需求中,就遇到一个问题。在一个卡片类型的右上角添加一个删除按钮。使用了绝对布局position:absolute属性,在Android上却无法正常显示,很是烦恼。有一个相…

敏捷开发的6个实战经验

在大型企业中经常是各种软件开发模式混用,一些采用敏捷开发,一些则是采用传统的瀑布式或RUP(统一软件开发过程)。敏捷开发,相对传统软件开发模式,它主要是针对快速变化的需求,不断优化管理流程&…

java 正则匹配括号是否成对_十分钟学会正则表达式

正则表达式用处挺广的,主要用于处理字符串。正则引擎想要在计算机语言中使用正则表达式,那么这门计算机语言必须要利用正则引擎去实现相应的正则库。主要的正则引擎分为以下两类:DFA 确定性的状态机。不使用”回溯”,效率高&#…

android token机制_你真的了解16.6ms刷新机制吗?

阅读本文前,请您先点击上面的蓝色字体“Android扫地僧”,“关注”后再点击置顶公众号,优质干货,重磅资源第一时间送达。散人丶https://juejin.im/post/5ce686a46fb9a07ec754f470前言之前在整理知识的时候,看到android屏…

dfa2.java 原理_DFA编程练习2

题目: 请设计DFA, 使其接受全部含有奇数个1的串, 假定 ∑ {0, 1}.解:DFA可能出现两个个状态:qeven: 读入了偶数个1的串.qodd: 读入了奇数个1的串, 该状态也是终结状态(accept state).它们的状态转移图如下:编写程序, 运行效果如下:测试用例说明:0000不被上图的DFA接受1111不被…

fread读取整个文件_qt如何实现大文件的加载和显示

最近研究了下如何用qt的原生控件来加载和显示大文件(>1G),分享下一些摸索经验。下文源码:compilelife/loginsight​github.com文件的内存映射在开始qt部分之前,我们先了解一个概念——文件的内存映射。我们知道一般…

linux内核编译及添加系统调用(hdu)_浅谈关于Linux内核write系统调用操作的原子性

Linux系统的write调用到底是不是原子的。网上能搜出一大堆文章,基本上要么是翻译一些文献,要么就是胡扯,本文中我来结合实例来试着做一个稍微好一点的回答。先摆出结论吧。结论包含两点,即write调用不能保证什么以及write调用能保…

java 判断对象为控制_Java流程控制

Java流程控制1、Scanner对象①java.util.Scanner是Java5的新特性,可以通过Scanner类来获取用户的输入。②基本语法:1 Scanner snew Scanner(System.in);③通过next()和nextLine()方法接受用户输入,通过hasNext()和hasNextLine()方法来判断用户…

directx最终用户运行时_运维定位服务故障时,前5分钟都在忙啥?

遇到服务器故障,问题出现的原因很少可以一下就想到。我们基本上都会从以下步骤入手,这些也是绝大多数运维工程师在定位故障时前几分钟的主要排查点:一、尽可能搞清楚问题的前因后果不要一下子就扎到服务器前面,你需要先搞明白对这…

IDE--ubuntu下安装 Source insight

2013-06-03 09:05 74人阅读 评论(0) 收藏 举报 习惯了在source insight下编辑阅读源码,在linux下用vi总是用不好 ,还是在ubuntu上用回熟悉的source insight。 在ubuntu中,安装windows程序用wine,然后用wine安装windows软件即可。…

python中什么是数据驱动_利用Python如何实现数据驱动的接口自动化测试

前言 大家在接口测试的过程中,很多时候会用到对CSV的读取操作,本文主要说明Python3对CSV的写入和读取。下面话不多说了,来一起看看详细的介绍吧。 1、需求 某API,GET方法,token,mobile,email三个参数 token为必填项 mo…

密码锁 java接口_从synchronized和lock区别入手聊聊java锁机制

写这篇文章之前,我去百度了一下啥叫锁,百度百科上写道:置于可启闭的器物上,以钥匙或暗码开启。确实我们一般理解的锁就是门锁,密码锁,但是在计算机科学中,锁又是啥,说实话&#xff0…