epoll

他来了,支持多线程的Redis6.0他来了!

故事扮演 提交于 2020-12-24 15:59:42
来源:https://www.cnblogs.com/mr-wuxiansheng/p/12884356.html 作者:Mr_伍先生 本文总结下来主要以下几点: 虽然支持多线程,但默认不开启 配置线程数要小于CPU数 虽然开了多线程,但其实还是单线程处理逻辑,不用担心线程安全问题 多线程主要解决I/O读写瓶颈问题,针对业务量达到亿级的应用,常规项目没有必要使用 Redis 6.0 之前的版本真的是单线程吗? Redis 在处理客户端的请求时,包括获取(Socket 读)、解析、执行、内容返回(Socket 写)等都由一个顺序串行的主线程处理,这就是所谓的“单线程”。 但如果严格来讲从 Redis 4.0 之后并不是单线程,除了主线程外,它也有后台线程在处理一些较为缓慢的操作,例如清理脏数据、无用连接的释放、大 Key 的删除等等。 Redis 6.0 之前为什么一直不使用多线程? 官方曾做过类似问题的回复:使用 Redis 时,几乎不存在 CPU 成为瓶颈的情况, Redis 主要受限于内存和网络。 例如在一个普通的 Linux 系统上,Redis 通过使用 Pipelining 每秒可以处理 100 万个请求,所以如果应用程序主要使用 O(N) 或 O(log(N)) 的命令,它几乎不会占用太多 CPU。 使用了单线程后,可维护性高。多线程模型虽然在某些方面表现优异

C++性能之惊群问题

岁酱吖の 提交于 2020-12-23 13:44:24
何谓惊群问题? 场景1:6只小鸟停在电线上休息,都在等待食物。 场景2:我们向鸟群投放一条小虫,作为它们的食物。 场景3:6只小鸟看到有食物到来,都停止休息,一起飞起来去抢夺食物。 场景4:最终只有一只小鸟(bird4)能够吃到食物,其他小鸟无奈而又伤心的回到电线上继续休息。 上面我们的小场景实际就是一个现实中的惊群问题,明明只有一条小虫子子到来,6只小鸟却都要停止休息去抢夺食物,除了抢到食物的小鸟,其他抢不到食物的小鸟又需要重新飞回去休息,对于这部分小鸟来说,无谓浪费了很多体力。 那么计算机中惊群又是什么样呢?其实与上述场景类似,多个线程(或者进程)同时等待一个事件的到来并准备处理事件,当事件到达时,把所有等待该事件的线程(或进程)均唤醒,但是只能有一个线程最终可以获得事件的处理权,其他所有线程又重新陷入睡眠等待下次事件到来。这种线程被频繁唤醒却又没有真正处理事件导致CPU无谓浪费称为计算机中的“惊群问题”。 惊群问题出现场景 Linux2.6内核版本之前系统API中的accept调用 在Linux2.6内核版本之前,当多个线程中的accept函数同时监听同一个listenfd的时候,如果此listenfd变成可读,则系统会唤醒所有使用accept函数等待listenfd的所有线程(或进程),但是最终只有一个线程可以accept调用返回成功

Nginx实现高速并发处理的原理详解

大憨熊 提交于 2020-12-21 16:11:14
  众所周知,Nginx是当下最流行的Web服务器,它具有很强的负载均衡,反向代理,邮件代理以及静态缓存的功能。在提供这些功能的同时,Nginx的性能也极其优秀,可以轻松支持百万、千万级的并发连接,能够为Tomcat、Django等性能不佳的Web应用抗住绝大部分外部流量。那么,Nginx是如何实现高速并发处理呢?这就要从它优秀的架构设计来说起。   框架结构   如下图所示,Nginx结合采用多进程和IO多路复用的结构处理并发客户请求。   Master进程主要负责信号处理,监控和管理Worker进程。 Master进程本身不处理具体业务。Worker进程处理具体业务,包括处理连接请求和网络读写事件的处理。多个worker进程可以独立地处理各自的客户连接。Worker进程之间通过信号量和共享内存进行通信。      通过配置与系统CPU等量的worker进程,可以实现某一个进程绑定某一个特定CPU从而减少系统开销。在每一个worker进程处理多个client并发连接请求时,Nginx 采用IO多路复用技术在一个进程内同时处理多个client的网络读写事件。与多进程/线程处理多连接请求模型相比,IO多路复用可以减少大量的进程调度带来的系统开销,从而提高系统整体的处理性能。   并发处理方式      网络服务器在处理并发处理方式,如上图socket处理流程所示

聊聊Linux 五种IO模型 猿码架构

