自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 2021-10-16

架构—springboot项目部署docker安装dockerdocker存储库安装docker守护进程端口暴漏出去修改docker配置文件vi /lib/systemd/system/docker.service修改启动命令ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2379 -H unix://var/run/docker.sock重启dockersystemctl daemon-reloadservice docker restart

2021-10-17 00:18:43 98

原创 NIO和IO的区别

前言Java NIO(new/inputstream outputstream)使用通道、缓冲来操作流,所以要深刻理解这些概念,尤其是,缓冲中的数据结构(当前位置(position)、限制(limit)、容量(capacity)),这些知识点要通过写程序慢慢体会。NIO vs 传统IONIO是面向缓冲、通道的;传统IO面向流通道是双向的既可以写、也可以读;传统IO只能是单向的NIO可以设置为异步;传统IO只能是阻塞,同步的缓冲区结构图NIO是面向缓冲区的,缓冲区可以理解为一块内存,有大小。缓

2021-03-03 19:27:10 157 1

原创 MYSQL数据库------索引底层结构

MySql的存储结构MySQL作为一个关系型数据库,最核心也是最基本的一个功能就是存储数据,而数据的存储最终都是存储在磁盘文件上的,不过MySQL并不会像Java中那样把一个对象序列化之后直接存储到磁盘上去,因为这样的话后续就不太方便来查找数据了,所以MySQL在一行数据的存储上做了一定的设计。我们平时是以记录为单位来向表中插入数据的,我们在Navicat等客户端看到是一个表格,里面有一行一行的记录,比如下面这样:但这些记录最终在磁盘上的存放方式是有规则的,一个记录在磁盘上的存放方式也被称为行格式,

2021-01-24 19:30:18 174

原创 volatile关键字

Java内存模型Java内存模型规定所有的变量都是存在主存当中(类似于物理内存),每个线程都有自己的工作内存(类似于栈帧)。线程对变量的所有操作都必须在工作内存中进行,而不能直接对主存进行操作。并且每个线程不能访问其他线程的工作内存。举个简单的例子:在java中,执行下面这个语句:i = 10;执行线程必须先在自己的工作线程中对变量i所在的缓存行进行赋值操作,然后再写入主存当中。而不是直接将数值10写入主存当中。1.原子性在Java中,对基本数据类型的变量的读取和赋值操作是原子性操作,即这些

2020-12-27 14:33:21 64

原创 MYSQL数据库------SQL优化

sql优化对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by,GROUP BY涉及的列上建立索引。对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by涉及的列上建立索引。应尽量避免在where子句中使用!=或<>操作符,MySQL只有对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE。应尽量避免在where子句中使用or来连接条件,否则将导致引擎放弃使用索引而进行全表扫描

2020-12-05 02:09:25 203

原创 MYSQL数据库------线上cpu高

生产环境下数据库优化的思路showprocess定位sql1.查询很慢,top查看mysql的cpu很高,多数都是因为查询花费大量时间2.通过命令show processlist查看当前执行的sql3.如果出现大量相同的sql就需要对这个sql先进行explain进行分析,然后优化这个sql4.出现大量的状态是sleep可能的风险有:1、大量sleep线程会占用连接数,当超过max_connections后,新连接无法再建立,业务不可用;2、这些sleep线程中,有些可能有未提交事务,可能

2020-11-28 15:02:39 82

原创 MYSQL数据库------索引的类型与结构

mysql索引是可以提高查询效率的索引的类型normal:表示普通索引unique:表示唯一的,不允许重复的索引,如果该字段信息保证不会重复例如身份证号用作索引时,可设置为unique(如果字段的值唯一尽量用unique)full textl: 表示 全文搜索的索引。 FULLTEXT 用于搜索很长一篇文章的时候,效果最好。用在比较短的文本,如果就一两行字的,普通的 INDEX 也可以。总结,索引的类别由建立索引的字段内容特性来决定,通常normal最常见。索引的结构HASH由于HASH的

2020-11-28 13:22:16 60

原创 java服务线上排查事故------CPU高

步骤一:查看cpu占用高进程toptopMem: 16333644k total, 9472968k used, 6860676k free, 165616k buffersSwap: 0k total, 0k used, 0k free, 6665292k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 17850 root

2020-11-25 20:21:14 142

原创 线程池的原理(fixed线程池)

线程池由两个核心数据结构组成:1)线程集合(workers):存放执行任务的线程,是一个HashSet;2)任务等待队列(workQueue):存放等待线程池调度执行的任务,是一个阻塞式队列BlockingQueue;线程池有几个核心参数:任务执行流程1)线程池中线程数量小于corePoolSize,此时任务不会进等待队列,线程池直接创建一个线程Worker执行提交的任务;2)线程池中线程数量不小于corePoolSize并且等待队列未满,任务直接添加到等待队列,等待线程池调度执行;3)线程

