赞
踩
多线程是指程序中包含多个流,即在一个程序中可以同时进行多个不同的线程来执行不同的任务
优点:可以提高CPU利用率, 提高了程序的效率, 单个程序可以创建多个不同的线程来完成各自的任务
缺点:线程也是程序,需要占据内存.多线程需要协调和管理,所以需要CPU跟踪线程.
并发:多个任务在同一个CPU上,按照细分的时间片段轮流交替执行.
并行:单位时间内,多个处理器或者多核处理器同时处理多个任务,真正意义上的同时进行
原子性:一个或多个操作, 要么全部执行且不被打断, 要么就全部不执行
可见性: 多个线程操作一个共享变量时, 其中一个变量修改后, 其他线程可以立刻看到修改结果
有序性:程序的执行顺序按照代码先后顺序来执行
根本区别:进程是操作系统资源分配的基本单元,线程是处理器任务调度和执行的基本单位
包含关系:如果一个进程内有多个线程,则执行的过程不是一条线的,而是多条线(多线程),共同完成,线程是进程的一部分.
内存分配:同一个进程的线程共享本进程的地址空间和资源,进程之间的地址空间和资源是相互独立的.
守护线程:服务线程,准确的来说就是服务其他的线程
死锁是指两个或者以上的进程(线程)在执行过程中, 由于竞争资源或由于彼此通信造成的一种堵塞现象,若无外力作用,都将无法进行推进,此时的系统处于死锁状态.
互斥条件:一个资源只能被一个进程占用,直到该进程被释放
请求与保持条件:一个线程请求被占有资源而发生堵塞时,对以获取资源保持不放
不剥夺条件:线程以获取的资源在未使用完之前不能被其他线程强行剥夺, 只有等自己使用完才释放资源.
循环等待条件: 发生死锁时, 等待的线程必定形成一个环路, 死循环造成永久堵塞.
解决办法:一次申请所有资源. 占有部分资源的线程尝试申请其它资源, 申请不到,主动释放它占有的资源. 按顺序来申请资源.
继承Thread类
实现Runnable接口
实现Callable接口
Executors工具类创建线程池
start()方法用于启动线程, run()方法用于执行线程的运行代码, run()可以反复调用, 而start() 方法只能被调用一次
调用start()方法启动线程可以使线程进入就绪状态, 等待运行; run()方法只是thread的一个普通方法调用, 还是在主线程里执行.
新建(NEW):初始化状态,未启动
就绪(RUNNABLE):已经调用Thread 的start方法启动了, 等待CPU调度, 就绪状态
销毁(TERMINATED):死亡状态, 已正常执行完run()中的方法,或者因为未捕捉的异常而终止run()方法了
计时等待(TIMED_WAITING):睡眠状态, 调用sleep(参数)或wait(参数)后线程进入计时休眠状态,
等待(WAITING):调用wait()方法, 释放锁进入无线等待状态
阻塞(BLOCKED):运行的线程执行wait()方法, 运行的线程获取对象的同步锁时, 同步锁被别的线程占用, 进入阻塞状态.
相同:两者都可以使线程进入等待状态
不同:sleep()是Thread类下的静态方法, wait()是Object类下的方法
sleep()不释放锁, wait()释放锁
wait()常用语线程之间的通信, sleep()常用语暂停执行.
两个线程之间共享变量即可实现共享数据. 一般来说共享变量要求变量本身是线程安全的, 然后再线程中对变量使用
线程安全是指某个方法在多线程的环境下被调用时, 能够正确处理多线程之间的共享变量, 使程序能正确完成.
Servlet不是线程安全的, 它是单实例多线程, 多个线程访问一个方法时, 不能保证共享变量是安全的
提前常见若干个线程, 有任务需要处理, 线程池里的线程就会处理任务, 处理完线程后线程并不会销毁, 而是等待下一个任务,存放在线程池中.
Java提供了一个java.util.concurrent.Executor接口用于创建线程池
newCachedThreadPool:创建一个可缓存线程池
newFixedThreadPool:创建一个定长线程池,提交一个任务就创建,可控制线程最大并发数
newScheduledThreadPool:创建一个固定长度线程池, 支持定时及周期性执行任务
newSingleThreadExecutor:创建一个单线程化的线程池, 它只会用唯一的工作线程来执行任务
重用存在的线程, 减少对象创建销毁的开销
可有效的控制最大并发线程数, 提高系统资源的使用率, 同时避免过多资源竞争, 避免堵塞
提供定时执行, 定期执行, 但线程, 并发数控制等功能
乐观锁:对并发间操作产生的线程安全问题持乐观状态, 将比较-替换这两个动作作为一个原子去修改内存中的变量; 通过不加锁来处理资源
悲观锁: 每次对某资源进行操作时, 都会持有一个独占的锁; 将资源锁住, 等一个之前获得锁的线程释放锁后, 下一个线程才可以访问
Synchronized关键字:用来给方法,代码块加锁。共享对象头。Java自带,Jvm层面。非公平,适合少量代码同步问题
Lock锁实现:共享某个变量。一个Java类。公平,适合大量同步代码同步问题
分布式锁:多个进程不在同一个系统中,使用分布式锁控制多个进程对资源的访问。
synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性。
Java中每一个对象都可以作为锁,这是synchronized实现同步的基础:
集合可以看做是一种容器, 用来存储对象信息
数组长度不可变,无法保存有映射关系的数据, 集合用于保存不确定的数据, 以及保存具有映射关系的数据
数组元素可以使基本类型的值, 也可以是对象, 集合只能保存对象
Java集合类主要有两个接口Conllection和Map
Collection接口常用集合: ArrayList, LinkedList, HashSet, TreeSet, Vector
Map接口常用集合: HashMap, TreeMap
Collections:是集合类的工具类提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。
Collection:集合的顶级接口
List: 有序, 可重复集合, 集合中每个元素都有对应顺序索引
Set: 有序, 不可重复集合, 重复元素会覆盖
Map: 键值对存储, 无序, 元素不可重复,重复元素覆盖
都是集合,底层哈希算法
区别:
jdk1.7: HashMap实际上是一个数组和链表结构的散列表
jdkq.8: 链表中的元素超过了8个后, 会将链表转换为红黑树
ArrayList底层数据结构是数组
LinkList底层数据结构是链表
List转换为数组:ArrayList的toArray方法
数组转换为List:调用Arrays的asList方法
TCP:传输控制协议, 为应用程序提供可靠的通信连接,适合一次传输大批数据的情况,面向连接的协议
UDP: 用户数据包协议, 提供无连接通讯, 且不对传送包进行可靠的保证
TCP为可靠的连接, UDP为不可靠的连接
TCP占有系统资源较多, UDP占有系统资源少
TCP保证数据准确性, UDP可能丢包, TCP保证数据顺序,UDP不保证
建立连接:
一次握手: 客户端发送syn包到服务器,等待服务器确认
二次握手: 服务器收到syn包, 确认客户的syn, 同时自己发送syn + ACK包给客户端并进入等待
三次握手: 客户端收到服务器的SYN + ACK包, 完成三次握手, 开始发送数据
三次握手完成后, 客户端与服务器才正式开始传送数据
断开连接:
一次挥手:主动关闭方发送FIN用来关闭主动方到被动关闭方的数据传送
二次挥手: 被动关闭方收到FIN包后, 发送一个ACK给对方
三次挥手: 被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送
四次挥手: 主动关闭方收到FIN后, 发送一个ACK给被动关闭方
四层网络模型:
应用层:应用程序间沟通的层
传输层:负责传输数据,并确认数据已送达并接收
互联网络层: 负责提供基本的数据封包传送功能
网络接口层:对实际的网络媒体的管理, 定义如何使用实际网络
OSI七层网络模型:
物理层, 数据链路层, 网络层, 传输层, 会话层, 表示层, 应用层
Socket: 用于描述IP地址和端口, 可以用来实现不同虚拟机或者计算机之间的通信, 在Internet上的主机一般运行了多个服务软件, 每种服务打开一个Socket, 并绑定到一个端口上, 不同端口对应不同的服务.
IO流是用来处理设备之间传输数据,下载文件,上传文件。
按照流向分,可以分为输入流和输出流
按照操作单元分,可以分为字节流和字符流
按照角色划分为节点流和处理流
输入流:程序从输入流中读取数据,
输出流:程序向输出流写入数据。程序将数据输出到外界。
网络协议:计算机网络要有条不紊的交换数据, 就必须遵守一些实现约定好的规则, 这些规则被称为网络协议.
网络层协议: IP协议, ICMP协议, ARP协议, RARP协议
传输层协议: TCP协议, UDP协会
应用层协议: FTP, TeInet, SMTP, HTTP, RIP, NFS, DNS
HTTP:(Hyper Text Transfer Protocol 超文本传输协议) 端口80, 运行在TCP上, 明文传输, 短连接, 客户端与服务端都无法验证对方身份
HTTPS: 端口443, 添加了加密和认证机制的HTTP
HTTP协议本身是无状态的, 即服务器无法判断用户身份
cookie: web服务器保存在用户浏览器上的小文件(key-value格式), 包含用户相关信息.
session: 浏览器和服务器会话过程中, 服务器分配的一块存储空间.存放在服务器上
token: 服务器生成的一串字符串, 作为客户端请求的一个令牌, 第一次登陆后, 服务器生成一个token将此token返回给客户端, 客户端请求携带token请求数据即可. 适用于前后端分离项目.
Redis(Remote Dictionary Server) 是一个使用 C 语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)的键值对数据库。
高性能和高并发:直接操作内存,速度快。数据结构简单,对数据操作也简单。采用单线程,不存在加锁释放锁的操作,不会导致死锁。能接受的请求远大于直接访问数据库。
Redis 可以存储键和五种不同类型的值之间的映射。键的类型只能为字符串,值支持五种数据类型:字符串(String)、列表(List)、集合(Set)、散列表(Hash)(内部是HashMap,成员较少以一维数组存储,成员增多转成HashMap)、有序集合(zset)。
优点:读写性能优异,支持数据持久化,支持事务,数据结构丰富,支持主从复制
缺点:
数据库容量收到物理内存的限制。
Redis不具备自动容错和恢复功能
较难支持在线扩容
持久化:把内存中的数据写入到磁盘中,放置服务器宕机导致内存数据丢失。
方式:
RDB(默认Redis DataBase):把当前数据生成快照保存在硬盘
AOF(Append-only file):记录每次对数据的操作到硬盘上
手动持久化命令:
save
- save 和 bgsave命令都可以手动触发RDB持久化
- save 命令会阻塞 Redis 服务,直到 RDB 持久化完成。存储大量数据时,会造成较长时间的阻塞。
bgsave
- Redis 进程会执行 fork操作创建子进程,RDB 持久化由子进程负责,不会阻塞 Redis 服务进程,Redis 服务的阻塞只发生在 fork 阶段。
Redis 会自动触发 RDB 持久化,自动触发的 RDB 持久化都采用 bgsave 的方式
- 配置文件中设置 save 的相关配置,如 save m n,表示在 m 秒被修改过 n 次,自动触发 bgsave 操作。
- 从节点做全量复制时,主节点自动进行 bgsave 操作, 并把生成的 RDB文件发送给从节点。
- 执行 debug reload 命令时也会触发 bgsave 操作。
- 执行 shut down 操作时,如果没有开启 AOF 持久化也会自动触发 bgsave 操作。
比较:
AOF 把每次写命令追加写入日志中,解决了数据持久化的实时性,主流的 Redis 持久化方式。
AOF 文件比 RDB 更新频率高,优先使用aof还原数据
AOF 比 RDB 更安全
RDB 恢复数据速度比 AOF 的快,适合备份,全量复制,灾难恢复等。
AOF 持久化配置
- appendonly yes # appendonly 改为 yes,开启 AOF
- appendfilename “appendonly.aof” # AOF 文件的名字
- appendfsync everysec # AOF 文件的写入方式, everysec 每秒将缓存区内容写入文件 默认的写入方式
- auto-aof-rewrite-percentage 100 # 运行 AOF重写时 AOF 文件大小的增长率的最小值
- auto-aof-rewrite-min-size 64mb # 运行 AOF 重写时文件大小的最小值。
缓存雪崩指缓存同一时间大面积的失效,所以,后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉
解决方案:
1.缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
2.给每一个缓存数据增加相应的缓存标记,记录缓存的是否失效,如果缓存标记失效,则更新数据缓存
3.一般并发量不是特别多的时候,使用最多的解决方案是加锁排队
缓存穿透值缓存和数据库中都没有的数据,导致所有请求都落到数据库上
解决方案:
1.接口层增加校验
2…对一定不存在的key进行过滤,可以把所有可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤。
缓存中没有但数据库中有的数据,由于并发用户多,同时读取缓存未读取到数据,同时去数据库读取数据,数据库压力过大。
解决方案:
1.热点数据永不过期
2.加互斥锁
相关缓存数据直接加载到缓存系统
解决方案:
1.定时缓存刷新
2.数据量不大,可以项目启动自动加载
服务出现问题,不影响核心服务,对其他服务进行降级处理。
Nginx是一个web服务器和方向代理服务器,用于HTTP
、HTTPS
、SMTP
、POP3
和IMAP
协议。
占内存小,可实现高并发连接,处理响应快
可实现http服务器、虚拟主机、方向代理、负载均衡
Nginx配置简单
Nginx内置的健康检查功能
nginx接收一个请求后,首先由listen和server_name指令匹配server模块,再匹配server模块里的location,location就是实际地址
server { # 第一个Server区块开始,表示一个独立的虚拟主机站点
listen 80; # 提供服务的端口,默认80
server_name localhost; # 提供服务的域名主机名
location / { # 第一个location区块开始
root html; # 站点的根目录,相当于Nginx的安装目录
index index.html index.htm; # 默认的首页文件,多个用空格分开
} # 第一个location区块结果
1.正向代理:一个人发送请求直接到达目标的服务器
2.反向代理:请求统一被Nginx接收,nginx反向代理服务器接收到后,按照一定规则分发给后端的业务处理服务器进行处理
可以隐藏源服务器的存在和特征,充当互联网云和web服务器之间的中间层
单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会应为某台服务器负载高宕机而某台服务器闲置的情况。
当用户访问时,先访问到一个转发服务器,再由转发服务器将访问分发到压力更小的服务器。
策略:
1.轮询:每个请求按时间顺序逐一分配到不同的后端服务器
upstream backserver {
server 192.168.0.12;
server 192.168.0.13;
}
2.权重:weight值越大分配到的访问率越高。
upstream backserver {
server 192.168.0.12 weight=2;
server 192.168.0.13 weight=8;
}
3.ip_hash(IP绑定)每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,有效解决动态网页存在的session共享问题
upstream backserver {
ip_hash;
server 192.168.0.12:88;
server 192.168.0.13:80;
}
4.fair
5.url哈希:地址绑定
轻量级的控制反转,面向切面的容器框架
轻量级的Java开发框架,为了解决企业级应用开发的业务逻辑层和其他层的耦合问题
spring功能底层依赖它的核心特性:依赖注入
(DI)和面向切面编程
(AOP)
通过依赖注入和面向接口实现松耦合,基于切面和惯例进行声明式编程,通过切面和模板减少样板式代码。
IOC(控制反转)和AOP(面向切面)和DI(依赖注入)
spring core:提供了框架的基本组成部分,包括IOC和DI功能
spring beans: 提供了BeanFactory,Spring将管理对象称为Bean
spring context: 提供了框架式的对象访问方法
spring jdbc: 提供了一个JDBC的抽象层,简化JDBC
spring aop: 提供了面向切面的编程实现,可以自定义拦截器,切点等
spring Web : 提供了针对web开发的集成特性
1.工厂模式: BeanFactory,用来创建简单对象的实例
2.单例模式: Bean默认为单例模式
3.代理模式: Spring的AOP功能
1.轻量:Spring 是轻量的,基本的版本大约2MB。
2.控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。
3.面向切面的编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。
4.容器:Spring 包含并管理应用中对象的生命周期和配置。
5.MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。
6.事务管理:Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。
7.异常处理:Spring 提供方便的API把具体技术相关的异常(比如由JDBC,Hibernate or JDO抛出的)转化为一致的unchecked 异常。
Spring IOC 负责创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期。
构造器依赖注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。
Setter方法注入:Setter方法注入是容器通过调用无参构造器或无参static工厂 方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入。
接口注入:对于接口注入来说,如果被注入对象想要 IoC 容器为其注入依赖对象,就必须实现某个接口,这个接口提供了一个方法,用来为其注入依赖对象。但是从注入方式的使用来说,接口注入是现在不提倡的一种方式,基本处于"退役"状态,因为它强制被注入实现对象不必要的依赖。
Spring beans 是那些形成Spring应用的主干的java对象。它们被Spring IOC容器初始化,装配,和管理。这些beans通过容器中配置的元数据创建。比如,以XML文件中 的形式定义。
一个Spring Bean 的定义包含容器必知的所有配置元数据,包括如何创建一个bean,它的生命周期详情及它的依赖。
XML配置文件。
基于注解的配置。
基于java的配置。
自动装配的局限性
Spring提供的web框架。
主要由DispatcherServlet,处理映射器,处理器(控制器),视图解析器,视图组成。
核心:
处理器映射:选择使用哪个处理器来处理请求
视图解析器:选择结果应该如何渲染
运行原理:
1.Http请求:客户提交请求到DispatcherServlet
2.寻找处理器:DispatcherServlet控制器查询一个或多个handlerMapping,找到处理的Controller
3.调用处理器:DispatcherServlet请求提交到Controller
4.调用业务处理和返回结果:Controller调用业务处理逻辑后,返回ModelAndView
5.处理视图映射并返回模型:DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图。
6.Http响应:视图负责将结果显示到客户端。
精简了配置的Spring,使用约定优于配置
的原则
mvn spring-boot:run
启动优点
特性
常用注解
产生一个bean交给Spring管理
传统软件行业(传统项目)
互联网软件(互联网项目)
部署单一
技术单一
系统错误隔离性差
系统可扩展性差
项目复杂度降低
团队界限明确
扩展灵活,并发承受能力强
运维成本较高,复杂性提高。
单体式架构项目提升性能较为困难,需要对整体模块进行提升,较为困难
微服务架构拆分成了独立的模块,扩展较为简单。
设计原则:
围绕业务切分(粗粒度拆分)
单一职责
谁创建,谁负责
Provider和Consumer
Provider:服务提供者,提供数据服务,(部分Service和DAO的集合)
Consumer:服务消费者,消费数据服务(Controller和部分Service集合)
RPC和Restful
RPC:远程过程调用(远程过程调用的形式/(自己的协议)来实现数据传输)
Resuful:一种HTTP协议风格(GET:查询;POST:新增;PUT:修改;DELETE:删除)
注册中心(为了解决不同服务,分布式项目之间的地址获取问题)
分开部署
问题:
分布式session
分布式锁
分布式事务
对项目业务单元的拆分(细粒度的拆分)
高性能,轻量级的Java RPC框架,提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,服务自动注册和发现。
Dubbo不是完整的微服务解决方案,只能说是基于Dubbo可以有一套微服务解决方案。
Provider:暴露服务的服务提供方
Consumer:调用远程服务的服务消费方
Registry:服务注册与发现的注册中心(推荐使用zookeeper)
Monitor:统计服务的调用次数和调用时间的监控中心
Container:服务运行服务器
1.Spring配置方式
2.Java API配置方式
service:服务配置
reference:引用配置
protocol:协议配置
application:应用配置
module:模块配置
registry:注册中心配置
monitor:监控中心配置
provider:提供方配置
consumer:消费方配置
method:方法配置
argument:参数配置
1.面向接口代理的高性能RPC调用
2.智能负载均衡
3.服务自动注册与发现
4.高度可扩展能力
5.运行期流量调度
6.可视化的服务治理与运维
Spring Cloud是一套完整的微服务解决方案。
Spring公司基于Netflix(网飞)开源的一套微服务组件来进行Spring Cloud开发。
Spring Boot是为了更好的服务微服务项目。
Servlet:(Server Applet)运行在服务器上的一个小程序,用来处理服务器请求
jsp善于表现于页面展示,Servlet善于逻辑控制
jsp是Servlet的简化,Servlet是一个完整的Java类。
Hash索引和B+Tree索引
Hash索引适合等值查询,无法进行范围查询。
Hash索引无法利用索引完成排序。
Hash索引不支持多列联合索引的最左侧匹配规则
消息队列是异步rpc的主要手段之一。
消息队列是一种可以存储,传递消息的容器,常用语分布式系统中减轻服务器压力,有顺序
通过异步处理提高系统性能和削峰,降低耦合性
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。