Netty-NIO与零拷贝
Netty-NIO与零拷贝
零拷贝基本介绍
- 零拷贝是网络编程的关键,很多性能优化都离不开
- 在Java程序中,常用的零拷贝有mmap(内存映射)和sendFile
- 零拷贝并非是不拷贝,而是没有CPU拷贝
- 所说的零拷贝,是从操作系统的角度来说的。因为内核缓冲区之间,没有数据是重复的(只有kernel buffer有一份数据)
- 零拷贝不仅带来更少的数据复制,还能带来其它的性能优势,例如更少的上下文切换,更少的CPU缓存伪共享以及无CPU校验和计算
Netty-NIO-Buffer&Channel 案例
Netty-NIO-Buffer&Channel&Selector
Netty-NIO-Buffer&Channel&Selector
基本介绍
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大了好几个数量级
Netty-NIO-Buffer&Channel&Selector
Netty-NIO-Buffer&Channel&Selector
基本介绍
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大了好几个数量级
Netty-BIO
Nginx入门
数据库-事务
数据库-事务
数据库并发问题
脏读
事务1:将某条记录的Age值从20修改为30
事务2:读取了事务1更新后的值:30
事务1:回滚,Age值恢复到20
事务2:读取的30就是一个无效值
不可重复读
事务1:读取Age值为20
事务2:将Age修改为30
事务1:两次读取Age值为30,和第一次值读取不一致
幻读
事务1:读取了Stu表中一部分数据
事务2:向Stu表中插入了新的行
事务1:读取Stu表时,多出了一些行
项目中的问题
SpringBoot-任务
SpringBoot-任务
1、异步任务
在Application上
1
2
3
4/**
* @EnableAsync:开启异步注解
*/
@EnableAsync异步处理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15@Service
public class AsyncService {
/**
* 告诉Spring这是一个异步的
*/
@Async
public void hello(){
try{
Thread.sleep(3000);
}catch (InterruptedException e){
e.printStackTrace();
}
System.out.println("处理数据中");
}
}