HTTP
HTTP概念:Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则
状态码
状态码
作用
1xx
响应中-临时状态码,表示请求接收,告诉客户端应该请求或者它已经完成则忽略它
2xx
成功-表示请求已经被成功接收,处理已完成
3xx
重定向-重定向到其他地方,让客户端再发起一次请求已完成整个处理
4xx
客户端错误-处理发生错误,责任在客户端。如:请求了不存在的资源、客户端未被授权、禁止访问等
5xx
服务器错误-处理发生错误,责任在服务端。如:程序抛出异常
Get和PostGet
浏览器请求的URL中有参数部分,在浏览器生成的请求消息中,参数部分将附加在请求行中的资源路径后面。
“?”后面的内容为参数信息。参数是由参数名和参数值组成的,并且中间使用等号(=)进行连接。
如果URL地址中有多个参数,参数之间用“&”分隔。
需要注意的是,使用GET方式传送的数据量有限,最多不能超过2KB。
Post
当用户提交表单时,浏览器将使用POST方式提交表单内容,并把form表单的元素及数 ...
ThreadLocal
ThreadLocal概述ThreadLocal类用来提供线程内部的内部变量。这种变量在多线程环境下访问(通过get和set方法访问)时能保证各个线程的变量相对独立于其他线程内的变量。ThreadLocal实例通常来说都是private static类型,用于关联线程和线程的上下文
作用:
提供线程内的局部变量,不同的线程之间不会相互干扰,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数和组件之间一些公共变量的复杂度
常用方法几个ThreadLocal常用的方法
方法声明
描述
ThreadLocal()
创建ThreadLocal对象
public void set(T value)
设置当前线程绑定的局部变量
public T get()
获取当前线程绑定的局部变量
public void remove()
移除当前线程绑定的局部变量
ThreadLocal和Synchronized的区别都能处理多线程并发访问变量的问题,但是处理角度和思路不同
Synchronized
ThreadLocal
原理
同步机制采用“以时间换空间的方 ...
Java注解
Java注解javax.validation.constraints
@NotNull
不能为null,但可以为empty,一般用于判断Integer等基本数据类型,而且被其标注的字段可以使用@size、@Max、@Min对数值进行大小的控制
@NotEmpty
不能为null,长度必须大于0,一般用于集合类或者数组
@NotBlank
只能作用在接收的String类型上,不能为null,而且调用trim()后,长度必须大于0。即必须有实际字符
Java代理机制
Java代理模式概述代理模式是一种设计模式。简单来说就是我们使用代理对象代替对真实对象的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能
代理模式的主要作用是扩展目标对象的功能,比如说在目标对象的某个方法执行前后,你可以增加一些自定义的操作
代理模式有静态代理和动态代理两种实现方式
静态代理静态代理中,我们对目标对象的每个方法的增强都是手动完成的,非常不灵活(比如接口一旦新增加方法,目标对象和代理对象都要进行修改)且麻烦(需要对每个目标类都单独写一个代理类)。 实际应用场景非常非常少,日常开发几乎看不到使用静态代理的场景。
静态代理实现步骤
定义一个接口及其实现类
创建一个代理类同样实现这个接口
将目标对象注入进代理类,然后在代理类的对应方法调用目标类中的对应方法。这样的话,我们就可以通过代理类频闭对目标对象的访问,并且可以在目标方法执行前后自定义操作
代码实例
定义支付接口
123public interface PayService{ String pay(String message);}
实现支付接口
123456p ...
MySQL锁机制
MySQL锁机制概述锁是计算机协调多个进程或线程并发访问某一资源的机制。在程序开发中会存在多线程同步的问题,当多个线程并发访问某个数据的时候,尤其是针对一些敏感的数据(比如订单、金额等),我们就需要保证这个数据在任何时刻最多只有一个线程在访问,保证数据的完整性和一致性。在开发过程中加锁是为了保证数据的一致性,这个思想在数据库领域中同样很重要。
在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。为保证数据的一致性,需要对并发操作进行控制 ,因此产生了 锁 。同时锁机制也为实现MySQL的各个隔离级别提供了保证。 锁冲突也是影响数据库并发访问性能 的一个重要因素。所以锁对数据库而言显得尤其重要,也更加复杂。
MySQL并发事务访问相同记录并发事务访问相同记录的情况大致可以划分为3种:
读-读即并发事务相继 读取相同的记录 。读取操作本身不会对记录有任何影响,并不会引起什么问题,所以允许这种情况的发生。
写-写在这种情况下会发生脏写的问题,任何一种隔离级别都不允许这种问题的发生。所以在多个未提交事务相继对一条记录做改动时,需要让它们排队执 ...
多版本并发控制
再谈隔离级别在MySQL中,默认的隔离级别是可重复读,可以解决脏读和不可重复读的问题,如果仅从定义的角度来看,它并不能解决幻读问题。如果我们想要解决幻读问题,就需要采用可串行化的方式,也就是将隔离级别提升到最高,但这样一来就会大幅降低数据库的事务并发能力
MVCC可以不采用锁机制,而是采用乐观锁的方式来解决不可重复读和幻读问题!
它可以在大多是情况下代替行级锁,降低系统的开销
隐藏字段和Undo Log版本链回顾一下undo日志的版本链,对于使用InnoDB存储引擎的表来说,它的聚簇索引记录中包含两个必要的隐藏列
trx_id:每次一个事务对某条聚簇索引记录进行改动时,都会把该事务的事务id赋值给trx_id隐藏列
roll_pointer:每次对某条聚簇索引记录进行改动时,都会把旧的版本写到undo日志中,然后这个隐藏列就相当于一个指针,可以通过他来找到该记录修改前的信息
举例:假设插入记录的事务id为8,那么此刻该记录的示意图如下所示:
insert undo只有在事务回滚时起作用,当事务提交后,该类型的undo日志就没用了,它占用的Undo Log Segment也会被系统回 ...
TCP四次挥手
TCP四次挥手 TCP 断开连接是通过四次挥手方式。
双方都可以主动断开连接,断开连接后主机中的「资源」将被释放,四次挥手的过程如下图:
客户端打算关闭连接,此时会发送一个 TCP 首部 FIN 标志位被置为 1 的报文,也即 FIN 报文,之后客户端进入 FIN_WAIT_1 状态。
服务端收到该报文后,就向客户端发送 ACK 应答报文,接着服务端进入 CLOSE_WAIT 状态。
客户端收到服务端的 ACK 应答报文后,之后进入 FIN_WAIT_2 状态。
等待服务端处理完数据后,也向客户端发送 FIN 报文,之后服务端进入 LAST_ACK 状态。
客户端收到服务端的 FIN 报文后,回一个 ACK 应答报文,之后进入 TIME_WAIT 状态
服务端收到了 ACK 应答报文后,就进入了 CLOSE 状态,至此服务端已经完成连接的关闭。
客户端在经过 2MSL 一段时间后,自动进入 CLOSE 状态,至此客户端也完成连接的关闭
这里一点需要注意是:主动关闭连接的,才有 TIME_WAIT 状态。
为什么挥手需要四次再来回顾下四次挥手双方发 FIN 包的过程,就能理解为什么 ...
Redis数据类型
Redis数据类型我们都知道 Redis 提供了丰富的数据类型,常见的有五种:String(字符串),Hash(哈希),List(列表),Set(集合)、Zset(有序集合)。
随着 Redis 版本的更新,后面又支持了四种数据类型: BitMap(2.2 版新增)、HyperLogLog(2.8 版新增)、GEO(3.2 版新增)、Stream(5.0 版新增)。
StringString 是最基本的 key-value 结构,key 是唯一标识,value 是具体的值,value其实不仅是字符串, 也可以是数字(整数或浮点数),value 最多可以容纳的数据长度是 512M。
内部实现String 类型的底层的数据结构实现主要是 int 和 SDS(简单动态字符串)。
应用场景缓存对象使用 String 来缓存对象有两种方式:
直接缓存整个对象的 JSON,命令例子: SET user:1 '{"name":"wereash", "age":18}'。
采用将 key 进行分离为 us ...
IP协议
IP协议概述IP协议是TCP/IP协议族的动力,它为上层协议提供无状态、无连接、不可靠的服务。
无状态(stateless)是指IP通信双方不同步传输数据的状态信息,因此所有IP数据报的发送、传输和接收都是相互独立、没有上下文关系的。这种服务最大的缺点是无法处理乱序和重复的IP数据报。
虽然IP数据报头部提供了一个标识字段(见后文)用以唯一标识一个IP数据报,但它是被用来处理IP分片和重组的,而不是用来指示接收顺序的。
无连接(connectionless)是指IP通信双方都不长久地维持对方的任何信息。这样,上层协议每次发送数据的时候,都必须明确指定对方的IP地址。
不可靠是指IP协议不能保证IP数据报准确地到达接收端,它只是承诺尽最大努力(best effort)。很多种情况都能导致IP数据报发送失败
IPV4头部结构
4位版本号(version)指定IP协议的版本。
4位头部长度(header length)标识该IP头部有多少个32 bit字(4字节)。因为4位最大能表示15,所以IP头部最长是60字节。
16位总长度(total length)是指整个IP数据报 ...








