
java
文章平均质量分 84
一瓶橄榄菜
这个作者很懒,什么都没留下…
展开
-
RPC与Netty简介
RPC一.Socket介绍Socket概述Socket,套接字就是两台主机之间逻辑连接的端点。TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。Socket是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议、本地主机的IP地址、本地进程的协议端口、远程主机的IP地址、远程进程的协议端口。Socket整体流程Socket编程主要涉及到客户端和服务端两个方原创 2022-04-22 11:33:52 · 1904 阅读 · 0 评论 -
SpringBoot简介
SpringBoot第一部分 SpringBoot应用相关概念约定优于配置约定优于配置(Convention over Configuration),又称按约定编程,是一种软件设计规范。本质上是对系统、类库或框架中一些东西假定一个大众化合理的默认值(缺省值)。例如在模型中存在一个名为User的类,那么对应到数据库会存在一个名为user的表,此时无需做额外的配置,只有在偏离这个约定时才需要做相关的配置(例如你想将表名命名为t_user等非user时才需要写关于这个名字的配置)。如果所用工具的约定原创 2021-11-16 14:47:52 · 3135 阅读 · 0 评论 -
Linux下安装mysql-8.0.22
安装环境主机是购买的阿里云的云服务器系统是云服务器自带的CentOS 8.2 64位mysqlmysql是mysql-8.0.22版本,可以去https://dev.mysql.com/downloads/mysql/下载对应的版本安装1.在安装前需要确保没有安装过mysql,如果安装过请彻底删除对应的文件,具体方法可以自行百度2.检查mysql用户组和用户是否存在cat /etc/group | grep mysqlcat /etc/passwd |grep mysql3.如果用户原创 2021-01-16 11:41:55 · 1339 阅读 · 0 评论 -
Mysql中sql执行的过程
1、客户端和服务器建立连接,发送请求2、服务器先检查查询缓存。如果在查询缓存中发现了该sql,则会进行权限校验,权限校验通过,直接返回结果。如果查询缓存中没有,则进入下面的步骤(对应查询缓存这一过程,8.0这一过程已经不存在了,8.0完全抛弃了这个功能)3、服务器对sql进行解析。识别出sql里面的字符串是否符合标准,比如select关键字不能写错。识别出sql里面的字符串的具体意思是什么,比如T1是表名,C1是列名(对应解析器这一过程)4、服务器对sql进行预处理。确定sql的执行路径,比如走索引.原创 2020-07-09 19:26:13 · 426 阅读 · 0 评论 -
HTTP协议详解
HTTP协议简介超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。HTTP的发展是由蒂姆·伯纳斯-李于1989年在欧洲核子研究组织(CERN)所发起。HTTP的标准制定由万维网协会(World Wide Web Consortium,W3C)和互联网工程任务组(Internet Engineering Task Force,IETF)进行协调,最终发布了一系列的RFC,其中转载 2020-07-07 13:52:30 · 527 阅读 · 0 评论 -
数据库索引原理及优化
本文内容主要来源于互联网上主流文章,只是按照个人理解稍作整合,后面附有参考链接。一、摘要本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打...转载 2020-04-24 15:49:42 · 622 阅读 · 1 评论 -
Nginx配置
反向代理与前向代理前向代理:作为客户端的代理,将从互联网上获取的资源返回给一个或多个的客户端,服务端(如Web服务器)只知道代理的IP地址而不知道客户端的IP地址;反向代理:是作为服务器端(如Web服务器)的代理使用,而不是客户端,客户端知道代理服务器IP地址而不知道具体后台服务器的IP地址。举个例子,在公司通过代理服务器访问外网,这里代理服务器属于前向代理服务器,而客户通过代理服务...转载 2020-03-16 15:59:12 · 427 阅读 · 0 评论 -
Mac安装Nginx
一.安装Pcre1.到Pcre官网,下载安装包2.解压压缩包3.在命令行中执行sudo -i切换到root用户下,并进入解压后的目录4.执行./configure --prefix=/usr/local/pcre进行相关检查5.执行make && make install,如果没有报错,则安装完毕6.执行make -k check检查安装是否完成,完成的界面如下:二...原创 2020-03-13 15:51:01 · 1153 阅读 · 0 评论 -
Zookeeper 安装(Mac)、配置、常用命令及简单的java实例
Zookeeper介绍zookeeper是一个分布式服务框架,主要是用来解决分布式应用中的数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。 可以把zookeeper理解为一个由文件系统+监听通知机制组成的框架。详细介绍可以去Zookeeper官网查询,1、 文件系统Zookeeper维护一个类似文件系统的数据结构:每个子目录项如 NameService.........原创 2020-01-13 10:45:04 · 1894 阅读 · 0 评论 -
Java中Curator的使用
Java中Curator的使用转载 2020-01-13 10:44:44 · 2180 阅读 · 0 评论 -
如何使用RedisTemplate访问Redis数据结构
Redis 数据结构简介Redis 可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字符串)、List(列表)、Set(集合)、Hash(散列)和 Zset(有序集合)。下面来对这5种数据结构类型作简单的介绍:结构类型结构存储的值结构的读写能力String可以是字符串、整数或者浮点数对整个字符串或者字符串的其中一部分执行操作;对象和...转载 2020-01-04 18:09:05 · 207 阅读 · 0 评论 -
jdk1.8 jstat命令
简介Jstat是JDK自带的一个轻量级小工具,位于java的bin目录下。主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控。jstat工具可以查看堆内存各部分的使用量,以及加载类的数量。命令的格式如下:jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数]示例使用jps -v找到要统计的JVM进程id,这里的进程id为8470。示例中没...原创 2019-12-28 15:04:16 · 1186 阅读 · 0 评论 -
SpringCloud之Zuul简单实例(springboot2.2.2RELEASE)
一. API网关简介网关就可以对外暴露聚合API,屏蔽内部微服务的微小变动,保持整个系统的稳定性。它还可以做负载均衡,统一鉴权,协议转换,监控监测等一系列功能。二. Zuul简介Zuul是Spring Cloud全家桶中的微服务API网关。所有从设备或网站来的请求都会经过Zuul到达后端的Netflix应用程序。作为一个边界性质的应用程序,Zuul提供了动态路由、监控、弹性负载和安全功能...原创 2019-12-26 12:00:15 · 1757 阅读 · 0 评论 -
SpringCloud之Feign的简单实例,包括声明式REST调用及容错处理(springboot2.2.2RELEASE)
eureka地址示例(代码地址)1.pomxml<properties> <java.version>1.8</java.version> <spring-cloud.version>Hoxton.RELEASE</spring-cloud.version> </properties&g...原创 2019-12-24 10:01:43 · 725 阅读 · 0 评论 -
SpringCloud之eureka简单实例(springboot2.2.2RELEASE)
一. Eureka简介Eureka是Netflix开源的服务发现组件,本身是基于Rest的服务,它包含服务端和客户端两部分;在SpringCloud中将它集成在其中,从而实现了微服务的发现与注册;Eureka的GitHub:https://github.com/Netflix/Eureka二. Eureka Server说明服务端:服务实例需要执行服务注册、发送心跳去续约(服务续约...原创 2019-12-21 19:03:25 · 1931 阅读 · 0 评论 -
Eureka自我保护机制
Eureka自我保护机制:eureka虽然收不到实例的心跳,但它认为实例还是健康的,eureka会保护这些实例,不会把它们从注册表中删掉。默认情况下,当eureka server在一定时间内没有收到实例的心跳,便会把该实例从注册表中删除(默认是90秒)。但是,短时间内丢失大量的实例心跳,便会触发eureka server的自我保护机制(开发测试时),此时eureka不会删除实例,但是会出现红...原创 2019-12-21 19:03:05 · 785 阅读 · 0 评论 -
《Maven官方文档》-Maven依赖机制简介
依赖机制是Maven最为用户熟知的特性之一,同时也是Maven所擅长的领域之一。单个项目的依赖管理并不难,但是当你面对包含数百个模块的多模块项目和应用时,Maven能帮你保证项目的高度控制力和稳定性。文章目录一.传递性依赖二.依赖范围三.依赖管理集中管理控制传递性依赖导入依赖系统依赖一.传递性依赖传递性依赖是Maven2.0的新特性。假设你的项目依赖于一个库,而这个库又依赖于其他库。你不必自...转载 2019-12-11 11:20:00 · 250 阅读 · 0 评论 -
JVM中GC常用参数说明及理解GC日志
JVM中GC常用参数参数解释-agentlib:ipharmacare_hook公司指定文件:解析密钥需用到-XX:MetaspaceSize=256m元空间初始空间大小-XX:MaxMetaspaceSize=512m元空间 最大空间,默认是没有限制的。-Xms1024m设置JVM最大可用内存为1024M。-Xmx1024m设置JVM促使内...原创 2019-12-10 16:30:35 · 1696 阅读 · 0 评论 -
Java try-with-resource语法
JDK1.7之前在JDK1.7之前要确保外部资源关闭一般使用finally,如下FileInputStream inputStream = null;try { inputStream = new FileInputStream(new File("user.csv")); System.out.println(inputStream.read());} catch (IO...原创 2019-12-09 21:05:46 · 278 阅读 · 0 评论 -
MyBatis 中resultType属性
resultType:MyBatis中resultType是用来指定查询结果类型的属性一.返回一般数据类型对于引用类型一般采用大写字母转小写的方式。基本类型一般在前面加"_",下面给了两个例子stringmapper接口:String getPasswordByName(@Param("name") String name);xml:<select id="getPass...原创 2019-12-09 16:01:01 · 1708 阅读 · 1 评论 -
@NotNull和@NonNull的区别和使用
区别@NotNull在类字段中使用,表示该字段不能为空。它是 JSR303(Bean的校验框架)的注解。在调用controller的方法中加入@Valid就可以验证该方法参数中该类的对应属性是否为空,如果为空,注解中的提示信息会保存在result中。@NonNull在方法或构造函数的参数上使用,表示该参数不能为空。@NotNull使用/** * user类 */@Datapubli...原创 2019-12-09 12:30:06 · 8587 阅读 · 0 评论 -
BigDecimal加减乘除计算及舎入模式
运算函数加法 add()函数减法subtract()函数乘法multiply()函数除法divide()函数绝对值abs()函数示例BigDecimal num1 = new BigDecimal(100);BigDecimal num2 = new BigDecimal(-100);BigDecimal num3 = new BigDecimal("0.5");BigDe...原创 2019-12-09 10:40:10 · 229 阅读 · 0 评论 -
String.format()的用法
普通转换符转换符详细说明%s返回字符串类型%c返回字符类型%b返回布尔类型%d返回整数类型(十进制)%x返回整数类型(十六进制)%o返回整数类型(八进制)%f返回浮点类型%a返回十六进制浮点类型%e返回指数类型%g返回通用浮点类型(f和e类型中较短的)%h返回散列码%%返回百分比类型 %...原创 2019-12-07 15:12:28 · 541 阅读 · 0 评论 -
springboot+log4j2+阿里云日志
1. springboot配置文件log4j2可以有多个配置文件根据环境的不同(本地环境、测试环境、线上环境)可以选择不同的配置,在application中可以使用以下属性进行配置:logging.config=classpath:log4j2-dev.xml2. log4j2文件格式log4j2配置文件后缀名只能为".xml",".json"或者".jsn"。系统选择配置文件的优先...原创 2019-12-06 21:17:04 · 2376 阅读 · 0 评论 -
深入学习Java内存模型JMM
多任务和高并发是衡量一台计算机处理器的能力重要指标之一。一般衡量一个服务器性能的高低好坏,使用每秒事务处理数(Transactions Per Second,TPS)这个指标比较能说明问题,它代表着一秒内服务器平均能响应的请求数,而TPS值与程序的并发能力有着非常密切的关系。物理机的并发问题与虚拟机中的情况有很多相似之处,物理机对并发的处理方案对于虚拟机的实现也有相当大的参考意义。由于计算机的存...转载 2019-12-04 19:51:50 · 306 阅读 · 0 评论 -
Java JDK1.8中类常量池、运行时常量池、字符串常量池所处区域
类常量池诞生时间:编译时所处区域:堆(类常量池存在Class文件中,一个Class文件对应一个类常量池)储存内容:符号引用和字面量。字符串常量池诞生时间:编译时所处区域:堆储存内容:堆内的字符串对象的引用和字符串常量。运行时常量池诞生时间:当类加载到内存中后所处区域:本地内存(每个class都有一个运行时常量池,运行时常量池存在元空间中)储存内容:class文件元信息描述,编...原创 2019-12-04 17:55:01 · 4740 阅读 · 4 评论 -
Java内存区域(运行时数据区域)划分
JVM内存空间介绍jdk1.8之前JDK1.8以前Java虚拟机(Java Virtual Machine=JVM)的内存空间分为五个部分,分别是:程序计数器(线程私有)Java虚拟机栈(线程私有)本地方法栈(线程私有)堆(线程共享)方法区(线程共享)示意图:jdk1.8JDK1.8之后JVM内存模型如下图:区别需要注意的是,方法区又称为永久代(Perm Gen--...转载 2019-12-04 17:09:25 · 582 阅读 · 0 评论 -
Java创建String字符串分析
字符串常量池字符串常量池:在jdk1.8中是堆空间的一个常量池,用于存放已经创建的字符串。在字符串池中的每个字符串对象只有唯一的一份,可以被多个引用所指向,避免了重复创建内容相同的字符串;通过字面值赋值创建的字符串对象存放在字符串池中,通过关键字new出来的字符串对象存放在堆中(也在常量池中创建该字符串的常量,只是返回的是地址是指向堆中的对象)。创建字符串分析使用字面量方式创建 ...原创 2019-12-04 12:26:49 · 227 阅读 · 0 评论 -
《java并发编程实战》笔记(无代码)
第一部分基础知识二.线程安全性无状态:不包含任何域,也不包含任何对其他类中域的引用。无状态的对象一定是线程安全的竞态条件:当某个结果的正确性取决于多线程的交替执行时就会发生竞态条。最常见的就是先检查后执行的操作,在检查时可能会读取到一个失效值从而执行了错误的操作线程安全性:当多个线程访问某个类时,这个类始终都能表现出正确的行为,那么就称这个类是线程安全的。在线程安全类中封装了必要...原创 2019-11-30 17:32:51 · 627 阅读 · 0 评论 -
Java 中synchronized关键字及volatile的可见性实现
JMM(JAVA内存模型)JMM工作原理如上图所示,一些被定义的变量都存放在主内存中,当一个线程想要修改一个变量的值时,那么这个变量会从主内存中拷贝到线程的工作内存(CPU缓存)中。之后线程对变量值做了更改,又会重新拷贝回主内存中。大家通过描述也可以看出来这些操作是分步执行的,这样就无法保证可见性和原子性。对于这种情况java也给出了很多解决办法,其中就有synchronized以及volat...转载 2019-11-30 13:36:20 · 389 阅读 · 0 评论 -
Java指令重排和happens-before规则
指令重排重排序:Java 语言规范规定了JVM线程内部维持顺序化语义,也就是说只要程序的最终结果等同于它在严格的顺序化环境下的结果,那么指令的执行顺序就可能与代码的顺序不一致。这个过程叫做指令的重排序。指令重排序存在的意义在于:JVM能够根据处理器的特性(CPU的多级缓存系统、多核处理器等)适当的重新排序机器指令,使机器指令更符合CPU的执行特点,最大限度的发挥机器的性能。重排序的种类...原创 2019-11-29 21:47:17 · 905 阅读 · 0 评论 -
hash碰撞解决方法及HashMap的初始容量是为什么16?
hash碰撞解决方法概念hash(散列、杂凑)函数:是将任意长度的数据映射到有限长度的域上。直观解释起来,就是对一串数据m进行杂糅,输出另一段固定长度的数据h,作为这段数据的特征(指纹)。也就是说,无论数据块m有多大,其输出值h为固定长度。hash原理:将m分成固定长度(如128位),依次进行hash运算,然后用不同的方法迭代即可(如前一块的hash值与后一块的hash值进行异或)。如...转载 2019-11-25 11:46:28 · 403 阅读 · 0 评论 -
HashMap的结构,1.7和1.8的区别
不同点:1.JDK1.7用的是头插法,而JDK1.8及之后使用的都是尾插法,那么他们为什么要这样做呢?因为JDK1.7是用单链表进行的纵向延伸,当采用头插法时会容易出现逆序且环形链表死循环问题。但是在JDK1.8之后是因为加入了红黑树使用尾插法,能够避免出现逆序且链表死循环的问题。2.扩容后数据存储位置的计算方式也不一样:1. 在JDK1.7的时候是直接用hash值和需要扩容的二进制数进行&a...转载 2019-11-23 18:06:49 · 681 阅读 · 0 评论 -
jdk1.8之前hashMap头插法导致的get方法死循环
问题在并发的情况下hashMap除了会造成数据的脏读外在jdk1.8之前还会造成死锁原因主要原因是,使用头插法。但是在jdk1.8及之后时,使用的是数组+链表+红黑树的数据结构(当链表的深度达到8的时候,也就是默认阈值,就会自动扩容把链表转成红黑树的数据结构来把时间复杂度从O(n)变成O(logN)提高了效率),使用尾插法分析原因在jdk1.8之前使用的是数组+单链表的数据结构会先进行扩...原创 2019-11-23 17:46:32 · 3619 阅读 · 0 评论 -
顺序表、单链表、双链表、循环链表、有序表
顺序表在Java中线性表的顺序表的存储结构是利用数组来实现的,存储空间是连续的。存储空间的起始位置就是由数组名表示的地址常量。实例ArrayList也是用数组实现的,其内部维护了一个数组,是一种可变长度的数组。数组在创建时其存储空间就已经固定,为了解决这个问题,ArrayList会先创建一个数组,当向尾部添加元素时,会先检查数组长度是否够用,如果够用就把数据加到数组中,如果不够用会创建新的...原创 2019-11-22 20:00:06 · 1327 阅读 · 0 评论 -
hashMap储存键值对方式
可变对象:指创建后自身的哈希值可能被改变的对象。hashMap储存键值对方式插入HashMap用Key的哈希值来存储和查找键值对。当插入一个value时,HashMap会计算Key的哈希值然后把value和这个哈希值相关联。查找HashMap通过计算Key的哈希值查找相关联的value。问题如果key是一个可变对象那就会出现问题,比如以下代码public static void...原创 2019-11-20 21:25:02 · 2909 阅读 · 0 评论 -
Java线程转储和分析(jstack 命令)
代码下面代码将产生一个死锁。thread-1获取lockA后,等待lockB,thread-2获取lockB后,等待lockA。public class { private final static Lock lockA = new ReentrantLock(); private final static Lock lockB = new ReentrantLock()...原创 2019-11-16 17:47:15 · 2133 阅读 · 0 评论 -
Java创建对象的过程
在语言层面上,创建对象通常仅仅是一个new关键字而已,而在虚拟机中,对象的创建又是怎样一个过程呢?一、检测类是否被加载虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。二、为新生对象分配内存在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所...转载 2019-11-15 21:13:54 · 185 阅读 · 0 评论 -
wait、notify和notifyAll
代码static AtomicInteger number=new AtomicInteger(0); //生产者 public static class Producer implements Runnable { List<Integer> data; public Producer(List<Integer> dat...原创 2019-11-12 17:18:49 · 222 阅读 · 0 评论 -
线程的5种状态详解
概念1.初始状态(NEW):新创建了一个线程对象。2.可运行状态(RUNNABLE):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权 。3.运行状态(RUNNING):可运行状态(runnable)的线程获得了cpu 时间片(timeslice) ,执行程序代码。4.阻塞状态(BLOCK...转载 2019-11-12 15:25:47 · 4328 阅读 · 1 评论