epoll

三点须知:当我们在开发过程中需要用到分布式缓存Redis的时候

☆樱花仙子☆ 提交于 2020-05-08 23:48:24
当我们在开发过程中需要用到 分布式缓存Redis 的时候,我们首先要明白缓存在系统中用来做什么? 1. 少量数据存储,高速读写访问。通过数据全部in-momery 的方式来保证高速访问,同时提供数据落地的功能,实际这正是Redis最主要的适用场景。 2. 海量数据存储,分布式系统支持,数据一致性保证,方便的集群节点添加/删除。Redis3.0以后开始支持集群,实现了半自动化的数据分片,不过需要smart-client的支持。 华为云分布式缓存Redis ,目前已经进入 Redis5.0 公测阶段,公测阶段注册既能免费使用,那么我们在开发过程中需要用到Redisde 时候,需要明白哪些问题呢? 下面小编给大家一一道来。 一、为什么使用 Redis? 我觉得在项目中使用 Redis,主要是从两个角度去考虑:性能和并发。 当然,Redis 还具备可以做分布式锁等其他功能,但是如果只是为了分布式锁这些其他功能,完全还有其他中间件,如 ZooKpeer 等代替,并不是非要使用 Redis。因此,这个问题主要从性能和并发两个角度去答。 性能: 如下图所示,我们在碰到需要执行耗时特别久,且结果不频繁变动的 SQL,就特别适合将运行结果放入缓存。这样,后面的请求就去缓存中读取,使得请求能够迅速响应。 题外话:忽然想聊一下这个迅速响应的标准。根据交互效果的不同,这个响应时间没有固定标准。

Java BIO、NIO 背后的理论知识

左心房为你撑大大i 提交于 2020-05-08 13:53:19
同步/异步 & 阻塞/非阻塞 摘自一个大佬的定义: 同步和异步说的是消息的通知机制,阻塞非阻塞说的是线程的状态 。 比如,去政府部门办事,材料递上去之后,人家说等着吧(同步阻塞) 同步:发起一个调用后,人家不主动通知我,我要 主动 去检测返回结果(主动询问好了没呀)。 阻塞:在等待调用结果的时候,线程的状态是挂起的(除了等着什么也做不了)。 傻站半天,我先玩会手机,时不时的来问一下工作人员(同步非阻塞) 同步:发起一个调用后,人家不主动通知我,我要 主动 去检测返回结果(时不时的询问好了没呀)。 非阻塞:在等待调用结果的时候,线程可以做其他事情(玩手机)。 因为投诉太多,政府部门出新规定了,材料递上去之后,可以先回家,办妥了之后工作人员会打电话通知(异步非阻塞) 异步:发起一个调用后,我可以立即返回,我 被通知 有结果了(事情办好后,工作人员通知我) 非阻塞:在等待调用结果的时候,线程可以做其他事情(回家做任何事情) 也就是说: 同步需要调用者 主动 去轮询被调用者以获取调用结果,异步则是调用者 被动 的得到被调用者的通知。 阻塞/非阻塞则是在得到调用结果之前,能不能做其他事情。 阻塞在哪个阶段? java.net.ServerSocket#accept 传统的BIO阻塞在accept阶段,在监听到客户端的连接之前都是阻塞状态。 java.nio.channels.Selector

nginx module 开发谈(1)

∥☆過路亽.° 提交于 2020-05-08 06:37:17
nginx是什么?可能很多人不是很了解,除非是做WEB服务器开发的朋友才可能涉猎,而且如果不懂C语言,又或者对WEB SERVER性能要求不高,也是没必要去研究它的。 说到这里,大家想必已经知道,nginx就是一个高性能的WEB SERVER,它的工作就像apache, tomcat一样。那么已经有apache这样的成熟产品了,nginx又有何存在必要呢?下面说下它的特点,各位就明白为何nginx在世界WEB服务里占有相当大的份额了。 1、nginx支持linux的epoll,以及其他常见OS的高性能IO处理方式。 2、nginx用纯C写成。 3、nginx核心代码全部用事件触发机制完成。 4、nginx是跨平台的。 ? 大家从这4个主要特点,应该可以想见nginx到底是怎么玩的了吧? 第1点很清楚,nginx可以很轻松的支持2,3万个并发连接,这个是epoll等模式先天支持的,还能CPU占用率超低。 第2点可以想见,nginx是高性能的。C语言的高效谁不知道呢?呵呵,读它的代码也是相当累,如果想去写nginx的module,自然更累,下面会详述。 第3点很重要,nginx全部用事件触发写成,实际用到的,也就是epoll提供的一些网络IO事件的触发处理。这点是WEB开发者在写自己的module时,实现高性能web服务的关键。 第4点并不重要,因为写web的人都是做服务的

