自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(66)
  • 问答 (2)
  • 收藏
  • 关注

原创 自定义archetype,一统团队项目结构风格

虽然maven已经提供了maven-archetype-webapp、maven-archetype-quickstart等项目骨架帮助我们快速构建项目架构,但是默认提供的archetype初始化的项目架构并不能满足开发需求,这时候就有必要自己写一个满足项目需求的archetype了archetype是什么可以简单的理解为模板工具类,通过archetype我们可以快速的生成项目的基本架构。...

2019-08-13 19:37:31 559

原创 SpringBoot使用logback分类收集日记

将所有日志都存储在一个文件中既不利于排查问题,同时文件大小也会随着应用的运行越来越大,正确的做法应该是将error日志和其他日志分开,并且不同级别的日志根据时间进行记录存储依赖SpringBoot框架内置了logback和slf4j框架,所以不需要在添加任何相关依赖避免冲突配置文件logback-spring.xml分类收集日志的核心就是日志的配置文件了,logback框架会默认加载c...

2019-08-07 16:59:35 359

原创 MyBatisPlus 3.1.X代码生成器

通过代码生成器可以根据数据库中的实体生成对应的po、mapper、service、controller层代码,可以大大提高开发效率。代码生成器的核心是AutoGenerator类中的execute方法,文章将从AutoGenerator类讲起核心类AutoGenerator.javapublic class AutoGenerator { private static final ...

2019-08-06 18:15:27 901

原创 Hello Docker之Docker安装篇(win10版)

开发环境win10电脑安装过程######Step1 官网下载docker安装包遇到的问题:下载速度过慢解决方法:通过迅雷下载Step2 开启Hype-V遇到的问题:win10系统为家庭版无Hype-V选项解决方法:升级win0Step3 开启虚拟化注意:win10默认是关闭的,需进入bios模式开启虚拟化到这里就可以开开心心的终端上敲下docker run...

2019-07-31 22:44:06 435

原创 mongodb集群搭建

这里选择的是简单又实用的Replica Set(副本集架构)搭建方式1.创建三个mongod实例--port指定端口号--dbpath指定数据库保存的位置--replSet指定副本集的名字,三个mongod实例的副本集名字相同mongod --port 27018 --dbpath db1 --replSet tthemongod --port 27019 --dbpath db2 -...

2019-07-31 16:33:37 154

原创 MongoDB的CRUD

mongod是一个文本型数据库,存入数据库的都是一个一个文本。文本用{}括起来,并且文本中的内容都是键值对,和json格式差不多,但是在mongo中,它是一种和json格式很像的bson格式比如{“a”:1}就是一个文本,{“a”:{“b”:1,“c”:2}}是复杂的嵌入性文本1.insert1)db.collection.insertOne()添加一个文本db.collection.in...

2019-07-31 16:29:35 508

原创 Spring自定义注解从入门到精通

在业务开发过程中我们会遇到形形色色的注解,但是框架自有的注解并不是总能满足复杂的业务需求,我们可以自定义注解来满足我们的需求。根据注解使用的位置,文章将分成字段注解、方法、类注解来介绍自定义注解字段注解字段注解一般是用于校验字段是否满足要求,hibernate-validate依赖就提供了很多校验注解 ,如@NotNull、@Range等,但是这些注解并不是能够满足所有业务场景的。比如我们...

2019-07-31 16:26:13 376 2

原创 很高兴!终于踩到了慢查询的坑

之前看了饿了么团队写的一篇博客:等等!这两个 Spring-RabbitMQ 的坑我们已经替你踩了。深受启发,一定要取个能吸引读者眼球的标题,当然除了响当当的标题以外,内容也要是干货。为什么会想取这样一个标题,因为看了理论上的慢查询优化,今天!!!终于在生产上实战了(一)慢sql一问题发现将应用发布到生产环境后,前端页面请求后台API返回数据,发现至少需要6s。查看到慢sql:复现慢...

2018-10-21 15:25:52 266

原创 java使用phantomjs进行截图

断断续续查找资料、验证不同的实现方法终于算基本搞定了页面截图,因为中间过程曲折花费较多时间,分享出来帮助大家快速实现截图为什么选用phantomjs进行截图截图可以实现的方式有很多,比如:seleniumHtmlUnitHtml2Image、、、and so on但是这些实现的截图效果都不好。selenium只能实现截屏,不能截取整个页面,而HtmlUnit、Html2Imag...

2018-10-08 16:25:11 2335 2

原创 java模拟登陆优酷

好久没有写文章分(装)享(逼)了,趁着国庆节有充足的时间分享一下最近所学。需求背景最近被分到一个活,给你一个视频地址,需要播放这个视频并录屏保存步骤打开网页登陆播放录屏疑难问题有些视频需要登陆以后才能播放有些网站播放需要安装flash前期调研因为要模拟打开网页的操作,需要使用浏览器,所以想使用无头浏览器去实现。无头浏览器有很多种,因为自己学习的语言是java,所...