我只是一个虾纸丫 提交于 2020-12-20 18:01:19
上一篇 《聊聊同步、异步、阻塞与非阻塞》 已经通俗的讲解了,要理解同步、异步、阻塞与非阻塞重要的两个概念点了,没有看过的,建议先看这篇博文理解这两个概念点。在认知上,建立统一的模型。这样,大家在继续看本篇时,才不会理解有偏差。 那么,在正式开始讲Linux IO模型前,比如:同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的。所以先限定一下本文的上下文。 1 概念说明# 在进行解释之前,首先要说明几个概念: 用户空间和内核空间 进程切换 进程的阻塞 文件描述符 缓存 IO 1.1 用户空间与内核空间## 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。 操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限 。为了保证用户进程不能直接操作内核(kernel),保证内核的安全, 操作系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间 。针对linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空间,而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为用户空间。 1.2 进程切换## 为了控制进程的执行

5种Redis数据结构详解

倖福魔咒の 提交于 2020-12-19 15:24:57
本文主要和大家分享 5种Redis数据结构详解,希望文中的案例和代码,能帮助到大家。 转载链接:https://www.php.cn/php-weizijiaocheng-388126.html 2.1.1 全局命令 1 查看所有键 key* 2 键总数 dbsize (dbsize命令在计算键总数的时候不会遍历所有键,而是直接获取Redis内置的键总数变量,时间复杂度为O(1),而keys命令会遍历所有键,时间复杂度为O(n),当Redis保存了大量键时,线上环境禁止使用) 3 检查键是否存在 exists key 存在返回1,不存在返回0 4 删除键 del key 返回成功删除键的个数,不存在的返回0 5 键过期 expire key seconds ttl 命令会返回剩余过期时间 -1 键没设置过期时间 -2 键不存在 6 键的数据类型结构 type key 返回类型,不存在返回none 2.1.2 数据结构和内部编码 每种数据结构都有自己的底层的内部编码实现,而且是多种实现,这样Redis会在合适的场景选择合适的内部编码 每种数据结构都有两种以上的内部编码实现,例如list数据结构包含了linkedlist和ziplist两种内部编码,可以通过object encoding命令查询内部编码 Redis这样设计有两个好处:   第一:可以改进内部编码

腾讯C++后台开发面试笔试知识点参考笔记

[亡魂溺海] 提交于 2020-12-19 03:12:32
文章是由我笔试面试腾讯笔记整理而来,主要是针对面试的C++后台开发岗位,涵盖了大部分C++后台开发相关可能会考察和被问到的技术点。 自认为这篇笔记是比较全面的总结,不管你是已经工作准备参加社招,还是在校学生准备参加校招,笔记都可以作为技术面试准备阶段参考查阅,查缺补漏。 笔记是基础C++知识点总结,没有过多的阐述后台开发的系统架构和分布式后台服务设计相关,还有c++11新特性,这些笔试面试也会被问到但不在这篇讨论范围,可以关注我后面有时间再补上。 阅读提示 文章约12839字,阅读时长预计33分钟。建议关注收藏方便回头查阅。 gdb调试命令 step和next的区别? 当前line有函数调用的时候,next会直接执行到下一句 ,step会进入函数. 查看内存 (gdb)p &a //打印变量地址 (gdb)x 0xbffff543 //查看内存单元内变量 0xbffff543: 0x12345678 (gdb) x /4xb 0xbffff543 //单字节查看4个内存单元变量的值 0xbffff543: 0x78 0x56 0x34 0x12 多线程调试 (gdb) info threads:查看GDB当前调试的程序的各个线程的相关信息 (gdb) thread threadno:切换当前线程到由threadno指定的线程 break filename:linenum

2020校招面试

三世轮回 提交于 2020-12-19 00:05:13
个人情况 岗位:后台 golang 开发 公司:字节 shopee 拼多多百度阿里快手都有 途径:提前批内推 学历:某 985 大三 实习情况:一段小厂实习 项目和准备:实习时候做的是一个分布式存储系统以及一个 kv 数据库,这也是面试的重点 计算机网络 1,tcp 中 timewait 状态的作用,为什么要等待两个 msl 2,tcp 中三次挥手开启连接,四次握手关闭连接的流程 3,聊聊 tcp 的滑动窗口 4,ssl 建立过程 5,输入一个 url 的过程 6,大文件传输 1,答:为了确认被动关闭端接受到最后一个ack,避免主动关闭端重新在相同端口启动连接后发送syn后被动关闭端认为上一个连接没有完全关闭,进而返回rst终止连接 2,答:就是那个著名的连接建立图 3,答:滑动窗口由接受窗口和拥塞窗口中的最小值,然后就是reno的慢启动,拥塞控制,快速重传三个步骤。然后我还谈了谈cubic算法。 4,答:很详细的描述。从客户端发送clienthello包括ssl版本,对称算法,第一个不重数,mac算法,公钥算法。重点是一共生成了三个不重复数,从主密钥解出了四个密钥,两个用于会话加密,两个用于mac加密。为什么是两个呢,因为一个用于客户端到服务器的会话加密,另一个用于服务器到客户端的会话加密。这里要提醒证书机制并不是完全安全的,因此有EXPECT_CT这个浏览器的头

