- 博客(188)
- 资源 (1)
- 收藏
- 关注
原创 Nginx常见的面试题—限流、正向、反向代理、负载均衡策略
1、什么是Nginx,谈谈个人都理解,项目中是否用到,为什么要用,有什么优点?Nginx ,是一个 Web 服务器和反向代理服务器用于 HTTP、HTTPS、SMTP、POP3 和 IMAP 协议。主要功能如下:1、正向、反向代理2、负载均衡、分流3、虚拟主机(绑定host)优点:跨平台、配置简单,非阻塞、高并发连接、内存消耗小、成本低廉。2、正向代理和反向代理的区别是什么?正向代理是一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定原始服务
2020-12-09 21:33:54
808
原创 推荐7款超级好用的终端工具 —— SSH+FTP
1、Cmder下载地址:https://cmder.net/Cmder是一个代替cmd的终端工具。只能操作Windows。它的好处是:支持大部分Linux命令,比如ls鼠标选中默认复制,鼠标右击粘贴美观的界面,可以自定义背景解压,双击Cmder.exe即可运行,其他疑问1、添加快捷键打开cmd到安装目录,输入Cmder.exe /REGISTER ALL你会发现鼠标右击多了一个Cmder Here 的快捷方式2、乱码问题打开Cmder,左上角右击,setting—>
2020-11-19 22:35:44
24546
4
原创 8张图带你理解Java内存区域
很多人会误以为Java内存区域和内存模型是同一个东西,其实并不是。Java内存区域是指 JVM运行时将数据分区域存储 ,简单的说就是不同的数据放在不同的地方。通常又叫 运行时数据区域。Java内存模型(JMM)定义了程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。1、Java内存区域1.8 之前:JDK1.8(含)之后:区别就是 1.8有一个元数据区替代方法区了。JDK 1.7 其实是并没完全移除方法区,但是不会像1.6以前报 “java.lang.
2020-11-16 22:40:16
510
原创 【教你搭建服务器系列】(3)部署静态网站到Tomcat服务器
上一篇文章我们已经部署好了服务器的环境,那么接下来我们就可以部署我们的项目了。【教你搭建服务器系列】选择云服务器 (一)【教你搭建服务器系列】搭建服务器环境,安装JDK、MySQL、Redis、Tomcat、Nginx (二)本篇文章准备了一个静态的HTML网页,是一个个人网网站。1、准备项目通过ftp把项目上传到服务器。上传到 /var/www/web/HaCresume目录结构如下:找到tomcat目录下的conf/server.xml文件,在末尾 标签之间添加上:<Con
2020-11-12 23:03:53
755
1
原创 【教你搭建服务器系列】(2)搭建服务器环境,安装JDK、MySQL、Redis、Tomcat、Nginx
在配置服务器环境的时候,需要下载很多东西,比如你要安装jdk,你可以使用yum命令;也可以使用ftp工具把预先下载的.gz 压缩包上传到服务器,然后解压安装。1、配置jdk有两种安装方法,我使用的是第二种安装方式。yum安装查看可用版本:yum -y list java[root@VM-8-8-centos software]# yum -y list java*Loaded plugins: fastestmirror, langpacksDetermining fastest
2020-11-09 23:31:19
1526
2
原创 【教你搭建服务器系列】(1)选择云服务器
我们每天都在访问不同的网站,比如百度,那我们在浏览器输入 www.baidu.com 背后发生了什么,百度又是如何提供服务的呢。首先我们要明白内网IP和公网IP的区别。1、公网IP和内网IP如图,假如我在某学校访问百度,正在使用着校园网,首先校园网的路由器会把我们的内网IP转换成外网的IP,如何进行寻址、网关转发,最后找到百度的服务器公网IP,然后我的个人PC就和百度的服务器建立了链接,这样就可以互相通信了。整个网络的服务建立是很复杂的,涉及譬如IP封装、ARP寻址、三次握手、防火墙等等。这些就留
2020-11-05 22:47:34
1567
4
原创 Redis的持久化机制,RDB 和 AOF 原理
Redis是基于内存操作,很快,既然Redis在内存工作,但是数据如何保存呢?在Redis重启的时候,如何把数据恢复,保持一致性,这就涉及Redis的持久化机制了。1、Redis的持久化机制Redis的持久化机制有两种:RDBAOF可以单独使用其中一种或将二者结合使用。2、RDBRDB持久化是将当前进程中的数据生成快照保存到硬盘(因此也称作快照持久化),保存的文件后缀是.rdb2.1 自动触发常见配置:# Redis默认设置, 表示 900秒内产生1条写入命令就触发一次快照,自动
2020-10-27 20:41:04
279
原创 Redis之缓存击穿、穿透、雪崩、预热,以及解决方案
数据获取的流程,一般是前端请求,后台先从缓存中取数据,缓存取不到则去数据库中取,数据库取到了则返回给前端,然后更新缓存,如果数据库取不到则返回空数据给前端流程图:假如缓存的数据没有,后台则会一直请求数据库,对数据库造成压力,如果是请求量大或者恶意请求则会导致数据库崩溃,我们一般称为缓存穿透、缓存击穿、缓存雪崩。1、缓存穿透描述:缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大(不存在的数据)。这时的用户很可能是攻击者,攻击会导致数据库压力过.
2020-10-27 20:38:59
326
原创 Redis分布式事务锁的应用——秒杀、超卖 简单例子 (下)
上一篇文章介绍了Redisson的分布式锁原理,这篇文章来验证一下Redisson分布式锁的作用。1、搭建Redis主从我这里使用Redis的主从模式。搭建Redis主从,一主两从:1、修改config文件把redis.confg 复制多两份。一共三份配置文件,分别是 redis6379.conf、redis6380.conf、redis6381.conf。1、修改masterredis6379.conf 不需要修改,默认端口是 6379这里我设置了密码:requirepass redi
2020-10-22 00:44:45
714
原创 Redis分布式事务锁的原理(上)
我们在单机服务器,出现资源的竞争,一般使用synchronized 就可以解决,但是在分布式的服务器上,synchronized 就无法解决这个问题,这就需要一个分布式事务锁。除此之外面试,基本会问springboot、Redis,然后都会一路再聊到分布式事务、分布式事务锁的实现。1、常见的分布式事务锁1、数据库级别的锁乐观锁,基于加入版本号实现悲观锁,基于数据库的 for update 实现2、Redis ,基于 SETNX、EXPIRE 实现3、Zookeeper,基于InterP.
2020-10-22 00:42:55
3097
原创 25道Java基础面试题
1、Java特性、原则、设计模式Java三大特性:封装、继承、多态。面向对象的四大特征:封装、继承、多态、抽象。面向对象7大设计原则:单一职责原则——SRP让每个类只专心处理自己的方法。开闭原则——OCP软件中的对象(类,模块,函数等)应该对于扩展是开放的,但是对于修改是关闭的。里式替换原则——LSP子类可以去扩展父类,但是不能改变父类原有的功能。依赖倒置原则——DIP应该通过调用接口或抽象类(比较高层),而不是调用实现类(细节)。接口隔离原则—
2020-10-20 00:31:17
2303
1
原创 部署自己个人简历网站到服务器(超详细)(选购服务器、搭建环境、部署)
本文将教你如何部署自己个人简历网站到服务器。本文要部署的网站成品:https://baimuxym.cn流程:选购服务器搭建环境部署项目一、选购服务器我们每天都在访问不同的网站,比如百度,那我们在浏览器输入 www.baidu.com 背后发生了什么,百度又是如何提供服务的呢。首先我们要明白内网IP和公网IP的区别。1、公网IP和内网IP如图,假如我在某学校访问百度,正在使用着校园网,首先校园网的路由器会把我们的内网IP转换成外网的IP,如何进行寻址、网关转发,最后找到百度的
2020-10-14 22:08:01
2640
4
原创 自己使用keytool生成证书 和 购买 商业SSL证书,然后并配置Tomcat 的 https
一、SSL证书简介要想使用https, 首先,我们需要有SSL证书,证书可以通过两个渠道获得:1.自己生成虽然安全性不是那么高,但胜在成本低.目前证书有以下常用文件格式:JKS(.keystore),微软(.pfx),PEM(.key + .crt)。其中,tomcat使用JKS格式,nginx使用PEM格式.2.公开可信认证机构例如CA,但是申请一般是收费的。二、自己生成JDK自带了一个生成证书 keytool ,目录在 /bin 下面1、生成证书输入:(如果你没有配环境变量需
2020-10-12 18:24:35
822
原创 Java中四种线程安全的单例模式实现方式
第一种:饿汉模式(线程安全)public class Single2 { private static Single2 instance = new Single2(); private Single2(){ System.out.println("Single2: " + System.nanoTime()); } public static Single2 getInstance(){ return instance
2020-09-29 17:30:52
1953
原创 volatile和synchronized的有序性区别
1 volatile到底做了什么:1、 禁止了指令重排2、保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量值,这个新值对其他线程是立即可见的不保证原子性(线程不安全)2 synchronized关键字和volatile关键字比较:volatile关键字是线程同步的轻量级实现,所以volatile性能肯定比synchronized关键字要好。但是volatile关键字只能用于变量而synchronized关键字可以修饰方法以及代码块。synchronized关键字在JavaSE1
2020-09-23 23:06:43
832
原创 (十五)ThreadLocal的用法,如何解决内存泄漏
什么是ThreadLocal变量ThreadLocal称为线程本地变量,其为变量在每个线程中都创建了一个副本,每个线程都访问和修改本线程中变量的副本,但每个线程之间的变量是不能相互访问的,ThreadLocal不是一个Thread。ThreadLocal 有四个方法
2020-07-30 00:04:56
2083
3
原创 (十四)volatile的用法+为什么不能确保原子性+与synchronized的区别
volatile介绍volatile 的作用是保证变量在多线程之间的可见性。synchronized是阻塞式同步,会在线程竞争激烈的情况下,会升级为重量级锁,还可能会死锁;而volatile是一种轻量级的同步机制。在理解这个volatile可见性之前,需要先了解一下CPU高速缓存、Java内存模型的知识。主内存:java虚拟机规定所有的变量(不是程序中的变量)都必须在主内存中产生,为了方便理解,可以认为是堆区。可以与前面说的物理机的主内存相比,只不过物理机的主内存是整个机器的内存,而虚拟机的主内存
2020-07-26 13:19:13
958
原创 (十三)synchronized用法、底层原理,附四种锁范围详细例子
《深入理解Java虚拟机》一句话:当多个线程访问同一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替运行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获取正确的结果,那这个对象是线程安全的。1. 开篇内存分为主内存和工作内存,每个线程都有自己的工作内存,如何和主内存的数据同步,产生的数据不一致性,就是我们常说的线程安全,这就需要我们去了解Java内存模型了。借用一张图:如图为JMM抽象示意图,线程A和线程B之间要完成通信的话,要经历如下两步:
2020-07-26 13:18:46
3200
6
原创 (十二)yield、notify、notifyAll、sleep、join、wait 的区别
1. wait ,notify / notifyAll核心源码:public final void wait() throws InterruptedException { wait(0);}Object.wait(long)要跟Object.notify()/notifyAll()搭配使用。wait 与 notify/notifyAll 方法必须在synchronized 同步代码块中使用,即要先对调用对象加锁,不放在synchronized 中则会在program runtime
2020-07-26 13:18:09
821
原创 (十一)sleep(1)、sleep(0)和sleep(1000)的区别
众所周知,sleep是让线程处于等待运行状态,不会占用CPU,OS会将执行时间分配给其它线程。sleep(0)字面意思是睡眠0毫秒,大家可能觉得跟没写一样,其实不是的。sleep(1000)比较容易理解,就是让线程睡眠1000毫秒,但是1000毫秒后,线程会执行吗,是立即执行吗?本篇文章主要是探究以上的问题。操作系统中,CPU竞争有很多种策略。Unix系统使用的是时间片算法,Windows属于抢占式。在时间片算法中,所有的进程排成一个队列。操作系统按照他们的顺序,给每个进程分配一段时间,即该进.
2020-07-26 13:17:41
19221
2
原创 (十)线程池参数——workQueue用法
线程池参数的 workQueue 决定了缓存任务的排队策略,对于不同的业务场景,我们可以使用不同的排队策略。我们只需要实现BlockingQueue 这个接口即可。介绍一下常用的有三种workQueue1. SynchronousQueueSynchronousQueue没有容量,是无缓冲等待队列,是一个不存储元素的阻塞队列,会直接将任务交给消费者(即丢给空闲的线程去执行),必须等队列中的添加元素被消费后才能继续添加新的元素,否则会走拒绝策略,所以使用SynchronousQueue阻塞队列一般要
2020-07-25 16:10:19
4835
2
原创 (九)线程池异常捕获
上一篇提到了使用ThreadFactory的UncaughtExceptionHandler去捕获线程池的错误,还有没有其他方法呢?线程的异常捕获可以使用try catch,但是主线程 如何 捕获子线程的异常呢?当一个线程执行出错了,接下来是否还要执行呢?1. try catch在子线程执行的方法体里面加上 try catch ,try catch 可以捕获当前线程的抛出的异常。但是try catch 无法捕获其他线程的错误。demo:public class OtherException {
2020-07-25 16:09:37
4494
1
原创 (八)Callable和Runnable的区别
Callable和Runnable都是一个接口。Runnable@FunctionalInterfacepublic interface Runnable { /** * When an object implementing interface <code>Runnable</code> is used * to create a thread, starting the thread causes the object's * <
2020-07-25 16:07:08
1454
1
原创 (七)线程池的大小如何确定
线程的使用目的是提高运行速度,提高运行的速度是要充分提用CPU和I/O 的利用率。这就涉及到CPU密集型程序和I/O密集型程序的区别了。CPU 密集型程序CPU密集型也叫计算密集型,指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU Loading很高。比如说要计算1+2+3+…+ 1亿、计算圆周率后几十位、数据分析。都是属于CPU密集型程序
2020-07-25 16:04:35
3681
1
原创 (六)ThreadPoolExecutor自定义线程池
上一篇中提到四种线程池的创建方式,最后还是会 new ThreadPoolExecutor(),所以 我们可以使用 new ThreadPoolExecutor()的方法创建自定义的线程。可以看到 ThreadPoolExecutor 是 ExecutorService的实现类:public class ThreadPoolExecutor extends AbstractExecutorService {}public abstract class AbstractExecutorServic
2020-07-25 16:04:03
1235
原创 (五)四种线程池底层详解
Java中提供了四种线程池创建方法线程池名称描述newSingleThreadExecutor创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。newFixedThreadPool创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。newScheduledThreadPool创建一个可定期或者延时执行任务的定长线程池,支持定时及周期性任务执行。newCachedT
2020-07-25 16:03:29
1189
原创 (四)为什么要使用线程池
阿里开发手册有一段描述:【强制】线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。说明:使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源不足的问题。如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题。上一篇文章介绍了Java线程是什么,以及用显式创建线程的两种方式(继承Thread类或者实现Runnable接口):1. 手动创建线程的缺点继承extend类或者实现runnable接口都是最简单创建线程的方式,但是这种方
2020-07-25 16:02:43
1148
原创 (三)Java线程创建方式
我们平时用main方法执行的代码,都是以主线程去执行。如果要使用多线程,可以使用以下三种方式去创建:1. 继承Thread类class MyThread extends Thread { @Override public void run() { System.out.println(Thread.currentThread().getName() + "---->>>>" +"继承Thread类"); }}2. 实现Runnabl
2020-07-25 16:01:28
1026
原创 (二)Java线程与系统线程,生命周期
1.操作系统中线程的5种状态在操作系统中,线程的生命周期可以分为5种状态:①new 关键字创建了Thread类(或其子类)的对象,或者Runnable。②Runnable 调用了start()方法,这时的线程就等待时间片轮转到自己这,以便获得CPU;第二种情况是线程在处于RUNNING状态时并没有运行完自己的run方法,时间片用完之后回到RUNNABLE状态;还有种情况就是处于BLOCKED状态的线程结束了当前的BLOCKED状态之后重新回到RUNNABLE状态。③Running:这时的线程指的是获
2020-07-25 16:00:03
792
原创 (一)线程是什么
多线程可以实现并行处理,避免了某项任务长时间占用CPU时间。在单CPU计算机中,为了运行所有这些线程,操作系统需要为每个独立线程安排一些CPU时间,操作系统以轮换方式向线程提供时间片,在宏观上似乎这些线程都在同时运行。简单的说,就是更好的利用CPU的资源。1. 程序计算机程序,是指为了得到某种结果而可以由计算机等具有信息处理能力的装置执行的代码化指令序列,或者可以被自动转换成代码化指令序列的符号化指令序列或者符号化语句序列。2. 进程为了使程序并发执行,并且可以对并发执行的程序加以描述和控制,人.
2020-07-25 15:58:39
2016
原创 HTTP重定向到HTTPS,post请求成了GET请求 报 Required request body is missing 和 Request method GET not supported
本地调试没问题,但是把jar打到生产就报错了:2020-05-24 16:34:43,554 [http-nio-8888-exec-10] ERROR [c.y.springBootDemo.config.GlobalExceptionHandler] GlobalExceptionHandler.java:21 - 出错啦:org.springframework.http.converter.HttpMessageNotReadableException: Required request body
2020-05-24 18:33:19
2533
原创 MySQL中 insert into select和create table的区别 已经复制表的方法
MySQL中 insert into select和create table的区别MySQL一般我们在生产上备份数据通常会用到 这两种方法:INSERT INTO SELECTCREATE TABLE AS SELECT本文仅针对MySQL innodb引擎,事务是可重复读RR1.INSERT INTO SELECTinsert into Table2(field1,field2,...
2020-05-07 21:13:29
2442
原创 三款桌面管理工具
1 小智桌面这款软件纯净无广告,用户下载之后有一个一键整理的按钮,它会一键整理桌面为文件和文件夹分区,可以自定义创建和解散桌面分区,位置可以自由选择。而且这款软件只占用33M还有其他功能如图所示:以下是我的使用体验:一键整理,会根据文件的类型主动分类,当然你也可以自己新建分区,把常用的软件归类。ALT+X 快捷键 调出桌面面板,可以代替win键的查询,这一点我比较...
2020-04-19 18:14:19
16973
4
原创 spring事务为什么不生效,回滚失效,事务try catch
Spring事务的原理Spring事务的本质其实就是数据库Innodb对事务的支持,没有innodb是事务支持,spring是无法提供事务支持的。真正的数据库层的事务提交和回滚是通过binlog或者redo log实现的。对于纯jdbc操作数据库,想要用到事务,需要按照以下的步骤进行:获取连接Connection connection = DriverManager.getConnecti...
2020-04-09 10:43:43
1762
原创 41 | 复制表
建表:create database db1;use db1;create table t(id int primary key, a int, b int, index(a))engine=innodb;delimiter ;; create procedure idata() begin declare i int; set i=1; while(i&...
2020-03-23 18:04:27
261
原创 40 | insert 语句的锁
有一些特殊的insert语句,在执行过程中需要加锁,本文针对这些特殊都insert语句进行展开。insert … select建表:CREATE TABLE `t` ( `id` int(11) NOT NULL AUTO_INCREMENT, `c` int(11) DEFAULT NULL, `d` int(11) DEFAULT NULL, PRIMARY KEY (...
2020-03-23 15:27:12
805
原创 39 | 自增主键不连续
自增主键可以让主键索引尽量地保持递增顺序插入,避免了页分裂,因此索引更紧凑。建表:CREATE TABLE `t` ( `id` int(11) NOT NULL AUTO_INCREMENT, `c` int(11) DEFAULT NULL, `d` int(11) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `c` (`c...
2020-03-20 14:50:30
279
原创 38 | Memory引擎使用场景
内存表的数据组织结构建表:create table t1(id int primary key, c int) engine=Memory;create table t2(id int primary key, c int) engine=innodb;insert into t1 values(1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),...
2020-03-19 14:27:24
549
原创 37 | 内部临时表
使用临时表的情况:sort buffer、内存临时表和 join buffer。这三个数据结构都是用来存放语句执行过程中的中间数据,以辅助 SQL 语句的执行的。其中,我们在排序的时候用到了 sort buffer,在使用 join 语句的时候用到了 join buffer。1. union 执行流程建表;create table t1(id int primary key, a int,...
2020-03-18 15:19:14
363
原创 36 | 临时表和临时表
内存表,指的是使用 Memory 引擎的表,建表语法是 create table … engine=memory。这种表的数据都保存在内存里,系统重启的时候会被清空,但是表结构还在。临时表,可以使用各种引擎类型 。如果是使用 InnoDB 引擎或者 MyISAM 引擎的临时表,默认是MyISAM 引擎,写数据的时候是写到磁盘上的。当然,临时表也可以使用 Memory 引擎。临时表特点:...
2020-03-16 15:47:54
250
jetty 适合jdk1.8用的服务器
2020-12-24
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