名词 | 含义 |
---|---|
TPS | 应用每秒处理的请求数 |
AVG | 应用对每一个请求响应的平均时间 |
TP99 | 99%的请求响应时间小于等于该值 |
TP90 | 90%的请求响应时间小于等于该值 |
TP50 | 50%的请求响应时间小于等于该值 |
FAIL | 应用对请求响应的成功、失败比率 |
调用连接 | 一次请求所通过的全部系统的集合产生的链条,反馈了系统将的依赖关系及时许 |
性能测试一般须要监控的指标包括:css
服务器 Linux (包括CPU、Memory、Load、I/O) 数据库:MySQL(缓存命中、索引、单条SQL性能、数据库线程数、数据池链接数) 中间件:1.tomcat 二、nginx 三、memcache 四、Redis(包括线程数、链接数、日志) 网络:吞吐量、吞吐率 应用:Jvm内存、日志、Full GC频率
LoadRunner:用户执行状况、场景状态、事物响应时间、TPS、吞吐量 测试机资源:CPU、Memory、网络、磁盘空间
1.每一个微服务都很小,这样能聚焦一个指定的业务功能或业务需求。 2.微服务可以被小团队单独开发,这个小团队是2到5人的开发人员组成。 3.微服务是松耦合的,是有功能意义的服务,不管是在开发阶段或部署阶段都是独立的。 4.微服务能使用不一样的语言开发。 5.微服务易于被一个开发人员理解,修改和维护,这样小团队可以更关注本身的工做成果。无需经过合做才能体现价值。
1.微服务架构可能带来过多的操做。 2.须要DevOps技巧 (http://en.wikipedia.org/wiki/DevOps)。 3.可能双倍的努力。 4.分布式系统可能复杂难以管理。 5.由于分布部署跟踪问题难。 6.当服务数量增长,管理复杂性增长。
在微服务架构中,注册中心是核心的基础服务之一。在微服务架构流行以前,注册中心就已经开始出如今分布式架构的系统中。Dubbo是一个在国内比较流行的分布式框架,被大量的中小型互联网公司所采用,Dubbo是一个很是实用的框架,提供了比较完善的服务治理功能,而服务治理的实现主要依靠的就是注册中心。
html
那么consul是啥?consul就是提供服务发现的工具
前端
consul是分布式的、高可用、横向扩展的
vue
历史悠久,数据存储格式相似文件系统,经过私有协议访问,集群式架构。优势是成熟稳定,缺点是系统复杂,资源占用高
java
etcd是经过HTTP协议访问的k/v存储系统,采用集群架构,容易部署和使用。但他更多功能是提供存储,要实现服务发现还得配合一些第三方的应用或者本身实现。 \* “registrator”, 自动注册工具,将服务提供方的信息存储到etcd, consul这种kv存储系统 * ”confd“,轻量级的配置管理工具,他能够从etcd里取最新的服务信息生成配置文件,服务使用方就能够用它来实时更新配置文件
mysql
Consul 提供了高可用的kv存储,集群架构,这点和etcd zookeeper相似。 另外也提供了自动服务发现注册的套件,而且可否对服务进行健康检查。 结合consul-template能够实现服务提供方信息更新(好比增长了API服务器)时,自动生成配置文件给服务使用方自动更新配置。
nginx
Spring的两个核心概念是IOC(控制反转)和AOP(面向切面编程)
git
spring原理web
从本质上来讲,Spring Boot就是Spring,它作了那些没有它你也会去作的Spring Bean配置
面试
SpringBoot的优势?Spring因为其繁琐的配置,一度被人认为“配置地狱”,各类XML、Annotation配置,让人眼花缭乱,并且若是出错了也很难找出缘由。SpringBoot帮助开发者快速启动一个Web容器;SpringBoot继承了原有Spring框架的优秀基因;SpringBoot简化了使用Spring的过程。 SpringBoot的缺点?Spring Boot做为一个微框架,离微服务的实现仍是有距离的。没有提供相应的服务发现和注册的配套功能,自身的acturator所提供的监控功能,也须要与现有的监控对接。没有配套的安全管控方案,对于REST的落地,还须要自行结合实际进行URI的规范化工做。
实例化
==>填充属性
==>调用BeanNameAware的setBeanName方法
==>调用BeanFactoryAware的setBeanDactory方法
==>调用ApplicationContext方法
==>调用BeanPostProcess的postProcessBeforeInitialization方法
==>调用InitializingBean的afterPropertiesSet方法
==>调用定制的初始化方法
==>调用BeanPostProcess的postProcessAfterInitialization方法
==>Bean准备就绪
==>调用DispostbleBean的destory方法
==>调用定制的销毁方法
Spring 只帮咱们管理单例模式 Bean 的**完整**生命周期,对于 prototype 的 bean ,Spring 在建立好交给使用者以后则不会再管理后续的生命周期。
HashMap线程是不安全的,HashTable是安全的。HashTable的key和value都不能为null,HashMap的key和value能够为null
我的观点:若是咱们重写了equals方法的话,咱们就必须重写hashcode方法,为何equals()相等,那么hashCode()必须相等。由于,若是两个对象的equals()方法返回true,则它们在哈希表中只应该出现一次;若是hashCode()不相等,那么它们会被散列到表中不一样的位置,哈希表中不止出现一次
若是只修改了hashcode的方法,equlas方法能够没必要要修改
咱们都知道HashMap初始容量大小为16,通常来讲,当有数据要插入时,都会检查容量有没有超过设定的thredhold,若是超过,须要增大Hash表的尺寸,可是这样一来,整个Hash表里的元素都须要被重算一遍。这叫rehash
外一个比较明显的线程不安全的问题是HashMap的get操做可能由于resize而引发死循环(cpu100%)
top oder by with P:1040 // 首先按进程负载排序找到 axLoad(pid) top -Hp 进程PID:1073 // 找到相关负载 线程PID printf “0x%x\n”线程PID: 0x431 // 将线程PID转换为 16进制,为后面查找 jstack 日志作准备 jstack 进程PID | vim +/十六进制线程PID - // 例如:jstack 1040|vim +/0x431 -
记一次线上Java程序致使服务器CPU占用率太高的问题排除过程
FixedThreadPool: FixedThreadPool并非一个类,它是由Executors工具类建立出来的一个固定线程数的ThreadPoolEexcutor的对象。 SingleThreadPool: SingleThreadPool是只有一个线程的线程池,内部实现和FixedThreadPool同样,不过就是线程数有区别。 CachedThreadPool: 一个可缓存线程池,若是线程池长度超过处理须要,可灵活回收空闲线程,若无可回收,则新建线程 ScheduledThreadPoolExecutor: 一个定长线程池,支持定时及周期性任务执行。
1.应尽可能避免在 where 子句中使用!=或<>操做符,不然将引擎放弃使用索引而进行全表扫描
2.对查询进行优化,应尽可能避免全表扫描,首先应考虑在 where 及 order by 涉及的列上创建索引
3.应尽可能避免在 where 子句中对字段进行 null值判断,不然将致使引擎放弃使用索引而进行全表扫描,
如:select id from t where num is null能够在num上设置默认值0,确保表中num列没有null值,
而后这样查询:select id from t where num=0
4.尽可能避免在 where 子句中使用 or 来链接条件,不然将致使引擎放弃使用索引而进行全表扫描,
如:select id from t where num=10 or num=20
能够这样查询:select id from t where num=10 unionall select id from t where num=20
5.下面的查询也将致使全表扫描 select id from t where name like ‘%c%’,左模糊和全模糊查询都会致使搜索引擎放弃索引直接全表扫描,要想使用索引可使用右模糊查询
6.in 和 not in 也要慎用,不然会致使全表扫描
如:select id from t where num in(1,2,3)
对于连续的数值,能用 between 就不要用 in 了:select id from t where num between 1 and 3
7.若是在 where 子句中使用参数,也会致使全表扫描。由于SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,若是在编译时创建访问计划,变量的值仍是未知的,于是没法做为索引选择的输入项。
以下面语句将进行全表扫描:select id from t where num = @num
能够改成强制查询使用索引:select id from t with(index(索引名)) where num = @num
8.应尽可能避免在 where 子句中对字段进行表达式操做,这将致使引擎放弃使用索引而进行全表扫描。
如:select id from t where num/2=100
应改成: select id from t where num=100*2
9.应尽可能避免在where子句中对字段进行函数操做,这将致使引擎放弃使用索引而进行全表扫描。
如:select id from t where substring(name,1,3)=’abc’–name以abc开头的id
select id from t where date diff(day,createdate,’2005-11-30′)=0–’2005-11-30′生成的id
应修改成:select id from t where name like‘abc%’select id from t where createdate>=’2005-11-30′ andcreatedate<’2005-12-1′
10.不要在 where 子句中的“=”左边进行函数、算术运算或其余表达式运算,不然系统将可能没法正确使用索引
11.在使用索引字段做为条件时,若是该索引是复合索引,那么必须使用到该索引中的第一个字段做为条件时才能保证系统使用该索引,不然该索引将不会被使用,而且应尽量的让字段顺序与索引顺序相一致
12.不要写一些没有意义的查询,如须要生成一个空表结构:
如:select col1,col2 into #t from t where 1=0这类代码不会返回任何结果集,可是会消耗系统资源的,
应改为这样:create table #t(…)
13.不少时候用 exists 代替 in 是一个好的选择
如:select num from a where num in(select num from b)
修改为 select num from a where exists(select 1 from b where num=a.num)
14.并非全部索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引,如一表中有字段 sex,male、female几乎各一半,那么即便在sex上建了索引也对查询效率起不了做用。
15.索引并非越多越好,索引当然能够提升相应的 select 的效率,但同时也下降了 insert 及 update 的效率,由于 insert 或 update 时有可能会重建索引,因此怎样建索引须要慎重考虑,视具体状况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要
16.尽可能使用数字型字段,若只含数值信息的字段尽可能不要设计为字符型,这会下降查询和链接的性能,并会增长存储开销。这是由于引擎在处理查询和链接时会逐个比较字符串中每个字符,而对于数字型而言只须要比较一次就够了
17.尽量的使用varchar/nvarchar 代替 char/nchar ,由于首先变长字段存储空间小,能够节省存储空间,其次对于查询来讲,在一个相对较小的字段内搜索效率显然要高些。
18.任何地方都不要使用 select *from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。
19.尽可能避免使用游标,由于游标的效率较差,若是游标操做的数据超过1万行,那么就应该考虑改写
20.在全部的存储过程和触发器的开始处设置SET NOCOUNT ON ,在结束时设置 SET NOCOUNT OFF 。无需在执行存储过程和触发器的每一个语句后向客户端发送 DONE_IN_PROC 消息。
21.尽可能避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。
遵循最左原则
查看SQL语句是否引用了索引,可使用EXPLAIN 方法如:EXPLAIN SELECT * FROM student WHERE cid=1;
之前有个工具叫作mysqlreport。如今他的身份就是percona toolkit。点击连接查看官方网站。能够下载使用手册。
TCP与UDP区别总结: 一、TCP面向链接(如打电话要先拨号创建链接);UDP是无链接的,即发送数据以前不须要创建链接 二、TCP提供可靠的服务。也就是说,经过TCP链接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保 证可靠交付 三、TCP面向字节流,其实是TCP把数据当作一连串无结构的字节流;UDP是面向报文的 UDP没有拥塞控制,所以网络出现拥塞不会使源主机的发送速率下降(对实时应用颇有用,如IP电话,实时视频会议等) 四、每一条TCP链接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通讯 五、TCP首部开销20字节;UDP的首部开销小,只有8个字节 六、TCP的逻辑通讯信道是全双工的可靠信道,UDP则是不可靠信道
TCP协议与UDP协议的区别 首先我们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,不少人犯糊涂了, 一直都是说TCP协议与UDP协议的区别,我以为这是没有从本质上弄清楚网络通讯! TCP/IP协议是一个协议簇。里面包括不少协议的,UDP只是其中的一个, 之因此命名为TCP/IP协议,由于TCP、IP协议是两个很重要的协议,就用他两命名了。 TCP/IP协议集包括应用层,传输层,网络层,网络访问层。 其中应用层包括: 一、超文本传输协议(HTTP):万维网的基本协议; 二、文件传输(TFTP简单文件传输协议); 三、远程登陆(Telnet),提供远程访问其它主机功能, 它容许用户登陆internet主机,并在这台主机上执行命令; 四、网络管理(SNMP简单网络管理协议),该协议提供了监控网络设备的方法, 以及配置管理,统计信息收集,性能管理及安全管理等; 五、域名系统(DNS),该系统用于在internet中将域名及其公共广播的网络节点转换成IP地址。 其次网络层包括: 一、Internet协议(IP); 二、Internet控制信息协议(ICMP); 三、地址解析协议(ARP); 四、反向地址解析协议(RARP)。 最后说网络访问层: 网络访问层又称做主机到网络层(host-to-network),网络访问层的功能包括IP地址与物理地址硬件的映射, 以及将IP封装成帧.基于不一样硬件类型的网络接口,网络访问层定义了和物理介质的链接. 固然我这里说得不够完善,TCP/IP协议原本就是一门学问,每个分支都是一个很复杂的流程, 但我相信每位学习软件开发的同窗都有必要去仔细了解一番。 下面着重讲解一下TCP协议和UDP协议的区别: TCP三次握手过程 第一次握手:主机A经过向主机B 发送一个含有同步序列号的标志位的数据段给主机B,向主机B 请求创建链接,经过这个数据段, 主机A告诉主机B 两件事:我想要和你通讯;你能够用哪一个序列号做为起始数据段来回应我。 第二次握手:主机B 收到主机A的请求后,用一个带有确认应答(ACK)和同步序列号(SYN)标志位的数据段响应主机A,也告诉主机A两件事:我已经收到你的请求了,你能够传输数据了;你要用那个序列号做为起始数据段来回应我 第三次握手:主机A收到这个数据段后,再发送一个确认应答,确认已收到主机B 的数据段:"我已收到回复,我如今要开始传输实际数据了,这样3次握手就完成了,主机A和主机B 就能够传输数据了。 3次握手的特色 没有应用层的数据 SYN这个标志位只有在TCP创建链接时才会被置1 握手完成后SYN标志位被置0。 TCP创建链接要进行3次握手,而断开链接要进行4次 第一次: 当主机A完成数据传输后,将控制位FIN置1,提出中止TCP链接的请求 ; 第二次: 主机B收到FIN后对其做出响应,确认这一方向上的TCP链接将关闭,将ACK置1; 第三次: 由B 端再提出反方向的关闭请求,将FIN置1 ; 第四次: 主机A对主机B的请求进行确认,将ACK置1,双方向的关闭结束. 名词解释 一、ACK 是TCP报头的控制位之一,对数据进行确认。确认由目的端发出, 用它来告诉发送端这个序列号以前的数据段都收到了。 好比确认号为X,则表示前X-1个数据段都收到了,只有当ACK=1时,确认号才有效,当ACK=0时,确认号无效,这时会要求重传数据,保证数据的完整性。 二、SYN 同步序列号,TCP创建链接时将这个位置1。 三、FIN 发送端完成发送任务位,当TCP完成数据传输须要断开时,,提出断开链接的一方将这位置1。 TCP的包头结构: 源端口 16位; 目标端口 16位; 序列号 32位; 回应序号 32位; TCP头长度 4位; reserved 6位; 控制代码 6位; 窗口大小 16位; 偏移量 16位; 校验和 16位; 选项 32位(可选); 这样咱们得出了TCP包头的最小长度,为20字节。 UDP(User Data Protocol,用户数据报协议) 一、UDP是一个非链接的协议,传输数据以前源端和终端不创建链接, 当它想传送时就简单地去抓取来自应用程序的数据,并尽量快地把它扔到网络上。 在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、 计算机的能力和传输带宽的限制; 在接收端,UDP把每一个消息段放在队列中,应用程序每次从队列中读一个消息段。 二、 因为传输数据不创建链接,所以也就不须要维护链接状态,包括收发状态等, 所以一台服务机可同时向多个客户机传输相同的消息。 三、UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小。 四、吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、 源端和终端主机性能的限制。 五、UDP使用尽最大努力交付,即不保证可靠交付, 所以主机不须要维持复杂的连接状态表(这里面有许多参数)。 六、UDP是面向报文的。发送方的UDP对应用程序交下来的报文, 在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界, 所以,应用程序须要选择合适的报文大小。 咱们常用“ping”命令来测试两台主机之间TCP/IP通讯是否正常, 其实“ping”命令的原理就是向对方主机发送UDP数据包,而后对方主机确认收到数据包, 若是数据包是否到达的消息及时反馈回来,那么网络就是通的。 ping命令是用来探测主机到主机之间是否可通讯,若是不能ping到某台主机,代表不能和这台主机创建链接。ping命令是使用 IP 和网络控制信息协议 (ICMP),于是没有涉及到任何传输协议(UDP/TCP) 和应用程序。它发送icmp回送请求消息给目的主机。 ICMP协议规定:目的主机必须返回ICMP回送应答消息给源主机。若是源主机在必定时间内收到应答,则认为主机可达。 UDP的包头结构: 源端口 16位 目的端口 16位 长度 16位 校验和 16位
面试中的排序算法总结(https://www.cnblogs.com/wxisme/p/5243631.html)
冒泡排序、选择排序、插入排序、快速排序、堆排序、希尔排序、归并排序、计数排序、桶排序、基数排序、
算法 | 最快时间复杂度 | 平均时间复杂度 | 最坏时间复杂度 | 空间复杂度 | 是否稳定 |
---|---|---|---|---|---|
冒泡排序 | Ω(n) | Θ(n2) | O(n2) | O(1) | 稳定 |
插入排序 | Ω(n) | Θ(n2) | O(n2) | O(1) | 稳定 |
希尔排序 | Ω(nlogn) | Θ(n(log(n))2) | O(n(log(n))2) | O(1) | 不稳定 |
选择排序 | Ω(n2) | Θ(n2) | O(n2) | O(1) | 不稳定 |
堆排序 | Ω(nlogn) | Θ(nlogn) | O(nlogn) | O(1) | 不稳定 |
归并排序 | Ω(nlogn) | Θ(nlogn) | O(nlogn) | O(n) | 稳定 |
快速排序 | Ω(nlogn) | Θ(nlogn) | O(nlogn) | O(logn) | 不稳定 |
基数排序 | Ω(n+b) | Θ(n+b) | O(n+b) | O(n+k) | 稳定 |
O表示上界(小于等于)Ω表示下界(大于等于)Θ表示便是上界也是下界(等于)
【算法】无序数组中求中位数(https://blog.csdn.net/u010983881/article/details/78160671)
⑴. HTTP协议代理服务器经常使用端口号:80/8080/3128/8081/9080 ⑵. SOCKS代理协议服务器经常使用端口号:1080 ⑶. FTP(文件传输)协议代理服务器经常使用端口号:21 ⑷. Telnet(远程登陆)协议代理服务器经常使用端口:23 HTTP服务器,默认的端口号为80/tcp(木马Executor开放此端口); HTTPS(securely transferring web pages)服务器,默认的端口号为443/tcp 443/udp; Telnet(不安全的文本传送),默认端口号为23/tcp(木马Tiny Telnet Server所开放的端口); FTP,默认的端口号为21/tcp(木马Doly Trojan、Fore、Invisible FTP、WebEx、WinCrash和Blade Runner所开放的端口); TFTP(Trivial File Transfer Protocol),默认的端口号为69/udp; SSH(安全登陆)、SCP(文件传输)、端口重定向,默认的端口号为22/tcp; SMTP Simple Mail Transfer Protocol (E-mail),默认的端口号为25/tcp(木马Antigen、Email Password Sender、Haebu Coceda、Shtrilitz Stealth、WinPC、WinSpy都开放这个端口); POP3 Post Office Protocol (E-mail) ,默认的端口号为110/tcp; WebLogic,默认的端口号为7001; Webshpere应用程序,默认的端口号为9080; webshpere管理工具,默认的端口号为9090; JBOSS,默认的端口号为8080; TOMCAT,默认的端口号为8080; WIN2003远程登录,默认的端口号为3389; Symantec AV/Filter for MSE,默认端口号为 8081; Oracle 数据库,默认的端口号为1521; ORACLE EMCTL,默认的端口号为1158; Oracle XDB(XML 数据库),默认的端口号为8080; Oracle XDB FTP服务,默认的端口号为2100; MS SQL*SERVER数据库server,默认的端口号为1433/tcp 1433/udp; MS SQL*SERVER数据库monitor,默认的端口号为1434/tcp 1434/udp;
DNS是Domain Name Service的缩写,翻译过来就是计算机域名服务器(也有扩写成Domain Name System,译为计算机域名系统)。而之因此本文称DNS服务器为“翻译官”,是由于DNS是进行域名(domain name)和与之相对应的IP地址(IP address)转换的服务器。 一个域名能够指向多个ip,用来作负载均衡嘛。 一样一个ip能够被多个域名指向,就是你们所购买的虚拟主机嘛;一个域名至少解析到一个IP地址,能够解析到多个个IP地址,DNS轮询和CDN加速就是这个原理。
marge 特色:自动建立一个新的commit 若是合并的时候遇到冲突,仅须要修改后从新commit 优势:记录了真实的commit状况,包括每一个分支的详情 缺点:由于每次merge会自动产生一个merge commit,因此在使用一些git 的GUI tools,特别是commit比较频繁时,看到分支很杂乱。 rebase 特色:会合并以前的commit历史 优势:获得更简洁的项目历史,去掉了merge commit 缺点:若是合并出现代码问题不容易定位,由于re-write了history
简单介绍几种经常使用的负载均衡原理(https://www.jianshu.com/p/da6e562fa3a6)
经常使用的负载均衡软件详解(https://blog.csdn.net/chengxuyuanyonghu/article/details/78500297)
负载均衡的几种经常使用算法(https://www.cnblogs.com/me115/p/5000465.html)
Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码。equals()和hashCode()都不是final方法,均可以被重写(overwrite)。
Map中判断key是否相同是经过containsKey()方法进行的,它就是先判断key的hashCode是否相同,再判断key是否相等或equals的。若是存放的key值重复那么会直接覆盖掉与原来的Key值
1.ArrayList是实现了基于动态数组的数据结构,每一个元素在内存中存储地址是连续的;LinkedList基于链表的数据结构 2.LinkedList查询用的遍历,AyyayList查询用的是数组下标,因此对于查询ArrayList性能高于LinkedList,因此检索性能显然高于经过for循环来查找每一个元素的LinkedList。 3.元素插入删除的效率对比,要视插入删除的位置来分析,各有优劣:在列表首位添加(删除)元素,LnkedList性能远远优于ArrayList;在列表中间位置添加(删除)元素,总的来讲位置靠前则LnkedList性能优于ArrayList,靠后则相反;在列表末尾位置添加(删除)元素,性能相差不大。
咱们常常据说List是有序且可重复的,Set是无序且不重复的。这是一个误区,这里所说的顺序有两个概念,一是按照添加的顺序排列,二是按,照天然顺序a-z排列。Set并非无序的传统所说的Set无序指的是HashSet,它不能保证元素的添加顺序,更不能保证天然顺序,而Set的其余实现类是能够实现这两种顺序的。 1,LinkedHashset : 保证元素添加的天然顺序 2,TreeSet : 保证元素的天然顺序
hashset其实就是用hashmap实现的,因此是不安全的
Java中平时用的最多的Map集合就是HashMap了,它是线程不安全的。 看下面两个场景: 一、当用在方法内的局部变量时,局部变量属于当前线程级别的变量,其余线程访问不了,因此这时也不存在线程安全不安全的问题了。 二、当用在单例对象成员变量的时候呢?这时候多个线程过来访问的就是同一个HashMap了,对同个HashMap操做这时候就存在线程安全的问题了。 HashTable HashTable的get/put方法都被synchronized关键字修饰,说明它们是方法级别阻塞的,它们占用共享资源锁,因此致使同时只能一个线程操做get或者put,并且get/put操做不能同时执行,因此这种同步的集合效率很是低,通常不建议使用这个集合。 SynchronizedMap 这种是直接使用工具类里面的方法建立SynchronizedMap,把传入进行的HashMap对象进行了包装同步而已,这个同步方式实现也比较简单,看出SynchronizedMap的实现方式是加了个对象锁,每次对HashMap的操做都要先获取这个mutex的对象锁才能进入,因此性能也不会比HashTable好到哪里去,也不建议使用。 ConcurrentHashMap - 推荐 这个也是最推荐使用的线程安全的Map,也是实现方式最复杂的一个集合,每一个版本的实现方式也不同,在jdk8以前是使用分段加锁的一个方式,分红16个桶,每次只加锁其中一个桶,而在jdk8又加入了红黑树和CAS算法来实现。 做者:Java技术栈 连接:https://www.jianshu.com/p/533bb7cf8901 來源:简书 简书著做权归做者全部,任何形式的转载都请联系做者得到受权并注明出处。
分段机制:segment,每段加reentrantLock可重入锁 定位元素:1 找segment数组下标 2 找segment的HashEntry数组下标 get方法:不须要加锁,value值使用了volatile关键字修饰 put方法:hash计算段---锁定段---hash计算HashEntry数组---若超多阈值---扩容---释放; ConcurrentHashMap是线程安全的,那是在他们的内部操做,其外部操做仍是须要本身来保证其同步的,特别是静态的ConcurrentHashMap,其有更新和查询的过程,要保证其线程安全,须要syn一个不可变的参数才能保证其原子性
vue
、React
、Angular
:是前段三大主流框架
mysql> SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15 //为了检索从某一个偏移量到记录集的结束全部的记录行,能够指定第二个参数为 -1: mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last. //若是只给定一个参数,它表示返回最大的记录行数目: mysql> SELECT * FROM table LIMIT 5; //检索前 5 个记录行 //换句话说,LIMIT n 等价于 LIMIT 0,n。
一、脏读 脏读指一个事务读取了另一个事务未提交的数据。 这是很是危险的,假设A向B转账100元,对应sql语句以下所示 1.update account set money=money+100 where name='B'; 2.update account set money=money-100 where name='A'; 当第1条sql执行完,第2条还没执行(A未提交时),若是此时B查询本身的账户,就会发现本身多了100元钱。若是A等B走后再回滚,B就会损失100元。
二、不可重复读 不可重复读指在一个事务内读取表中的某一行数据,屡次读取结果不一样。 例如银行想查询A账户余额,第一次查询A账户为200元,此时A向账户内存了100元并提交了,银行接着又进行了一次查询,此时A账户为300元了。银行两次查询不一致,可能就会很困惑,不知道哪次查询是准的。 不可重复读和脏读的区别是,脏读是读取前一事务未提交的脏数据,不可重复读是从新读取了前一事务已提交的数据。 不少人认为这种状况就对了,无须困惑,固然是后面的为准。咱们能够考虑这样一种状况,好比银行程序须要将查询结果分别输出到电脑屏幕和写到文件中,结果在一个事务中针对输出的目的地,进行的两次查询不一致,致使文件和屏幕中的结果不一致,银行工做人员就不知道以哪一个为准了。
三、虚读(幻读) 虚读(幻读)是指在一个事务内读取到了别的事务插入的数据,致使先后读取不一致。 如丙存款100元未提交,这时银行作报表统计account表中全部用户的总额为500元,而后丙提交了,这时银行再统计发现账户为600元了,形成虚读一样会使银行不知所措,到底以哪一个为准。
域名解析 --> 发起TCP的3次握手 --> 创建TCP链接后发起http请求 --> 服务器响应http请求,浏览器获得html代码 --> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等) --> 浏览器对页面进行渲染呈现给用户
http请求方法:
GET: 完整请求一个资源 (经常使用) HEAD: 仅请求响应首部 POST:提交表单 (经常使用) PUT: (webdav) 上传文件(可是浏览器不支持该方法) DELETE:(webdav) 删除 OPTIONS:返回请求的资源所支持的方法的方法 TRACE: 追求一个资源请求中间所通过的代理(该方法不能由浏览器发出)
【一次完整的Http请求过程】(https://blog.csdn.net/zjkC050818/article/details/78345819)
HTTP协议是无状态的,咱们看到查到的用到的返回404,500,200,201,202,301.这些不是HTTP协议的状态码。是HTTP的状态码,就是HTTP请求服务器返回的状态码。HTTP协议和HTTP请求返回状态码是二回事。
**HTTP请求方法并非只有GET和POST,只是最经常使用的。据RFC2616标准(现行的HTTP/1.1)得知,一般有如下8种方法:OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE和CONNECT。**
Code | HTTP Operation | Body Contents | Description |
---|---|---|---|
200 | GET,PUT | 资源 | 操做成功 |
201 | POST | 在资源,元数据 | 对象建立成功 |
202 | POST,PUT,DELETE.PATCH | N/A | 全请求已经被接受 |
204 | DELETE,PUT,PATCH | N/A | 操做已经执行成功,可是没有返回数据 |
301 | GET | link | 资源已被移除 |
303 | GET | link | 重定向 |
304 | GET | N/A | 资源没有被修改 |
400 | GET,POST,PUT,DELETE.PATCH | 错误提示(消息) | 参数列表错误(缺乏,但是不匹配) |
401 | GET,POST,PUT,DELETE.PATCH | 错误提示(消息) | 未受权 |
403 | GET,POST,PUT,DELETE.PATCH | 错误提示(消息) | 和访问受限,受权过时 |
404 | GET,POST,PUT,DELETE.PATCH | 错误提示(消息) | 资源,服务未找到 |
405 | GET,POST,PUT,DELETE.PATCH | 错误提示(消息) | 不容许的http方法 |
409 | GET,POST,PUT,DELETE.PATCH | 错误提示(消息) | 资源冲突,或者资源被锁定 |
415 | GET,POST,PUT,DELETE.PATCH | 错误提示(消息) | 不支持的数据(媒体)类型 |
429 | GET,POST,PUT,DELETE.PATCH | 错误提示(消息) | 请求过多被限制 |
500 | GET,POST,PUT,DELETE.PATCH | 错误提示(消息) | 系统内部错误 |
501 | GET,POST,PUT,DELETE.PATCH | 错误提示(消息) | 接口未实现 |
Java中HTTP的CRUD方法
HTTP方法 | 数据处理 | 说明 |
---|---|---|
POST | Create | 新增一个没有id的资源 |
GET | Read | 取得一个资源 |
PUT | Update | 更新一个资源。或新增一个含 id 资源(若是 id 不存在) |
DELETE | Delete | 删除一个资源 |