腾讯C++后台开发面试笔试知识点参考笔记

痴心易碎 提交于 2020-12-18 07:53:22
文章是由我笔试面试腾讯笔记整理而来,主要是针对面试的C++后台开发岗位,涵盖了大部分C++后台开发相关可能会考察和被问到的技术点。 自认为这篇笔记是比较全面的总结,不管你是已经工作准备参加社招,还是在校学生准备参加校招,笔记都可以作为技术面试准备阶段参考查阅,查缺补漏。 笔记是基础C++知识点总结,没有过多的阐述后台开发的系统架构和分布式后台服务设计相关,还有c++11新特性,这些笔试面试也会被问到但不在这篇讨论范围,可以关注我后面有时间再补上。 阅读提示 文章约12839字,阅读时长预计33分钟。建议关注收藏方便回头查阅。 gdb调试命令 step和next的区别? 当前line有函数调用的时候,next会直接执行到下一句 ,step会进入函数. 查看内存 (gdb)p &a //打印变量地址 (gdb)x 0xbffff543 //查看内存单元内变量 0xbffff543: 0x12345678 (gdb) x /4xb 0xbffff543 //单字节查看4个内存单元变量的值 0xbffff543: 0x78 0x56 0x34 0x12 多线程调试 (gdb) info threads:查看GDB当前调试的程序的各个线程的相关信息 (gdb) thread threadno:切换当前线程到由threadno指定的线程 break filename:linenum

十年电商大厂面试官总结100道大厂高频面试题:Dubbo,ElasticSearch,JVM,多线程/高并发,消息中间件

江枫思渺然 提交于 2020-12-17 15:26:29
从业十多年,我从一位向往大厂的面试者成为了一个大厂面试官,身边很多从事Java 开发的朋友都不时咨询如何才能进大厂。的确,进大厂对于大多数人来说,绝不只是谈资,而是一种技术追求。像阿里、腾讯、字节这样的大厂,技术氛围和技术规范都明显优于体量较小的公司,业务场景也更加丰富、更具挑战性。 在大厂锻炼几年,可以更好地提升个人能力,对以后的职业规划也有更多选择。 话虽如此,要拿到大厂offer并不容易。简历投递如同大浪淘沙,面试过程也是竞争激烈。特殊时期大厂需求降低,要求反而更高。没有十足准备,很难通过层层筛选。不少Java人的问题并不是技术功底不过关,而是没有形成系统、全面的知识体系,总是被面试官问得哑口无言。 结合自己多年电商大厂面试官的经历,我将这些年常问的知识点从头梳理,整理成100道电商大厂核心面试题,涵盖了 大厂必考点、高频点和涨薪点 ,相信对大家准备面试会有一定帮助,也能解决一部分开发人在日常项目中遇到的问题。 这些点一共分成 5 大类,分别是: Dubbo,ElasticSearch,JVM,多线程/高并发,消息中间件 。我把关于这些问题的拆解与思考,整理成一个 pdf,限于篇幅,这里就不一一列出了。需要的同学可以文末领取,希望能从中有所启发、收获。 这里先罗列出近三年部分技术考核点,具体有: 1 Dubbo 1.1 服务调用超时问题怎么解决? 1.2

Nginx 原理篇

风格不统一 提交于 2020-12-13 00:34:26
前言 在学习 Nginx 之前,我们首先有必要搞清楚下面几个问题:   1. Web服务器是怎么工作的?   2. Apache 与 Nginx 有何异同?   3. Nginx 工作模式是怎样的? 下面就围绕这几个问题,进行解释(内容来自网络及个人理解) 常见 Web 服务器服务方式 三种工作模式比较: Web 服务器主要为用户提供服务,必须以某种方式,工作在某个套接字上,一般Web服务器在处理用户请求时,一般有如下三种方式:   (1)多进程   (2)多线程   (3)异步 1. 多进程   为每个请求分配一个进程来处理。由于操作系统中,生成进程、销毁进程、进程间切换都很消耗CPU和内存,当负载高时,性能会明显下降。   优点:采用独立进程处理进程的方式,进程之间是独立的,单个进程的异常不会影响到其他进程的工作,因此稳定性最好   缺点:在高负载的时候,操作系统不可能无限制的为用户请求创建进程,CPU在众多进程之间切换的开销也会增加,而且进程之间的独立性,资源无法共享,造成内存的重复利用 2. 多线程   一个进程中生成多个线程来响应用户请求。由于线程开销相对进程来说小的多,而且线程共享进程的部分资源,因此线程比进程更轻量级,更高效。   优点:线程比较进程来说,更轻量级,使用一个进程多个线程的方式,而且多个线程可以共享进程的资源,可以支持更多的请求。   缺点:高负载时