自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(51)
  • 收藏
  • 关注

原创 Token、Session、Cookie的区别

token的意思是“令牌”,是用户身份的验证方式,最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由于token的前几位+盐 以hash算法压缩成一定长的16进制字符串,可以防止恶意第三方拼接token请求服务器),还可以把不变的参数也放进token,避免多次查库。传统的身份验证:session + cookie客户端访问,通过验证...

2019-02-28 10:04:22 363

原创 通用缓存Key封装

public interface KeyPrefix { public int expireSeconds(); public String getPrefix();}public abstract class BasePrefix implements KeyPrefix{ private int expireSeconds; private String pref...

2019-02-28 09:34:31 424

原创 MyBatis中 #{ } 和 ${ } 的区别

#{}在动态解析阶段,解析为一个JDBC预编译语句(Prepared Statement)的参数标记符? ${}在动态解析的时候,会将我们传入的参数当作String字符串直接填充到我们的语句中 两者可以获取对象中的属性值 两者都不会自动地在SQL语句中添加引号 使用${}存在SQL注入的风险,所以在能使用#{}的地方就尽量用#{} 因为SQL注入只能对编译过程起作用SQL注入(例如“o...

2019-02-28 09:19:57 116

原创 Java类初始化顺序

对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)--> (变量,初始化块)--> 构造器public class InitialOrderTest { /* 静态变量 */ public static String staticField = "静态变量"; /* 变量 */ ...

2019-02-28 08:55:18 102

原创 超卖问题解决

本项目超卖有两种:1. 不同用户在读请求的时候,发现商品库存足够,然后同时发起请求,进行秒杀操作,减库存,导致库存减为负数。2. 同一用户在有库存的时候,连续发出多个请求,两个请求同时存在,于是生成了多个订单。对于第二种:可以在数据库里将用户id和商品id加上唯一索引。对于第一种:1. 最简单的方法,更新数据库减库存的时候,进行库存限制条件。 and stock_co...

2019-02-27 19:16:31 5570 2

原创 fail-fast vs fail-safe

fail-fast iterators fail-safe iterator 不允许在遍历的同时对集合进行修改 允许一边遍历一遍修改集合 出现ConcurrentModifiedException   用原始集合去遍历集合中的元素 用原始集合的副本进行遍历 迭代器不需要额外内存空间 迭代器需要额外内存空间 ArrayList,Vector,Hash...

2019-02-27 11:12:07 154

原创 Thymeleaf

Thymeleaf是一个Java库。它是一个XML / XHTML / HTML5模板引擎,能够应用于转换模板文件, 以显示您的应用程序产生的数据和文本。1. 默认情况下, 静态网页存放于static目录下,默认的"/"指向的是~/resouces/static/index.html文2. 如果引入了thymeleaf,则默认指向的地址为~/resouces/template...

2019-02-27 09:52:43 77

原创 分布式环境下,管理Session的方式

一、session复制在支持session复制的web服务器上,通过修改web服务器配置,可以实现session同步到其它web服务器上,达到每个web服务器上都保存一致的session。适用于机器较少,网络流量较小优点:实现简单、配置较少、当网络中有机器down掉不影响用户使用。缺点:在数据量很大的情况下,不仅会占用网络资源,而且还会导致延迟适用场景:只适用于Web服务器比较...

2019-02-27 09:45:06 262

原创 项目 两次MD5

第一次 (在前端加密,客户端):密码加密是(明文密码+固定盐值)生成md5用于传输,目的,由于http是明文传输,当输入密码若直接发送服务端验证,此时被截取将直接获取到明文密码,获取用户信息。加盐值是为了混淆密码,原则就是明文密码不能在网络上传输。第二次:在服务端再次加密,当获取到前端发送来的密码后。通过MD5(密码+随机盐值)再次生成密码后存入数据库。防止数据库被盗的情况下,通过md...

2019-02-27 09:11:21 210

原创 Java内存是怎么分配的

对象优先在新生代eden区分配 (当eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC) 大对象直接进入老年代 (大对象:需要大量连续内存空间的Java对象,如长的字符串以及数组) 长期存活对象直接进入老年代(虚拟机设计了一个对象年龄计数器,每经过一次MInor GC 年龄+1,该阀值为15) 动态对象年龄判断  (如果survivor区相同年龄所有对象大小的总和大于surv...

2019-02-25 14:14:29 327

原创 hashcode、equals、==的区别

equals与hashcode的区别1. 如果两个对象相等(equals),那么他们一定有相同的哈希值(hashcode)。2. 如果两个对象的哈希值相等,那么这两个对象有可能相等也有可能不相等。(需要通过equals来判断) equals与==的区别:equals是用来比较两个对象内部的内容是否相同的==是用来判断两个对象的地址是否相同,即是否是同一个对象如果没有重写...

2019-02-25 13:51:46 91

原创 TCP流量控制与拥塞控制

发送方在确定发送报文段的速率时,既要根据接受方的接受能力,又要从全局考虑不要使用网络发生拥塞。因此TCP协议要求发送方维护两个窗口:接收窗口rwnd,接收方根据目前接收缓存大小所许诺的最新的窗口值,反映了接收方的容量。由接收方根据其放在TCP报文的首部的窗口字段通知发送方。 拥塞窗口cwnd,发送方根据自己估计的网络拥塞程度而设置的窗口 值,反映了网络的当前容量。只要网络没...

2019-02-24 20:33:53 148

原创 TCP可靠传输

滑动窗口协议:后退N帧协议:发送窗口>1,接收窗口=1. 选择重传协议:发送窗口>1,接收窗口>1.TCP可靠传输:(为了保证接收方进程从缓存区读出的字节流与发送方发出的字节流是完全一样的)1. 校验和:检测分组的比特错误。2. 序号: TCP连接中传送的数据流中的每一个字节都编上一个序号。  确认号:期望收到对方的下一个报文段数据的第一个字节的序号。3....

2019-02-23 16:28:28 136

原创 HTTP

HTTP(超文本传输协议):HTTP请求报文格式GET /somedir/page.html HTTP/1.1 请求行Host: www.someschool.edu 首部行(下面都是首部行)Connection: closeUser-agent: Mozilla/5.0Accept-language: cn请求行有3个字段:方法字段...

2019-02-23 11:07:49 110

原创 mysql InnoDB下的锁 next-key locking

两个标准的行级锁:共享锁(S Lock): 允许事务读一行数据排他锁(X Lock):允许事务删除或更新一行数据。表级别锁(意向锁):意向共享锁(IS Lock),事务想要获得一张表中某几行的共享锁。意向排他锁(IX Lock), 事务想要获得一张表中某几行的排他锁。InnoDB存储引擎有3中行锁的算法:Record Lock:单个行记录上的锁 Ga...

2019-02-22 22:11:53 121

原创 mysql InnoDB一致性非锁定读(MVCC)

一致性非锁定读(Consistent nonlocking read)                   是指InnoDB存储引擎通过多版本控制的方法来读取当前执行时间数据库中行的数据。之所以成为非锁定读,因为这种方式不需要等待访问行上的排他锁的释放。 快照数据(当前行数据之前的历史版本),每行记录可能有多个版本。MVCC实现是通过undo日志实现的,当一条记录被修改时,当前的老...

2019-02-22 22:06:11 340

原创 JSP与Servlet的区别和联系

1. JSP经编译后就变成Servlet.(JSP的本质就是Servlet,JVM只能识别Java类,不能识别JSP代码,Web容器将JSP的代码编译成能够识别的Java类)2, JSP更擅长于页面显示,Servlet更擅长于逻辑控制。Servlet更多的是类似于一个Controller,用于做控制。3, Servlet中没有内置对象,JSP中的内置对象都是必须通过HttpServletR...

2019-02-22 21:42:32 483

原创 数据库 ACID及事务隔离级别

事务:并发控制和恢复的基本单位。Atomicity原子性:事务是数据库的逻辑工作单位,事务中包括的所有操作要么都做,要么什么都不做。Consistency一致性:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。例如对银行转帐事务,不管事务成功还是失败,应该保证事务结束后ACCOUNTS表中Tom和Jack的存款总额为2000元。。Isolation 隔离性:并发的事务...

2019-02-22 15:48:11 369

原创 JUC下的原子类实现原理

volatile不能解决num++这类复合类操作的原子性问题,相比锁机制,使用原子类更精巧。 悲观的解决方案(阻塞同步):            num++操作,1.读取 2. 加一  3. 写入 三步组成的,就是复合类的操作,在并发环境下,如果不做不做何人同步处理,就会有线程安全问题。最直接的处理方式就是加锁。synchronized(this) { num++;}...

2019-02-22 15:25:23 684

原创 Sql语句解析和执行顺序

SQL解析顺序:SELECT DINSTINCT < select_list >FROM < left_table > < join_type >JOIN < right_table > ON <join_condition >WHERE < where_comdition >GROUP ...

2019-02-22 15:03:45 255

原创 重载和重写

方法签名 = 方法名 + 形参列表方法重写必须满足:(继承)重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!子类的方法签名(方法的名称及参数)必须和所覆盖的方法相同。 子类的方法返回类型必须<=所覆盖方法的返回类型 子类的方法权限修饰符必须>=所覆盖的方法方法重载:方法签名必须相同 在方法的参数不同的情况下...

2019-02-22 09:40:03 61

原创 mysql索引失效的情况

1. where条件语句中有or,即使其中有条件带索引也不会使用索引(除非or的每个条件都是索引)2. where字句的查询条件里有不等于号3. where字句的查询条件里使用了函数的列4. 对于复合索引,引用非第一位置的索引列5. 查询语句like以%开头(不符合最佳左前缀)6.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则索引无效7. 如果mysql...

2019-02-21 16:11:41 142

原创 Java核心技术 随笔

Java基本数据类型整型(4种): int 占4个字节、short 占2个字节、long占8个字节、byte  占 1个字节浮点类型(2种):float  4字节、 double  8字节char类型(基于Unicode):2字节boolean :1个字节或4个字节 字符串存放在公共的存储池(运行时常量)。一个对象变量并没有实际包含一个对象,而仅仅引用了一个对象。J...

2019-02-21 14:34:52 69

原创 排序算法的时间复杂度

2019-02-21 09:36:46 119

原创 Lock接口

public interface Lock { void lock(); void lockInterruptibly() throws InterruptedException; //可中断地获取锁 boolean tryLock(); //尝试非阻塞的获取锁 boolean tryLock(long time, TimeUnit unit) t...

2019-02-20 16:37:11 65

原创 ThreadLocal

ThreadLocal变量的基本原理是,同一个ThreadLocal所包含的对象(对ThreadLocal<String>而言即为String类型变量),在不同的Thread中有不同的副本(实际是不同的实例)。注意几点: 1. 因为每个Thread内有自己的实例副本,且该副本只能由当前Thread使用。这也是ThreadLocal命名的由来。 2. 既然每个Thr...

2019-02-20 16:00:22 88

原创 linux使用的进程间通信方式

管道(pipe),流管道(s_pipe)和有名管道(FIFO)信号(signal)消息队列共享内存信号量套接字(socket)  管道( pipe )管道这种通讯方式有两种限制,一是半双工的通信,数据只能单向流动,二是只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。流管道s_pipe: 去除了第一种限制,可以双向传输.管道可用于具有亲缘...

2019-02-20 14:04:37 180

原创 线程间通信方式

1. 锁机制:包括互斥锁、条件变量、读写锁互斥锁提供了以排他方式防止数据结构被并发修改的方法。 读写锁允许多个线程同时读共享数据,而对写操作是互斥的。 条件变量可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。2. 信号量机制(Semaphore):包括无名线程信号量和命名线程信号量3. 信号机制(Signal):...

2019-02-19 20:49:59 615

原创 context switch 上下文切换(进程切换)

为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行。这种行为被称为进程切换。因此可以说,任何进程都是在操作系统内核的支持下运行的,是与内核紧密相关的。步骤:保存当前在CPU上运行的进程上下文(包括程序计数器和寄存器)更新PCB(进程控制块)信息将进程的PCB移入相应的队列(如阻塞队列)选择另一个进程执行,更新其PCB信息更新内存管理...

2019-02-19 20:19:30 565

原创 MySQL主从复制

复制有三个步骤:在主库上把数据更改记录到二进制日志(Binary Log)中。在每次准备提交事务完成数据更新前,主库将数据更新的事件记录到二进制日志中。 备库将主库上的日志复制到自己的中继日志中(Relay Log).首先,从服务器创建一个I/O线程,以连接主服务器并让它发送记录在其二进制日志中的语句。主服务器创建一个二进制转储线程将二进制日志中的内容发送到从服务器。从服务器I/O...

2019-02-19 20:03:33 68

原创 Java线程的几种状态

2019-02-19 16:26:13 84

原创 OOM

Out Of Memoryjava.lang.OutOfMemoryError Thrown when the Java Virtual Machine cannot allocate an object because it is out of memory, and no more memory could be made available by the garbage ...

2019-02-19 16:17:51 91

原创 CMS与G1

Concurrent Mark Sweep收集器运行示意图初始标记阶段:标记一下GC Roots能直接关联到的对象,速度很快并发标记阶段:进行GC Roots Tracing重新标记阶段:修正并发标记期间因为用户程序运行而变动的标记记录。并发清除阶段:清除没有被标记的对象初始标记阶段和重新标记阶段需要STOP THE WORLD特点:CMS收集器对CPU资源非...

2019-02-19 15:18:44 106

转载 JVM 垃圾回收基本过程

   

2019-02-19 14:39:20 678

转载 spring mvc执行流程

2019-02-19 10:09:28 107

原创 Spring IOC

IOC:控制反转也叫依赖注入。利用工厂模式将对象交给容器管理,你只需在spring配置文件配置相应的bean及属性,让spring容器来生成类的实例对象以及管理对象。在spring容器启动的时候,spring会把配置文件中配置的bean都初始化好,然后在需要调用的时候,就把它已经初始化好的那些bean分配给你需要调用这些bean的类,分配的方法就是调用类的Setter方法来注入,而不需要new...

2019-02-19 10:09:23 107

原创 String、StringBuffer、StringBuilder

String是不可变的对象,每一次对String类型进行改变时其实都等同于生成一个新的String对象,然后将指针指向新的String对象。因此如果经常改变字符串内容,最好不要用String。每次生成对象都会对系统性能产生影响,而且当内存中无引用的对象多了以后,JVM的垃圾收集器就会开始工作,程序运行速度就会变慢。StringBuffer类型,每次对字符串内容进行操作都会对StringBu...

2019-02-18 21:13:30 82

原创 TCP三次握手,四次挥手 2MSL

TCP为什么采用三次握手,而不是两次握手?防止两次握手情况下已失效的连接请求报文段突然由传送到服务器端,而产生错误。如:客户端C向服务端S发出TCP连接请求,第一个连接请求报文在网络的某个结点长时间滞留,C超时后认为报文丢失,于是重传一次连接请求,B收到后建立连接。数据传输完毕后双方断开来连接。而此时,前一个滞留在网络中的连接请求到达服务端S,而S认为C又发来连接请求,此时若是使用“三次握手”...

2019-02-18 20:29:52 288

原创 TCP与UDP的区别

1. TCP面向连接,开始传输数据前的TCP的客户端和服务器端必须通过三次握手建立连接,回话结束后也要结束连接。UDP是无连接的,即发送数据之前不需要建立连接2. TCP协议提供可靠交付的服务,保证数据无差错、不丢失、不重复并且按序到达。 UDP协议不保证可靠交付。3. TCP协议所需资源多,TCP首部需20个字节,UDP首部字节只需8个字节。4. TCP有流量控制和拥...

2019-02-18 19:59:25 76

原创 cookie与session

由于HTTP是无状态的,所以浏览器的缓存机制提供了可以将用户数据存储在客户端上的方式,可以利用cookie,session等于服务器端进行数据交互。cookie:存储在客户端、如果不设置过期时间,则表示cookie的生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失。会话cookie一般保存在内存里。如果设置了过期时间,浏览器就会把cookie保存在硬盘上,直到时间过...

2019-02-18 19:45:48 86

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除