- 博客(102)
- 资源 (1)
- 收藏
- 关注
原创 react项目的打包和部署
我们首先执行npm run build(yarn run build),会在项目目录下生成一个build文件夹,这个文件夹就是构建好的项目,然后复制该文件夹到云服务器的某一目录下,这里我们复制到/home下,即/home/build。然后我们安装nginx服务器,修改nginx服务器的默认配置文件,nginx服务的默认配置文件在 /etc/nginx/conf.d/default.conf。我...
2020-03-06 16:57:25
1997
原创 git的相关操作
1.撤销本地未add的修改。git checkout -- . (撤销所有修改)2. 撤销git add代码,就是回退到git add之前的状态,本地的修改依然会保留。git reset HEAD .3. git commit后,撤销本地修改,即回到上次git commit之前的状态,删除了本地修改。git reset --hard HEAD^ (代码回退到本地修改之前...
2020-03-05 16:55:21
303
原创 IDEA创建springBoot项目
1.2.3.4.5.http://localhost:8080/index就会看到qwe,如果使用@Controller注解,return则会去找名字叫qwe的页面,@RestController注解会返回json串,@RestController = @Controller + @ResponseBody(返回json的注解)。...
2019-12-19 18:34:33
303
原创 docker部署含数据库的go-web(beego)项目
此项目的gitlab地址:https://gitlab.com/Mr_liukun/web_db1. 这是我的项目的目录结构,可以看到需要将Dockerfile放在项目的根目录下。即项目名的下一层目录。2. 这是我的Dockerfile文件。参考别人和自己摸索的,有些参数以后知道了再说含义。DOckerfile写法可以自己查资料。FROM golang:1.10.7#创建工...
2019-03-07 11:22:04
2454
原创 phpStorm部署本地项目php项目到apche服务器
1.这是我本地的简单php项目。其中 D:\httpd-2.4.35-win64-VC15\Apache24\htdocs为apache服务器会扫描项目的根目录。其中我的项目名为two。 2. 点击菜单栏 Tools-》Deployment-》Configuration。然后会得到如下的界面。3.点击左上角+号,填写添加的服务器名字(你自己起一个)。Type选择Local or m...
2018-10-19 14:07:02
7066
原创 使用git上传项目到github
我在这里在桌面有一个测试项目demo1,想把它通过git上传到github。1.我们首先打开git的命令行,进入demo1目录下。2. 在当前目录下初始化仓库git init,因为如果你要使用git管理项目,就必须进行仓库的初始化,此时初始化后会生成一个.git文件夹,这是一个隐藏的文件夹。初始化前初始化后3. 使用git add 命令将项目添加到暂存区。...
2018-10-11 18:03:54
236
转载 Restful架构风格
REST是英文representational state transfer(表象性状态转移),Rest是web服务的一种架构风格;使用HTTP,URI,XML,JSON等广泛流行的标准和协议;轻量级、跨平台、跨语言的架构设计;它是一种设计风格,不是一个标准,是一种思想。Rest式的web服务是一种ROA(The Resource-Oriented Architecture)(面向资源的架构)...
2018-10-10 14:21:14
680
原创 Redis
Redis的数据类型String(字符串)string 是 redis 最基本的类型,一个 key 对应一个 value。Hash(哈希)Redis hash 是一个键值(key=>value)对集合。List(列表)Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。Set(集合)Redis的Set是stri...
2018-09-30 13:46:53
192
原创 JAVA线程实现原理、线程状态
JAVA线程现在的实现是基于操作系统原生线程模型来实现的。因此,现在操作系统支持怎样的线程模型,在很大程度上决定了JAVA虚拟机的线程是怎样映射的。这点在不同的平台上没有办法达成一致。对于Sun JDK来说,它的Windows版和Linux版都是使用一对一的线程模型实现的,一条Java线程就映射到一条轻量级进程中,因为Windows和Linux系统提供的线程模型就是一对一的。Java线程调...
2018-08-20 14:24:27
4754
转载 LRU算法实现
LRU(最近最久未使用)当缓存满了的时候,我们要淘汰出最久未被使用的数据。1.用一个数组来存储数据,给每一个数据项标记一个访问时间戳,每次插入新数据项的时候,先把数组中存在的数据项的时间戳自增,并将新数据项的时间戳置为0并插入到数组中。每次访问数组中的数据项的时候,将被访问的数据项的时间戳置为0。当数组空间已满时,将时间戳最大的数据项淘汰。这需要每次遍历hash表,不是很好。publ...
2018-08-20 10:49:31
1706
原创 序列化和反序列化
Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中新建对象。概念序列化:把对象转换为字节序列的过程称为对象的序列化;反序列化:把字节序...
2018-08-19 13:09:28
178
转载 5种IO模型
五种IO模型同步和异步仅仅是关于所关注的消息如何通知的机制,而不是处理消息的机制。也就是说:同步情况下,是由处理消息者自己去等待消息是否被触发。异步情况下,是由触发机制来通知处理消息者。阻塞/非阻塞:线程所访问的数据是否就绪,线程是否需要等待;同步/异步:访问数据的方式,同步需要主动读写数据,在读写数据的过程中还是会阻塞;异步只需要/O操作完成的通知,并不主动读写数据,...
2018-08-18 20:22:18
250
转载 加密算法
MD5MD5消息摘要算法,属Hash算法一类。MD5算法对输入任意长度的消息进行运行,产生一个128位的消息摘要,并且它是一个不可逆的消息变换算法,换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的消息。应用一般为防止篡改,如你将一个消息和用MD5将消息生成的128位消息摘要一同发给接收方,接收方然后重新计算MD5时就可以和你发送的消息摘要进行比对,从而得出消息是...
2018-08-18 13:08:22
254
原创 Sql语句的执行原理-MySQL
第一步:应用程序把查询SQL语句发送给服务器端执行。我们在数据库层执行SQL语句时,应用程序会连接到相应的数据库服务器,把SQL语句发送给服务器处理。第二步:查询缓存服务器在解析一个查询语句之前,如果查询缓存是打开的(MySQL默认打开,可以使用have_query_cache查看),在接收到查询请求后,并不会直接去数据库查询,而是在数据库的查询缓存中找是否有相对应的查询数据(某条给定...
2018-08-16 22:08:45
5599
2
转载 AQS
AbstractQueuedSynchronizer(AQS),类如其名,抽象的队列式同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步器实现都依赖于它,如ReentrantLock、CountDownLatch等。它维护了一个volatile int state(代表共享资源)和一个FIFO线程等待队列(多线程争用资源被阻塞时进入此队列)。state的访问方式有三种:get...
2018-08-15 20:04:14
499
转载 MySQL中的日志管理
MySQL中有6种日志文件,分别是:重做日志(redo log)、回滚日志(undo log)、二进制日志(binlog)、错误日志(error log)、慢查询日志(slow query log)、一般查询日志(general log),中继日志(relay log)。其中重做日志和回滚日志与事务操作息息相关,二进制日志也与事务操作有一定的关系,这三种日志,对理解MySQL中的事务操作有着重...
2018-06-11 22:07:56
219
原创 Lock锁
我们在介绍Lock锁之前先介绍锁的几个概念。1. 可重入锁如synchronized和ReentrantLock都是可重入锁,可重入性实际上表明了锁的分配机制:基于线程的分配,而不是基于方法调用的分配。当一个线程执行到某个synchronized方法时,如method1方法,而在method1中会调用另一个synchronized方法method2,此时线程不必重新去申请锁,而是可以直接执行met...
2018-06-01 17:13:57
1205
原创 ThreadLocal的理解
ThreadLocal(线程本地变量)ThreadLocal不是用来解决共享对象访问的,而主要是提供了保持对象的方法和避免参数传递的方便的对象访问方式。在每个线程内部都有对目标资源的“副本”。每个线程对自己内部的资源进行修改,不影响别的线程中该资源的状态。1. 每个线程中都有一个自己的ThreadLocalMap类对象,可以将线程自己的对象保存到其中,各管各的,线程可以正确访问到自己的对象。2. ...
2018-05-31 22:09:48
349
原创 Spring Bean的生命周期
Spring IoC容器在对Bean的生命周期进行管理时提供了Bean生命周期各个时间的回调。我们介绍一下IoC容器中Bean生命周期。—— Bean实例的创建。—— 为Bean实例设置属性。—— 调用Bean的初始化方法。—— 应用可以通过IoC容器使用Bean。—— 当容器关闭时,调用Bean的销毁方法。Bean的初始化方法调用是在initializeBean方法中实现...
2018-05-21 19:55:11
224
原创 分页存储管理
连续分配方式会形成许多“碎片”,如果允许一个进程直接分散地装入到许多不相邻接的分区中,便可充分地利用内存空间。所以产生了离散的分配方式,根据离散时分配地址空间的基本单位不同,可分为三种,这里我们只讲解分页存储管理。1. 页面和物理块(1)页面。分页存储管理将进程的逻辑地址空间分成若干个页,并为各页加以编号,从0开始,如第0页、第1页等。相应地,也把内存的物理地址空间分成若干个块,同样也为...
2018-05-19 16:58:06
16921
1
原创 多版本并发控制(MVCC)
MYSQL的大多数事务性存储引擎(如InnoDB)实现的都不是简单的行级锁。基于提升并发性能的考虑,它们一般都同时实现了多版本并发控制(MVCC)。可以认为MVCC是行级锁的一个变种,但是它在很多情况下避免了加锁操作,因此开销更低。虽然实现机制有所不同,但大都实现了非阻塞的读操作,写操作也只锁定必要的行。MVCC的实现MVCC的实现是通过保存数据在某个时间点的快照来实现的。也就是说,不...
2018-05-17 20:53:10
291
原创 SpringMVC处理HTTP分发请求
HandlerMapping的配置和设计原理在初始化完成时,在上下文环境中已定义的所有的HandlerMapping都已经被加载了,这些加载的handlerMapping被放在一个List中并被排序,存储着HTTP请求对应的映射数据。这个List中的每一个元素都对应着一个具体的handlerMapping的配置,一般每一个handlerMapping可以持有一系列从URL请求道Controller...
2018-05-15 22:37:03
3600
原创 Spring的Aop实现
AOP(Aspect-Oriented Programming)面向切面编程为什么要使用AOP?维基百科对AOP相关概念的叙述:Aspect是一种新的模块化机制,用来描述分散在对象、类或函数中的横切关注点。从关注点中分离出横切关注点是面向切面的程序设计的核心概念。分离关注点使解决特定问题的代码从业务逻辑中独立出来、业务逻辑的代码中不再含有针对特定领域问题代码的调用,业务逻辑同特定领域问题的关系通过...
2018-05-04 22:37:28
283
原创 HTTPS的加密过程
HTTPSHTTPS即加密的HTTP,HTTPS并不是一个新协议,而是HTTP+SSL(TLS)。原本HTTP先和TCP(假定传输层是TCP协议)直接通信,而加了SSL后,就变成HTTP先和SSL通信,再由SSL和TCP通信,相当于SSL被嵌在了HTTP和TCP之间。我们首先了解几个基本概念。共享密钥加密(对称密钥加密):加密和解密同用一个密钥。加密时就必须将密钥传送给对方,那么如...
2018-04-25 19:41:47
45669
11
原创 spring的Ioc实现
我们经常提到spring,就不得不说spring的IOC和AOP。今天我们先说一下spring的IOC。参考书籍:Spring技术内幕不打算说太多概念性的东西,只是按我看书的理解主要说一下,以后可能有时间会专门在详细的说一下Ioc的实现。Ioc(Inversion Of Control)控制反转这里我们到底反转了什么? 这里我们依赖对象的获取被反转了。以前我们都是由两个...
2018-04-17 19:59:07
347
原创 java反射
一、反射的概述java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。二、获取class对象要使用反射,我们首先获取这个类的class对象,获取class对象有三种方法:1.类名.class;Class stringClass = String.c...
2018-04-14 16:53:48
136
转载 java中接口和抽象类
接口接口是一系列方法的声明,一系列具有某种特征的方法的集合,一个接口只有方法声明而没有具体实现。在类的继承中可以实现一个类实现多个接口。public interface 接口类名称{}抽象类抽象类是描述许多类的公共的地方,它是一个基类,有抽象方法的类一定是抽象类,但抽象类不一定有抽象方法。public abstract 抽象类名称{}抽象类和接口的区别接口可以看做是抽象类的一种更抽象化,接口是对动...
2018-04-13 10:39:39
107
原创 观察者模式
当对象间存在一对多关系时,则使用观察者模式。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。观察者抽象类public abstract class Observer { public abstract void update(String msg);}第一个观察...
2018-04-12 22:58:32
139
原创 责任链模式
责任链模式为请求创建了一个接受者的对象的链。这种模式对给予请求的类型,对请求的发送者和接受者进行解耦。属于行为型模式。在这种模式中,通常每个接受者都包含对另一个接受者的引用。如果一个对象不能处理该请求,那么他会把相同的请求传给下一个接受者。以此类推。应用实例:servlet的Filter,过滤器和拦截器都是基于此模式的。/** * * 请求类 * */public class Brro...
2018-04-12 16:11:36
101
原创 JVM垃圾收集算法
1. 标记-清除算法(Mark-Sweep)最基础的手机算法,如同它的名字一样,算法分为“标记”与“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后同一回收所有被标记的对象。说他是最基础的收集算法,是因为后续的收集算法都是基于这种思路并对其不足进行改进而得到的。它的主要缺点有两个:一个是效率问题,标记和清除两个过程的效率都不高;另一个是空间问题,标记清除之后会产生大量不连续的内存碎片...
2018-04-11 21:47:27
142
原创 ConcurrentHashMapJDK1.8源码解析
我们先看一下它无参构造函数public ConcurrentHashMap() { }可以看到并未对hash表进行初始化。我们再看一下它的put方法 public V put(K key, V value) { return putVal(key, value, false); }进入putVal方法。 final V putVal(K key, V value, ...
2018-04-07 22:56:06
228
原创 HTTP协议
HTTP(HyperText Transfer Protocol)协议即超文本传输协议,它是万维网上能够可靠地交换文件(包括文本、声音、图像、等各种多媒体文件)的重要基础。HTTP规定在HTTP客户与HTTP服务器之间的每次交互,都由一个ASCII码串构成的请求和一个规定的通用互联网扩充,即“类MIME(MIME-like)”的响应组成。HTTP报文通常都使用TCP连接传送。HT...
2018-04-06 22:51:32
342
原创 JVM的内存分配和回收策略
(下面的几条规则是在Serial/Serial Old收集器下的内存分配和回收策咯)我们先解释一下Minor GC 和 Full GC有什么区别?新生代GC(Minor GC):指发生在新生代的垃圾收集动作,因为Java对象大多都具备朝生夕死的特性,所以Minor GC非常频繁,一般回收速度也比较快。老年代GC(Major GC/ Full GC):指发生在老年代的GC,出现了Major GC,经...
2018-04-06 15:34:35
229
原创 JAVA垃圾回收器
Serial 收集器 这是一个新生代的单线程收集器,它会使用一个CPU或一条收集线程去完成垃圾收集工作,更重要的是在它运行垃圾回收时,必须暂停其他所有的工作线程(Stop The World),直到它收集结束。它依然是虚拟机运行在Client模式下的默认新生代收集器。它的优点是简单而高效(与其他收集器的单线程相比)。采用算法为复制算法。ParNew收集器 ...
2018-04-05 22:17:48
1124
原创 线程的生命周期
我们可以从java的Thread.State中发现线程有六种状态。分别是:NEW:至今尚未启动的线程状态RUNNABLE:可运行的线程的线程状态,包括正在运行的线程和就绪的线程。BLOCKED:受阻塞并且正在等待监视器锁的某一线程的线程状态。WAITING:某一等待线程的线程状态。TIMED_WAITING:具有指定等待时间的某一线程的线程状态。TERMINATED:以终止...
2018-04-05 18:43:54
141
原创 进程和线程
进程和线程的区别:(1) 进程是资源的分配和调度的一个独立单元,而线程是CPU调度的基本单元。(2) 同一个进程中可以包括多个线程,并且线程共享整个进程的资源,一个进程至少包括一个线程。(3) 进程结束后她拥有的所有线程都将销毁,而线程的结束不会影响同个进程中的其他线程的结束。(4) 线程是轻量级进程,它的创建和销毁所需要的时间比进程小很多。(5) 线程中执行一般都要进行同步和互斥,因为他们共享同...
2018-04-04 18:42:08
107
原创 TCP的连接管理
TCP是面向连接的协议。运输连接是用来传送TCP报文的。连接运输就有三个阶段,即:连接建立、数据传送和连接释放。在TCP连接建立过程中要解决以下三个问题:(1)要使每一方能够确知对方的存在。(2) 要允许双方协商一些参数(如最大窗口值、是否使用窗口扩大选项和时间戳选项以及服务质量等)。(3) 能够对运输实体资源(如缓存大小、连接表中的项目等)进行分配。 ...
2018-04-02 22:11:58
2058
原创 快速排序
快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。/* * 快速排序就是先选定一个基准值(参考值,你随便叫) * 然后通过从两头遍历发现符合条件的就赋值交换,直到该基准值的两边 * 一边的元素都大于基准值,一边的元素...
2018-03-31 22:30:24
94
原创 Synchronized的锁优化
高效并发是从JDK1.5到JDK1.6的一个重要改进,HotSpot虚拟机开发团队在这个版本上花费了大量的精力去实现各种锁优化技术,如适应性自旋、锁消除、锁粗化、轻量级锁和偏向锁等,这些技术都是为了在线程之间更高效的共享数据,以及解决竞争问题,从而提高程序的执行效率。自旋锁与自适应自旋 我们在讨论互斥同步的时候,提到了互斥同步对性能最大的影响是阻塞的实现,挂起线程...
2018-03-31 19:35:41
883
原创 归并排序
/* * 归并排序 * 每次都只是操作两个序列,比如3,2,6,5 * 第一次3与2,合成一个有序序列2,3: 在hebing函数中的low,mid,high分别为(0,1,1) * 第二次6与5,合成一个有序序列5,6:在hebing函数中的low,mid,high分别为(2,2,3) * 第三次有序序列2,3与有序序列5,6合并成2,3,5,6:在hebing函数中的low,mid,...
2018-03-30 13:22:10
124
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人