NIO-EPollSelectorIpml源码分析

こ雲淡風輕ζ 提交于 2020-05-08 03:21:45
NIO-EPollSelectorIpml源码分析 目录 NIO-概览 NIO-Buffer NIO-Channel NIO-Channel接口分析 NIO-SocketChannel源码分析 NIO-FileChannel源码分析 NIO-Selector源码分析 NIO-WindowsSelectorImpl源码分析 NIO-EPollSelectorIpml源码分析 前言 本来是想学习Netty的,但是Netty是一个NIO框架,因此在学习netty之前,还是先梳理一下NIO的知识。通过剖析 源码 理解NIO的设计原理。 本系列文章针对的是JDK1.8.0.161的源码。 NIO-Selector源码分析 对 Selector 的功能和创建过程进行了分析,本篇对Linux环境下JDK实现的 EPollSelectorImpl 源码进行详细讲解。 本篇文章不会对EPoll算法进行详细介绍,对epoll算法感兴趣或还不了解的同学可以看 epoll原理详解及epoll反应堆模型 先进行学习。 在详细介绍 EpollSelectorProvider 之前我们先了解一下EPoll主要的三个步骤: 调用 epoll_create 建立一个epoll 对象(在epoll文件系统中给这个句柄分配资源); 调用 epoll_ctl 向epoll对象中添加或删除文件句柄及监控事件。 调用

Nginx安装及配置详解包括windows环境

梦想的初衷 提交于 2020-05-06 02:06:52
nginx概述 nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP3、SMTP代理服务器;nginx可以作为一个HTTP服务器进行网站的发布处理,另外nginx可以作为反向代理进行负载均衡的实现。 这里主要通过三个方面简单介绍nginx 反向代理 负载均衡 nginx特点 1. 反向代理 关于代理 说到代理,首先我们要明确一个概念,所谓代理就是一个代表、一个渠道; 此时就设计到两个角色,一个是被代理角色,一个是目标角色,被代理角色通过这个代理访问目标角色完成一些任务的过程称为代理操作过程;如同生活中的专卖店~客人到adidas专卖店买了一双鞋,这个专卖店就是代理,被代理角色就是adidas厂家,目标角色就是用户 正向代理 说反向代理之前,我们先看看正向代理,正向代理也是大家最常接触的到的代理模式,我们会从两个方面来说关于正向代理的处理模式,分别从软件方面和生活方面来解释一下什么叫正向代理 在如今的网络环境下,我们如果由于技术需要要去访问国外的某些网站,此时你会发现位于国外的某网站我们通过浏览器是没有办法访问的,此时大家可能都会用一个操作FQ进行访问,FQ的方式主要是找到一个可以访问国外网站的代理服务器,我们将请求发送给代理服务器,代理服务器去访问国外的网站,然后将访问到的数据传递给我们! 上述这样的代理模式称为正向代理

Nginx概述、安装及配置详解

北战南征 提交于 2020-05-06 00:26:27
nginx概述 nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP3、SMTP代理服务器;nginx可以作为一个HTTP服务器进行网站的发布处理,另外nginx可以作为反向代理进行负载均衡的实现。 这里主要通过两个方面简单介绍nginx 反向代理 负载均衡 1. 反向代理 关于代理 说到代理,首先我们要明确一个概念,所谓代理就是一个代表、一个渠道; 此时就涉及到两个角色,一个是被代理角色,一个是目标角色,被代理角色通过这个代理访问目标角色完成一些任务的过程称为代理操作过程;如同生活中的专卖店~客人到adidas专卖店买了一双鞋,这个专卖店就是代理,被代理角色就是adidas厂家,目标角色就是用户 正向代理 说反向代理之前,我们先看看正向代理,正向代理也是大家最常接触的到的代理模式,我们会从两个方面来说关于正向代理的处理模式,分别从软件方面和生活方面来解释一下什么叫正向代理 在如今的网络环境下,我们如果由于技术需要要去访问国外的某些网站,此时你会发现位于国外的某网站我们通过浏览器是没有办法访问的,此时大家可能都会用一个操作FQ进行访问,FQ的方式主要是找到一个可以访问国外网站的代理服务器,我们将请求发送给代理服务器,代理服务器去访问国外的网站,然后将访问到的数据传递给我们! 上述这样的代理模式称为正向代理

(前篇:NIO系列 推荐阅读) Java NIO 底层原理

