Fork me on GitHub

Netty-02-NIO实战及原理

Netty-02-NIO实战及原理

前言

  • Java NIO 全称 java non-blocking IO,是指 JDK 提供的新 API。从 JDK1.4 开始,Java 提供了一系列改进的输入/输出的新特性,被统称为 NIO(即 New IO),是同步非阻塞

  • NIO 相关类都被放在 java.nio 包及子包下,并且对原 java.io 包中的很多类进行改写。

  • NIO 有三大核心部分:Channel(通道)Buffer(缓冲区), Selector(选择器)

  • NIO是 面向冲区 ,或者面向 编程的。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动,这就增加了处理过程中的灵活性,使用它可以提供非阻塞式的高伸缩性网络

  • Java NIO的非阻塞模式,使一个线程从某通道发送请求或者读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取,而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。 非阻塞写也是如此,一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。

  • 通俗理解:NIO是可以做到用一个线程来处理多个操作的。假设有10000个请求过来,根据实际情况,可以分配50或者100个线程来处理。不像之前的阻塞IO那样,非得分配10000个。

  • HTTP2.0使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大了好几个数量级。

阅读更多...

Mysql-17-主从复制原理

Mysql-17-主从复制原理

前言

  • 主从复制是指将主数据库的DDL和DML操作通过二进制日志传到从数据库上,然后在从数据库上对这些日志进行重新执行,从而使从数据库和主数据库的数据保持一致。

1. 主从复制的原理

  • MySql主库在事务提交时会把数据变更作为事件记录在二进制日志Binlog中;

  • 主库推送二进制日志文件Binlog中的事件到从库的中继日志Relay Log中,之后从库根据中继日志重做数据变更操作,通过逻辑复制来达到主库和从库的数据一致性;

  • MySql通过三个线程来完成主从库间的数据复制,其中Binlog Dump线程跑在主库上,I/O线程和SQL线程跑着从库上;

  • 当在从库上启动复制时,首先创建I/O线程连接主库,主库随后创建Binlog Dump线程读取数据库事件并发送给I/O线程,I/O线程获取到事件数据后更新到从库的中继日志Relay Log中去,之后从库上的SQL线程读取中继日志Relay Log中更新的数据库事件并应用,如下图所示。

mark

阅读更多...

Linux-09-进程调度算法

Linux-09-进程调度算法

前言

mark

  • 进程调度算法也称 CPU 调度算法,毕竟进程是由 CPU 调度的。
  • 当 CPU 空闲时,操作系统就选择内存中的某个「就绪状态」的进程,并给其分配 CPU。

什么时候会发生 CPU 调度呢?通常有以下情况:

  1. 当进程从运行状态转到等待状态;
  2. 当进程从运行状态转到就绪状态;
  3. 当进程从等待状态转到就绪状态;
  4. 当进程从运行状态转到终止状态;

其中发生在 1 和 4 两种情况下的调度称为「非抢占式调度」,2 和 3 两种情况下发生的调度称为「抢占式调度」。

  • 非抢占式的意思就是,当进程正在运行时,它就会一直运行,直到该进程完成或发生某个事件而被阻塞时,才会把 CPU 让给其他进程。
  • 抢占式调度,顾名思义就是进程正在运行的时,可以被打断,使其把 CPU 让给其他进程。那抢占的原则一般有三种,分别是时间片原则、优先权原则、短作业优先原则。
阅读更多...

Linux-05-C10K

Linux-05-C10K

前言

  • 随着互联网的普及,应用的用户群体几何倍增长,此时服务器性能问题就出现。最初的服务器是基于进程/线程模型。新到来一个TCP连接,就需要分配一个进程。假如有C10K,就需要创建1W个进程,可想而知单机是无法承受的。
  • 那么如何突破单机性能是高性能网络编程必须要面对的问题,进而这些局限和问题就统称为C10K问题,最早是由Dan Kegel进行归纳和总结的,并且他也系统的分析和提出解决方案。

C10的本质

  • C10K问题的本质上是操作系统的问题。
  • 对于Web 1.0/2.0时代的操作系统,传统的同步阻塞I/O模型处理方式都是requests per second。
  • 当创建的进程或线程多了,数据拷贝频繁(缓存I/O、内核将数据拷贝到用户进程空间、阻塞,进程/线程上下文切换消耗大, 导致操作系统崩溃,这就是C10K问题的本质。

可见, 解决C10K问题的关键就是尽可能减少这些CPU资源消耗。

阅读更多...

Java-基础-final全家桶

Java-基础-final全家桶

1. final

  • 在java中,final可以用来修饰类,方法和变量(成员变量或局部变量)。下面将对其详细介绍。

1.1 修饰类

  • 当用final修饰类的时,表明该类不能被其他类所继承。当我们需要让一个类永远不被继承,此时就可以用final修饰,但要注意:
  • final类中所有的成员方法都会隐式的定义为final方法。
阅读更多...

Mysql-16-索引覆盖和索引下推

Mysql-16-索引覆盖和索引下推

前言

  • 数据表结构如下:
1
2
3
4
5
6
7
8
9
10
11
create table user (
id int primary key,
name varchar(20),
sex varchar(5),
index(name)
)engine=innodb;

# 接下来两个查询是截然不同的
select id,name where name='shenjian'

select id,name,sex where name='shenjian'

多查询了一个属性,为何检索过程完全不同?

 1.  什么是回表查询?

 2.  什么是索引覆盖?

 3.  如何实现索引覆盖?

哪些场景,可以利用索引覆盖来优化SQL?

PS: 本文试验基于MySQL5.6-InnoDB。

阅读更多...

Redis-17-动态字符串SDS

Redis-17-动态字符串SDS

前言

面试场景

面试官:Redis有哪些数据类型?

我:String,List,set,zset,hash

面试官:没了?

我:哦哦哦,还有HyperLogLog,bitMap,GeoHash,BloomFilter

面试官:就这?回家等通知吧。(GG)

  • 但是,一场面试少说都是半小时起步上不封顶,你这样一句话就回答了这么重要的五个知识点,这个结果是你想要的么?是面试官想要的么?

  • String在Redis底层是怎么存储的?这些数据类型在Redis中是怎么存放的?Redis快的原因就只有单线程和基于内存么?

阅读更多...

Java-基础-异常

Java-基础-异常

1. 什么是异常?

  • 事实上,异常本质上是程序上的错误,包括程序逻辑错误和系统错误。比如使用空的引用数组下标越界内存溢出错误等,这些都是意外的情况,背离我们程序本身的意图。错误在我们编写程序的过程中会经常发生,包括编译期间和运行期间的错误,在编译期间出现的错误有编译器帮助我们一起修正,然而运行期间的错误便不是编译器力所能及了,并且运行期间的错误往往是难以预料的。

  • 假若程序在运行期间出现了错误,如果置之不理,程序便会终止或直接导致系统崩溃,显然这不是我们希望看到的结果。因此,如何对运行期间出现的错误进行处理和补救呢?Java提供了异常机制来进行处理,通过异常机制来处理程序运行期间出现的错误。通过异常机制,我们可以更好地提升程序的健壮性。

  • 在java等面向对象的编程语言中,异常本身就是一个类,产生异常就是创建异常对象并抛出一个异常对象。java中的处理就是中断处理。

 在Java中,异常类的结构层次图如下图所示:

mark

阅读更多...
  • © 2019-2022 Zhuuu
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信