2018-10-02 00:33:40 784

原创 使用try-with-resources优雅关闭资源

代码一定得写的优雅一点 你还在使用try-catch-finally关闭资源吗,如果是,那么就有点out了。皮皮甜手把手教你使用JDK7引用的try-with-resourceJDK7之前资源的关闭姿势:/** * jdk7以前关闭流的方式 * * @author hetiantian * */public class CloseResourceBefore7 { ...

2018-09-02 17:58:53 719

原创 Synchronized和ReentrantLock的区别

昨天面试,面试官问了自己一个synchronized和ReentrantLock的区别,感觉自己回答的并不是特别好,今天在翻书学习总结一下,毕竟书读百遍其义自见。开始进入正题 两者的共同点: 1)协调多线程对共享对象、变量的访问 2)可重入,同一线程可以多次获得同一个锁 3)都保证了可见性和互斥性 两者的不同点: 1)ReentrantLock显示获得、释放锁,synchronized隐

2017-12-08 19:28:54 1234

原创 解决困扰自己已久的InnoDB存储引擎行级锁问题

在事务中执行select…for update,update,delete会引起锁,对于事务的修改,事务中会使用X锁,X锁是行级锁,InnDB行锁是通过给索引上的索引项加锁实现的(只有通过索引条件检索数据(即explain sql语句,type=index或range),InnoDB才使用行级锁,否则使用表锁) 为了验证这个,我做了一个小测验 数据表t_bitfly:CREATE TABLE `

2017-12-07 23:17:29 1683

原创 java并发中的CAS

CAS(Compare And Swap)简单介绍 CAS实现原子方式操作。java中锁可以分为两大类,乐观锁和悲观锁。乐观锁不是指哪种锁,而是一种实现线程安全的不加锁策略。而CAS实现了这个策略,先进行操作,如果没有其他线程争用共享数据,那操作就成功了,如果共享数据有争用,产生冲突,则采取其他的补偿措施,这个措施一般是不断调用那个方法,或者放弃调用 CAS执行函数: CAS(V,E,N)

2017-11-25 20:11:07 538

原创 RDB持久化和AOF持久化

为什么需要持久化 因为Redis是内存数据库,服务器进程退出,服务器中的数据库状态也会消失RDB持久化 将内存中的数据库状态保存到磁盘文件里,防止数据丢失1)生成RDB文件命令:SAVE、BGSAVE SAVE命令: 由服务器进程去执行持久化的过程,会造成阻塞,在生成RDB文件的过程中,服务器不能处理任何客户端请求的命令。 BGSAVE命令:创建一个子进程去生成RDB文件,服务器进程处理客

2017-11-25 17:42:18 324

原创 mysql查询性能优化

mysql执行查询的过程如图: 1)客户端首先通过客户端/服务器通信协议与mysql服务器建立起连接 2)客户端发送一条sql语句 判断是否为查询语句,如果是查询语句,则先在查询缓存区哈希查找对应sql的数据,如果未找到,则需要调用解析器解析、预处理、再由优化器生成对应的查询执行计划 3)mysql根据优化器生成的执行计划,调用存储引擎的API执行查询 4)将查询到的结果缓存到查询缓存中,

2017-11-24 20:14:03 434

原创 synchronized的实现原理及jvm对其优化

synchronized的使用方式 1)在普通方法前面加锁,锁是当前实例对象,即调用该方法的对象 2)在静态方法前面加锁,锁是当前类的Class对象 3)同步代码块中,锁是synchronized括号里配置的对象jvm对其实现的原理 jvm基于进入和退出monitor对象来实现方法同步和代码块同步。monitorenter指令在编译以后插入到同步代码块的开始位置,monitorexit指令插

2017-11-23 21:09:23 586

原创 聚簇索引、二级索引、覆盖索引

(一)聚簇索引 覆盖索引不是一种单独的索引类型(索引类型大致分为B-Tree索引、Hash索引、全文索引、空间数据索引、其他索引我们不是特别见到的这几大类),是一种数据存储方式,在索引存储结构结构上保存数据。InnoDB的聚簇索引实际上是在同一个结构中保存了B-Tree索引和数据行。 每一个表都有一个聚簇索引,并且只有一个。(覆盖索引除外,覆盖索引可以模拟多个聚簇索引) 聚簇索引的数据存储方式

2017-11-21 22:34:18 1803 4

原创 分页结果做缓存报java.lang.Integer cannot be cast to java.lang.String错误

今天测试redis做的缓存分页报错java.lang.Integer cannot be cast to java.lang.String。类型转化出错。我的controller层中的方法 @RequestMapping(value = "/queryNewsByPage", method = RequestMethod.POST) @ResponseBody @Cacheable(

2017-11-19 17:03:25 16065

原创 优化分页查询

我们一般使用分页都是使用limit来完成的,如果数据量小的话还可以,但是当数据量非常大的时候,不建立索引,通过全表查询,将会非常耗时,性能将受到很大的影响。第一种优化方式 在索引上完成排序分页的操作,最后根据主键关联回原表查询所需要的其他列内容例:我想对我之前的分页进行优化,没有优化前的sql语句<select id="queryNewsByPage" resultType="news">

2017-11-19 14:20:13 230

原创 常用SQL优化

这里的优化是针对InnoDB存储引擎的 (一)优化大批量插入,针对load 顺序导入(待补充) (二)优化insert语句 1)如果同时从同一个客户端插入多行,应尽量使用多个值表的insert语句。这种方式将大大缩减客户端与数据库之间的连接、关闭等消耗。例:insert into test values(1,2),(1,3),(1,4)我们一般使用ssm框架,在使用mybatis实现批量插

2017-11-18 22:42:36 266

原创 MySQL定位慢查询以及索引优化

(一)定位慢查询 1.通过explain,可以查看sql语句的执行情况(比如查询的表,使用的索引以及mysql在表中找到所需行的方式等),一般情况下,基本可以通过explain,主要是通过其查找行的方式和查找行数确定问题,因为全表扫描很浪费时间,占用cpu。2.通过show profiles查找出执行sql语句的query_id,接着执行show profile for query_id 看到执行

2017-11-18 19:32:42 478

原创 配置redis缓存失效时间

最近想利用redis缓存做一个简陋版的类似腾讯新闻这样的查看新闻的网页。用了缓存以后,添加新闻缓存没有更新,想使用缓存的失效时间做到数据库缓存一致性。刚开始做的时候认为使用@CachePut注解会起到更新缓存的作用,设置了cacheName和key都和查找方法中的@Cacheable中的key和cacheName的一样,然而并没有成功,反而是被替换了,想想hashMap就能理解这个问题了。如何设置,

2017-11-11 18:22:54 23126 1

原创 java虚拟机常见面试题整理

-1.JVM的内存模型 1)程序计数器 2)java虚拟机栈 -2.垃圾回收的时候如何判断一个对象需要回收 判断一个对象是否需要回收,即判断是否存活,有两种算法。jvm采用的是第二种算法 1)引用计数算法 假设每个对象都有一个引入计数器,每当引用一个对象进行加1操作,不再引用时计数器减1。jvm没有使用这个算法,因为它存在对象之间互相引用的问题(主要是堆里面互相引用,而在栈里已经没有引用

2017-11-07 23:03:04 590

原创 java中实例变量和类变量的区别

最近在学习java虚拟机,有点搞不清实例变量和类变量的区别,特此记录一下实例变量 个人理解有点像成员变量,在构造函数的时候进行初始化 1.实例变量声明在一个类中,但在方法、构造方法和语句块之外; 2.当一个对象被实例化之后,每个实例变量的值就跟着确定; 3.实例变量在对象创建的时候创建,在对象被销毁的时候销毁; 4.实例变量的值应该至少被一个方法、构造方法或者语句块引用,使得外部能够通过这

2017-11-06 16:40:52 735

原创 java变量初始化顺序

在类的内部,变量定义的先后顺序决定了初始化顺序,即使变量定义分散在方法定义之外,它们依旧会在任何方法(包括构造器)被调用之前得到初始化其中初始化的顺序先是静态对象,其后是非静态对象例如:class Cat{ private Dog dog1=new Dog(1); static private Dog dog2=new Dog(2); public Cat(int n){

2017-11-05 22:45:46 221

原创 对Linux学习的看法

1.Linux是一个文件系统,所以首先最重要是先搞清楚它的目录,它的目录配置是有标准的。也就几个比较重要的目录,先从根节点谈起,根节点是系统中最重要的一个目录,根节点下有与开机、还原、系统修复等操作有关的文件。/usr也很重要,因为它有点类似与windows下的C盘,一般推荐按将自己下载的软件安装到/usr/local目录下 2.基本常用的命令要熟悉。touch,rm,mv等 3.vim编辑器的

2017-11-04 22:21:08 565

原创 java并发中的原子类

什么是原子类 java并法包中提供很多了几种原子类,如AtomicInteger、AtomicLong、AtomicReference等。原子类可以保证操作的不可分割,要么都操作完,要么都不操作。以AtomicInteger为例讲解源码 主要成员变量:private volatile long value;操作的成员变量,包括对其获得与修改 这个成员变量被volatile修饰,说明原子类的实

2017-10-30 21:33:22 337

原创 Linux服务器上搭建FTP服务

安装 VSFTPD0 使用 yum 安装 vsftpdyum install vsftpd -y启动 VSFTPD0 安装完成后,启动 FTP 服务:service vsftpd start启动后,可以看到系统已经监听了 21 端口: netstat -nltp | grep 21修改配置文件 vsftpd 的配置目录为 /etc/vsftpd,包含下列的配置文件: vsftp

2017-10-28 20:33:21 406

原创 Thread.join()的使用

用法 如果一个线程t1在另外一个线程t2上调用join方法,那么t1将被挂起,直到t2结束,t1才会执行任务。一个简单例子public class TestJoin implements Runnable { public static void main(String[] args) throws InterruptedException { Thread t = new

2017-10-28 18:53:21 265

原创 java并发中的interrupt

interrupt用来干嘛 终止被阻塞的任务。当抛出异常或该任务调用Thread.interrupted()时,中断状态将被复位。阻塞状态 1)调用sleep()进入睡眠状态 2)调用wait()将线程挂起 3)任务在等待某个输入输出的完成 4)任务试图在某个对象上调用其同步控制方法。但是对象锁不可用。因为另外一个任务已经获得这个锁 3)、4)两种情形将不会被中断简单Demopublic

2017-10-28 14:57:40 320

原创 String和StringBuffer

1:String对象的重载”+”操作小例子:public class TestString { public static void main(String[] args){ String a="a"; String s="a"+"b"+"c"+1; System.out.println("s: "+s); }}查看字节

2017-10-28 12:22:12 219

原创 java中接口和抽象类的区别

抽象类:1.用abstract表示2.里面有一个或多个抽象方法,在方法前加abstract,抽象类中也可以没有抽象方法3.抽象类用extends继承,并且必须重写抽象方法接口1.用implement表示2.接口是极度抽象的类,所有方法都是抽象的,都需要进行重写接口的作用:解决java中的单继承问题,一个类可以实现多个接口,但只能有一个父类共同点:都不能被实例化

2017-10-28 12:16:37 307

原创 深入理解HashSet

HashSet简介 HashSet实现了Set接口,Set接口是一种不包括重复元素的Collection,并且是无序的,为了提高访问速度。底层实现是HashMap源码分析 1)主要成员变量: private transient HashMap< E,Object > map; private static final Object PRESENT = new Obje

2017-10-28 10:31:21 244

原创 jdk1.8HashMap源码实现分析

**HashMap介绍 HashMap实现了Map接口,以key-value的形式存储。所以当需要以键值对存储的时候会选用HashMapHashMap源码分析 1)构造函数: HashMap共有三个构造函数public HashMap(int initialCapacity, float loadFactor) { if (initialCapacity < 0)

2017-10-27 09:06:05 431

原创 Java中System.arraycopy()和Arrays.copyOf()的区别

**System.arraycopy()**这是一个由java标准库提供的方法。用它进行复制数组比用for循环要快的多。arraycopy()需要的参数有:源数组,从源数组中的什么位置开始复制的偏移量,目标数组,从目标数组中的什么位置开始复制的偏移量,需要复制的元素个数

2017-10-25 22:28:54 797

原创 深入理解ArrayList

1.ArrayList介绍 List有序地。ArrayList是实现了List的接口的动态数组。底层的是实现是数组,插入和移除元素的效率较慢 2.源码分析 1)成员变量 private static final int DEFAULT_CAPACITY = 10; private static final Object[] EMPTY_ELEMENTDATA = {}; private s

2017-10-25 22:00:38 250

原创 Linux切换用户

Linux切换用户普通用户缺少一些权限,有些命令不能进行操作,这时候我们就需要拿到root权限才可以,拿到root权限有两种方式*- 方式一:使用su - 或者su 此时就会提示你输入密码,输入密码成功以后就能以root权限操作,变成root以后会从$变成#su- 和su 虽然都能切换到root权限,但两者还是有区别的使用su切换到root身份,读取的变量设置方式为non-login shell的方式,

2017-10-22 14:58:45 573

原创 记一次网易面试

记录一次网易面试

2017-10-18 19:36:15 505

原创 SpringCloud API网关服务(Spring Cloud Zuul)

- API网关用来做什么 API网关有点像微服务架构体系中的门面,所有外部客户端访问都需要经过它来进行跳读和过滤。API网关可以实现请求路由、负载平衡、校验过滤等功能,还能聚合服务治理框架、熔断机制、服务等- 路由规则与服务实例的维护 Spring Cloud Zuul通过与Spring Cloud Eureka进行整合,将自身注册为Eureka服务治理下的应用,同时从Eureka中获得所有其他

2017-10-16 19:05:54 630

空空如也

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

TA关注的人

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