2020-09-26 16:28:31 714

原创 Redis

Redis支持的数据类型String最常规的set/get操作,value可以是String也可以是数字。一般做一些复杂的计数功能的缓存。hash这里value存放的是结构化的对象,比较方便的就是操作其中的某个字段。博主在做单点登录的时候,就是用这种数据结构存储用户信息,以cookieId作为key,设置30分钟为缓存过期时间,能很好的模拟出类似session的效果。List使用List的数据结构,可以做简单的消息队列的功能。另外还有一个就是,可以利用lrange命令,做基于redis的分页功能

2020-09-13 13:23:21 58

原创 高并发------集合篇

ListCopyOnWriterArrayList(ArrayList)我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。重点容器维护的数组使用volatile修饰的,保证及时可见性!SetCopyO

2020-09-13 03:06:35 219

原创 Elasticsearch实战---------踩坑篇

1.es对索引数没有上限,但是对分片数有上限,如果超过分片的上限,索引状态red2.java查询es最多查询1万,所以要使用游标的方式查询3.es添加数据时候如果索引不存在会自动创建索引,默认是text类型,但是会添加keyword的映射,所以查询时候需要加上.keyword...

2020-08-30 13:45:37 108

原创 Elasticsearch实战---------java查询

term (精确查询)term query会去倒排索引中寻找确切的term,它并不知道分词器的存在。这种查询适合keyword 、numeric、date。term:查询某个字段里含有某个关键词的文档//about字段中包含money QueryBuilder term = QueryBuilders.termQuery("about", "money");terms (精确查询)terms:查询某个字段里含有多个关键词的文档//about字段中包含money或cheapest Que

2020-08-30 13:41:59 179

原创 Elasticsearch实战---------设计索引

大索引的缺陷索引是es存储数据的地方,如果一个索引很大,数据写入和查询性能都会变差,而高效检索体现在:基于日期的检索可以直接检索对应日期的索引,无形中缩减了很大的数据规模。比如检索:“2019-02-01”号的数据,之前的检索会是在一个月甚至更大体量的索引中进行好处:1.查询效率快,2.一旦一个大索引出现故障,相关的数据都会受到影响。而分成滚动索引的话,相当于做了物理隔离。PB 级索引设计实现综上,结合实践经验,大索引设计建议:使用模板+Rollover+Curator动态创建索引。使用模板

2020-08-02 13:58:40 237

原创 项目中遇到的java内存溢出