南笙酒味 提交于 2020-05-05 18:40:16
出处: Java NIO 底层原理 目录 1.1. Java IO读写原理 1.1.1. 内核缓冲与进程缓冲区 1.1.2. java IO读写的底层流程 1.2. 四种主要的IO模型 1.3. 同步阻塞IO(Blocking IO) 1.4. 同步非阻塞NIO(None Blocking IO) 1.5. IO多路复用模型(I/O multiplexing) 1.6. 异步IO模型(asynchronous IO) 小结一下 1.1. Java IO读写原理   无论是Socket的读写还是文件的读写,在Java层面的应用开发或者是linux系统底层开发,都属于输入input和输出output的处理,简称为IO读写。在原理上和处理流程上,都是一致的。区别在于参数的不同。   用户程序进行IO的读写,基本上会用到read&write两大系统调用。可能不同操作系统,名称不完全一样,但是功能是一样的。   先强调一个基础知识:read系统调用,并不是把数据直接从物理设备,读数据到内存。write系统调用,也不是直接把数据,写入到物理设备。   read系统调用,是把数据从内核缓冲区复制到进程缓冲区;而write系统调用,是把数据从进程缓冲区复制到内核缓冲区。这个两个系统调用,都不负责数据在内核缓冲区和磁盘之间的交换。底层的读写交换,是由操作系统kernel内核完成的。  1.1.1.

Linux 网络编程 — IO 模型

混江龙づ霸主 提交于 2020-05-05 17:48:24
目录 文章目录 目录 基本概念 同步与异步 阻塞与非阻塞 五种 IO 模型 阻塞 IO 非阻塞 IO 同步 IO(信号驱动) 异步 IO IO 多路复用 select poll epoll 基本概念 同步与异步 同步是指一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成。 异步是指不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了,异步一般使用状态、通知和回调。 阻塞与非阻塞 阻塞是指调用结果返回之前,当前线程会被挂起,一直处于等待消息通知,不能够执行其他业务。 非阻塞是指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。 五种 IO 模型 对于一次IO访问,数据会先被拷贝到内核的缓冲区中,然后才会从内核的缓冲区拷贝到应用程序的地址空间。需要经历两个阶段: 准备数据。 将数据从内核缓冲区拷贝到进程地址空间。 由于存在这两个阶段,Linux 具有下面五种 I/O 模型。 阻塞 IO 当用户进程调用了 recvfrom() 时,内核进入 IO 的第一个阶段:准备数据(内核需要等待足够多的数据再拷贝),这个过程需要等待,用户进程会被阻塞,等内核将数据准备好,然后拷贝到用户地址空间,内核返回结果,用户进程才从阻塞态进入就绪态。 Linux 中,默认情况下所有的 Socket

Nginx、Apache工作原理及Nginx为何比Apache高效

烂漫一生 提交于 2020-05-05 13:27:37
Nginx才短短几年,就拿下了web服务器大笔江山,众所周知,Nginx在处理大并发静态请求方面,效率明显高于httpd,甚至能轻松解决C10K问题。 在高并发连接的情况下,Nginx是Apache服务器不错的替代品。Nginx同时也可以作为7层负载均衡服务器来使用。根据我的测试结果,Nginx 0.7.14 + PHP 5.2.6 (FastCGI) 可以承受3万以上的并发连接数,相当于同等环境下Apache的10倍。 一般来说,4GB内存的服务器+Apache(prefork模式)一般只能处理3000个并发连接,因为它们将占用3GB以上的内存,还得为系统预留1GB的内存。我曾经就有两台Apache服务器,因为在配置文件中设置的MaxClients为4000,当Apache并发连接数达到3800时,导致服务器内存和Swap空间用满而崩溃。 而这台 Nginx 0.7.14 + PHP 5.2.6 (FastCGI) 服务器在3万并发连接下,开启的10个Nginx进程消耗150M内存(15M*10=150M),开启的64个php-cgi进程消耗1280M内存(20M*64=1280M),加上系统自身消耗的内存,总共消耗不到2GB内存。如果服务器内存较小,完全可以只开启25个php-cgi进程,这样php-cgi消耗的总内存数才500M。 在3万并发连接下,访问Nginx 0.7

Nginx 各种使用场景

若如初见. 提交于 2020-05-05 12:37:11
1. Nginx 安装配置 正向代理与反向代理的区别:正向代理客户端(隐藏真实客户端),反向代理服务端(隐藏真实服务端)。 启动nginx : start nginx 配置修改后生效: nginx -s reload 停止nginx: nginx -s stop nginx 参数配置说明 : #运行用户 user nobody; #启动进程,通常设置成和cpu的数量相等 worker_processes 1; #全局错误日志及PID文件 #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; #工作模式及连接数上限 events { #epoll是多路复用IO(I/O Multiplexing)中的一种方式, #仅用于linux2.6以上内核,可以大大提高nginx的性能 use epoll; #单个后台worker process进程的最大并发链接数 worker_connections 1024; # 并发总数是 worker_processes 和 worker_connections 的乘积 # 即 max_clients = worker_processes * worker_connections #