Java内存溢出的场景栈溢出(StackOverflowError)java栈空间是线程私有的,是java方法执行的内存模型。每个方法执行时都会在java栈空间产生一个栈帧(工作内存),存放方法的变量表,返回值等信息,方法的执行到结束就是一个栈帧入栈到出栈的过程。所以栈溢出的原因一般是循环调用方法导致栈帧不断增多,栈深度不断增加,最终没有内存可以分配,出现StackOverflowError,比如下面这种情况:public class stack{ public void test(){

2020-07-26 13:48:22 619

原创 Threadlocal

应用场景ThreadLocal是用在多线程的场景的优势保存线程上下文信息,在任意需要的地方可以获取线程安全的,避免某些情况需要考虑线程安全必须同步带来的性能损失!!!保存线程上下文信息,在任意需要的地方可以获取!!!比如Spring的事务管理,用ThreadLocal存储Connection,从而各个DAO可以获取同一Connection,可以进行事务回滚,提交等操作。注:Threa...

2020-04-14 22:55:43 120

原创 java作为客户端实现rabbitmq的代码

生产者package com.sam.hello_rabbitmq;import java.io.IOException;import java.util.concurrent.TimeoutException;import com.rabbitmq.client.Channel;import com.rabbitmq.client.Connection;import com.ra...

2020-03-22 16:45:02 111

原创 jedis实现分布式锁

jedis分布式锁实现的4个要点1.互斥性。在任意时刻,只有一个客户端能持有锁。2.不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。3.具有容错性。只要大部分的Redis节点正常运行,客户端就可以加锁和解锁。4.解铃还须系铃人。加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解了。代码的实现//加锁public class Re...

2020-03-07 13:12:30 240 1

原创 redis

应用场景优点和缺点原理应用场景1.我们在碰到需要执行耗时特别久,且结果不频繁变动的SQL,就特别适合将运行结果放入缓存。这样,后面的请求就去缓存中读取,使得请求能够迅速响应。 @Override public TbItem getItemById(long itemId) { //获取商品添加缓存,不影业务响逻辑,try-catch try { System.out.p...

2020-03-03 21:33:43 72

原创 JVM详解

详细的文章在这里:点我一 java代码运行的流程1.1编译java代码运行前需要先编译:编译:java源代码—javac—class文件1.2jvm编译后class文件不能直接运行。需要jvm才能运行(jvm是凌驾于操作系统之上的,不同的操作系统有不同的指令,只需保证安装jdk的时候指明一下系统就可以实现一次编译,到处运行)1.2.1class文件是什么时候加载到jvm上的一般...

2020-02-23 21:21:18 134

原创 Java---IO

以Stream结尾的为字节流,以Writer或者Reader结尾的为字符流。所有的输入流都是抽象类IuputStream(字节输入流)或者抽象类Reader(字符输入流)的子类,所有的输出流都是抽象类OutputStream(字节输出流)或者抽象类Writer(字符输出流)的子类。字符流能实现的功能字节流都能实现,反之不一定。如:图片,视频等二进制文件,只能使用字节流读写。1、字符流FileR...

2020-02-21 21:57:56 71

原创 @RequestBody,@RequestParam,@pathvailty区别

之前对@RequestBody,@RequestParam的区别有误解,一直认为get请求用@RequestParam接受,post请求用@RequestBody接受,这种想法是错误的,这俩者的根本区别是Content-TypeContent-Type=application/json @RequestBody@RequestParam无论是post还是get 如果请求参数是在url?后...

2020-02-16 17:09:58 182

原创 HTTP和FTP的区别

http和ftp都是用来连接俩台计算机的,但是http是面向网页的,ftp是面向文件的区别HTTPFTP应用层http协议ftp协议传输层tcp/ip或udp(只调用一次)tcp/ip(调用俩次)网络层ipip链路层硬件设备硬件设备http请求过程:创建连接 发送请求 返回请求 关闭连接ftp请求过程:客户端向ftp服务器的21...

2020-02-15 17:16:50 371

原创 java中如何实现http连接和ssh连接(以及俩者的使用场景)

HTTP的使用场景连接第三方服务的接口SSH的使用场景经常会登录到远程服务器上进行一系列操作(如目录跳转、脚本执行等);这些动作固定,但是每次重复操作会显得较为繁琐。基于此,开发出一个自动化脚本用以代替手工执行很有必要。java中HTTP的实现方式java原生HttpURLConnectionorg.apache.commons.httpclientpackage com.power...

2020-02-14 23:44:27 877

原创 java中如何开启异步任务(多线程的创建)

一共分为俩大方式1.注解@Async2.Thread,Runable,Callable/Future注解@Async在异步调用中有具体介绍,这里在补充一下有返回值和无返回值的区别//无返回值 @Async //标注使用 public void asyncMethodWithVoidReturnType() { System.out.println("Execute met...

2020-02-12 21:55:40 8919 2

原创 分布式锁的实现方式

数据库处理并发的问题悲观锁和乐观锁悲观锁:for update乐观锁:在表中加一个版本字段注:在实际项目中中尽量不要从数据库去处理并发的问题,因为无论是悲观锁还是乐观锁都会对数据库的性能带来一些问题,还有如果用悲观锁,在查询的时候还会出现gap锁,有可能导致死锁的出现,所以慎用数据库的锁...

2020-02-04 20:34:35 63

原创 java中集合应用场景

ArrayListadd添加ArrayList 底层是数组,当我们初始化一个长度为 2 的 ArrayList ,并往里边写入三条数据时 ArrayList 就得扩容了,也就是将之前的数据复制一份到新的数组长度为 3 的数组中。一旦我们频繁且数量巨大的进行写入时就会导致许多的数组复制,这个效率是极低的。但如果我们提前预知了可能会写入多少条数据时就可以提前避免这个问题。在有大量数据写入 ...

2020-02-03 16:21:33 256

原创 MYSQL数据库------mysql的锁机制

锁机制在程序中是最常用的机制之一,当一个程序需要多线程并行访问同一资源时,为了避免一致性问题,通常采用锁机制来处理。在数据库的操作中也有相同的问题,当两个线程同时对一条数据进行操作,为了保证数据的一致性,就需要数据库的锁机制。每种数据库的锁机制都自己的实现方式,mysql作为一款工作中经常遇到的数据库,它的锁机制在面试中也经常会被问到。所以本文针对mysql数据库,对其锁机制进行总结。mysql...

2020-02-02 03:02:14 108

原创 FTP

文件传输协议FTP(File Transfer Protocol)是因特网中使用最广泛的文件传输协议。FTP使用交互式的访问,允许客户指定文件的类型和格式(如指明是否使用ASCII码),并允许文件具有存取权限(如访问文件的用户必须经过授权,并输入有效的口令)。文件传输协议有基于TCP的FTP和基于UDP的简单文件传输协议TFTP,它们都是文件共享协议中的一大类,即复制整个文件,其特点是:若要存取...

2020-01-26 11:49:29 100

原创 总结:处理跨域的问题

1.nginx2.vue配置代理3.后台添加header4.jsonp

2020-01-13 21:34:04 63

原创 Spring框架的AOP实现原理及常见的例子

spring ioc默认的都是原生对象(动态创建原生对象) 只有通过aop增强的对象才是代理对象(动态创建代理对象)@Async、@Transactional、@Cacheable等注解标注的方法都会被spring中的aop创建动态代理对象那么aop创建动态代理对象是通过什么方式呢--------Cglib简单理解:CGLIB的动态代理,是基于现有类创建一个子类(所以在springboot...

2020-01-11 17:42:31 109

原创 Springboot的异步请求和异步调用(aop动态创建代理对象)

异步请求特点:减少系统服务的压力,如果并发请求量很大的情况下,我们会通过nginx把请求负载到集群服务的各个节点上来分摊请求压力,当然还可以通过消息队列来做请求的缓冲异步调用通常在开发过程中,会遇到一个方法是和实际业务无关的,没有紧密性的。比如记录日志信息等业务。这个时候正常就是启一个新线程去做一些业务处理,让主线程异步的执行其他业务。使用方式需要在启动类加入@EnableAsync使异...

2020-01-08 21:46:15 912

原创 mybatis的一级缓存和二级缓存

先说缓存,合理使用缓存是优化中最常见的,将从数据库中查询出来的数据放入缓存中,下次使用时不必从数据库查询,而是直接从缓存中读取,避免频繁操作数据库,减轻数据库的压力,同时提高系统性能。一级缓存一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构用于存储缓存数据。不同的sqlSession之间的缓存数据区域是互相不影响的。也就是他只能作...

2020-01-06 21:14:19 52

原创 elasticsearch的重中之重------分片

分片究竟创建多少个合理你分配的每个分片都是有额外的成本的:1.每个分片本质上就是一个Lucene索引, 因此会消耗相应的文件句柄, 内存和CPU资源2.每个搜索请求会调度到索引的每个分片中. 如果分片分散在不同的节点倒是问题不太. 但当分片开始竞争相同的硬件资源时, 性能便会逐步下降3.ES使用词频统计来计算相关性. 当然这些统计也会分配到各个分片上. 如果在大量分片上只维护了很少的数据,...

2020-01-02 21:44:18 104

原创 SpringCloud----Eureka Config

SpringCloud介绍Spring Cloud 是一套完整的微服务解决方案,基于 Spring Boot 框架,准确的说,它不是一个框架,而是一个大的容器,它将市面上较好的微服务框架集成进来,从而简化了开发者的代码量。什么是微服务/集群集群特点:多个服务实例完成同一份工作,万一一台挂了,另一个还可以正常使用实例:注册中心eureka就可以实现集群微服务特点:将业务拆分成不同的子...

2020-01-01 21:54:42 267

原创 java作为客户端继承rabbitmq

1.添加基础配置生产者、消费者基础配置相同。(在项目中一个服务可以既是消费者也是生产者)1.1)集成rabbitmq,添加maven依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-...

2019-12-30 22:23:01 240

原创 Rabbit

应用场景异步(适合非主业务的处理)场景说明:用户注册后,需要发注册邮件和注册短信。传统做法:将注册信息写入数据库成功后,发送注册邮件,再发送注册短信。以上三个任务全部完成后,返回给客户端。引入消息队列,将不是必须的业务逻辑,异步处理。改造后的架构如下:按照以上约定,用户的响应时间相当于是注册信息写入数据库的时间,也就是50毫秒。注册邮件,发送短信写入消息队列后,直接返回,因此写入消息...

2019-12-29 12:39:32 175 1

原创 ElasticSearch Text和KeyWord数据类型的区别

step1 添加数据首先,使用bulk往es数据库中批量添加一些documentPOST /book/novel/_bulk{"index": {"_id": 1}}{"name": "Gone with the Wind", "author": "Margaret Mitchell", "date": "2018-01-01"}{"index": {"_id": 2}}{"name"...

2019-12-25 21:22:05 461

原创 Elasticsearch实战---------相关名词介绍

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Ma...

2019-12-25 21:13:44 124

原创 VUE常见的实战问题

子组件调用父组件的方法第一种方法是直接在子组件中通过this.$parent.event来调用父组件的方法父组件<template> <div> <child></child> </div> </template> <script> import child from '~/compon...

2019-12-08 20:33:58 163

空空如也

空空如也

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

TA关注的人

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