自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 TCP 的三次握手和四次挥手

TCP(传输控制协议)是运输层的一个协议,提供面向连接的,可靠的数据传输服务。为了准确无误地把数据送达目标处,TCP协议采用了三次握手策略。TCP 三次握手漫画图解如下图所示,下面的两个机器人通过3次握手确定了对方能正确接收和发送消息(图片来源:《图解HTTP》)。简单示意图:客户端–发送带有 SYN 标志的数据包–一次握手–服务端服务端–发送带有 SYN/ACK 标志的数据包–二次握手–客户端客户端–发送带有带有 ACK 标志的数据包–三次握手–服务端为什么要三次握..

2020-07-08 10:44:48 243

原创 负载均衡

负载均衡(Load Balance)是集群技术(Cluster)的一种应用。负载均衡可以将工作任务分摊到多个处理单元,从而提高并发处理能力,如果有服务down掉,分担请求到其他服务,增加系统的健壮性。大家熟知的nginx可以实现负载均衡,除他之外,常用的SOA(面向服务的架构)框架Dubbo和Spring Cloud也有负载均衡策略,他们有什么不同呢,下面来看一下nginx实现负载均衡,是把请求拦到后台服务之前,根据配置的策略选择后台服务,再进行分发;轮询分派upstream loop{

2020-07-07 23:40:09 222

转载 Spring Cloud

首先我给大家看一张图,如果大家对这张图有些地方不太理解的话,我希望你们看完我这篇文章会恍然大悟。什么是Spring cloud构建分布式系统不需要复杂和容易出错。Spring Cloud 为最常见的分布式系统模式提供了一种简单且易于接受的编程模型,帮助开发人员构建有弹性的、可靠的、协调的应用程序。Spring Cloud 构建于 Spring Boot 之上,使得开发者很容易入手并快速应用于生产中。官方果然官方,介绍都这么有板有眼的。我所理解的Spring Cloud就是微服务系..

2020-07-05 20:48:12 175

原创 限流实现之窗口计数

该种实现方案采用注解的方式,可根据需要灵活配置,但是缺点也很明显,不能均匀限流,配置不当的话,短时间可能会有大量请求涌入后端,具体效果也在摸索中,发现不足请多交流,好了,废话少说,放码过来!环境:springboot redis<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId&

2020-07-04 21:59:50 275

转载 限流算法概述

限流的算法有哪些?简单介绍 4 种非常好理解并且容易实现的限流算法!固定窗口计数器算法规定我们单位时间处理的请求数量。比如我们规定我们的一个接口一分钟只能访问10次的话。使用固定窗口计数器算法的话可以这样实现:给定一个变量counter来记录处理的请求数量,当1分钟之内处理一个请求之后counter+1,1分钟之内的如果counter=100的话,后续的请求就会被全部拒绝。等到 1分钟结束后,将counter回归成0,重新开始计数(ps:只要过了一个周期就讲counter回归成0)。这种限流

2020-07-04 16:53:03 144

转载 分布式id生成方案

ID是数据的唯一标识,传统的做法是利用UUID和数据库的自增ID,在互联网企业中,大部分公司使用的都是Mysql,并且因为需要事务支持,所以通常会使用Innodb存储引擎,UUID太长以及无序,所以并不适合在Innodb中来作为主键,自增ID比较合适,但是随着公司的业务发展,数据量将越来越大,需要对数据进行分表,而分表后,每个表中的数据都会按自己的节奏进行自增,很有可能出现ID冲突。这时就需要一个单独的机制来负责生成唯一ID,生成出来的ID也可以叫做分布式ID,或全局ID。下面来分析各个生成分布式ID的机制

2020-07-04 16:43:23 118

转载 数据库索引(二)

什么是索引?索引是一种用于快速查询和检索数据的数据结构。常见的索引结构有: B树, B+树和Hash。索引的作用就相当于目录的作用。打个比方: 我们在查字典的时候,如果没有目录,那我们就只能一页一页的去找我们需要查的那个字,速度很慢。如果有目录了,我们只需要先去目录里查找字的位置,然后直接翻到那一页就行了。为什么要用索引?索引的优缺点分析索引的优点**可以大大加快 数据的检索速度(大大减少的检索的数据量), 这也是创建索引的最主要的原因。毕竟大部分系统的读请求总是大于写请求的。 ** 另

2020-07-04 00:22:38 239

转载 数据库索引(一)

为什么要使用索引?通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 可以大大加快 数据的检索速度(大大减少的检索的数据量), 这也是创建索引的最主要的原因。 帮助服务器避免排序和临时表。 将随机IO变为顺序IO 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。索引这么多优点,为什么不对表中的每一个列创建一个索引呢?当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。 索引需要占物理空间,除了数据表占数据空间之外,每一个

2020-07-04 00:21:04 202

原创 redis实现分布式锁

一、分布式锁简介锁是一种用来解决多个执行线程访问共享资源错误或数据不一致问题的工具。如果把一台服务器比作一个房子,那么线程就好比里面的住户,当他们想要共同访问一个共享资源,例如厕所的时候,如果厕所门上没有锁...更甚者厕所没装门...这是会出原则性的问题的..装上了锁,大家用起来就安心多了,本质也就是同一时间只允许一个住户使用。而随着互联网世界的发展,单体应用已经越来越无法满足复杂互联网的高并发需求,转而慢慢朝着分布式方向发展,慢慢进化成了更大一些的住户。所以同样,我们需要...

2020-07-03 23:44:47 378

转载 redis

简单介绍一下 Redis简单来说 Redis 就是一个 C 语言开发的数据库,不过与传统数据库不同的是 Redis 的数据是存在内存中的,所以读写速度非常快,因此 Redis 被广泛应用于缓存方向。另外,除了做缓存之外,Redis 也经常用来做分布式锁,甚至是消息队列。Redis 提供了多种数据类型来支持不同的业务场景。Redis 还支持事务 、持久化、Lua 脚本、多种集群方案。说一下 Redis 和 Memcached 的区别和共同点现在公司一般都是用 Redis 来实现缓存,而且.

2020-07-03 23:14:42 496

转载 消息队列

一 什么是消息队列  我们可以把消息队列比作是一个存放消息的容器,当我们需要使用消息的时候可以取出消息供自己使用。消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰、降低系统耦合性。目前使用较多的消息队列有ActiveMQ,RabbitMQ,Kafka,RocketMQ,我们后面会一一对比这些消息队列。  另外,我们知道队列 Queue 是一种先进先出的数据结构,所以消费消息时也是按照顺序来消费的。比如生产者发送消息1,2,3...对于消费者就会按照1,2,3..

2020-07-03 21:15:37 2881

转载 事务

事务隔离级别(图文详解)什么是事务?事务是逻辑上的一组操作,要么都执行,要么都不执行。事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败。事务的特性(ACID)原子性:事务是最小的执行单位,不允许分割。事务的原子性确保动.

2020-07-03 17:50:10 142

转载 mysql高性能优化规范

数据库命令规范所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用 MySQL 保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过 32 个字符 临时库表必须以 tmp_为前缀并以日期为后缀,备份表必须以 bak_为前缀并以日期 (时间戳) 为后缀 所有存储相同数据的列名和列类型必须一致(一般作为关联列,如果查询时关联列类型不一致会自动进行数据类型隐式转换,会造成列上的索引失效,导致查询效率降低)数据库基

2020-07-03 17:47:49 138

转载 mysql

什么是MySQL?MySQL 是一种关系型数据库,在Java企业级开发中非常常用,因为 MySQL 是开源免费的,并且方便扩展。阿里巴巴数据库系统也大量用到了 MySQL,因此它的稳定性是有保障的。MySQL是开放源代码的,因此任何人都可以在 GPL(General Public License) 的许可下下载并根据个性化的需要对其进行修改。MySQL的默认端口号是3306。存储引擎MyISAM和InnoDB区别MyISAM是MySQL的默认数据库引擎(5.5版之前)。虽然性能极佳,而且提供

2020-07-03 17:43:41 265

原创 Mybatis

MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射

2020-07-03 15:25:45 152

原创 网络

OSI与TCP/IP各层的结构与功能,都有哪些协议?学习计算机网络时我们一般采用折中的办法,也就是中和 OSI 和 TCP/IP 的优点,采用一种只有五层协议的体系结构,这样既简洁又能将概念阐述清楚。结合互联网的情况,自上而下地,非常简要的介绍一下各层的作用。1.1 应用层应用层(application-layer)的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通信和交互的规则。对于不同的网络应用需要不同的应用层协议。在互联网

2020-07-03 14:55:09 217

原创 Dubbo

1.1 什么是 Dubbo?Apache Dubbo (incubating) |ˈdʌbəʊ| 是一款高性能、轻量级的开源Java RPC 框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。简单来说 Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。Dubbo 目前已经有接近 23k 的 Star ,Dubbo的Github 地址:https://github.com/apache/incuba

2020-07-03 13:54:18 113

原创 Spring Boot

SpringBoot介绍1.1 先从Spring谈起我们知道Spring是重量级企业开发框架Enterprise JavaBean(EJB)的替代品,Spring为企业级Java开发提供了一种相对简单的方法,通过依赖注入和面向切面编程,用简单的Java对象(Plain Old Java Object,POJO)实现了EJB的功能虽然Spring的组件代码是轻量级的,但它的配置却是重量级的(需要大量XML配置)。Spring 2.5引入了基于注解的组件扫描,这消除了大量针对应用程...

2020-07-03 11:27:05 220

转载 Spring事务管理之实现事务的几种方式

1、事务认识大家所了解的事务Transaction,它是一些列严密操作动作,要么都操作完成,要么都回滚撤销。Spring事务管理基于底层数据库本身的事务处理机制。数据库事务的基础,是掌握Spring事务管理的基础。这篇总结下Spring事务。事务具备ACID四种特性,ACID是Atomic(原子性)、Consistency(一致性)、Isolation(隔离性)和Durability(持久性)的英文缩写。(1)原子性(Atomicity)事务最基本的操作单元,要么全部成功,要么全部失败,不会结束在中

2020-07-01 23:54:40 258

原创 事务

一 数据库事务的隔离级别数据库事务的隔离级别有4个,由低到高依次为Read uncommitted、Read committed、Repeatable read、Serializable,这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。1. Read UnCommitted(读未提交)最低的隔离级别。一个事务可以读取另一个事务并未提交的更新结果。2. Read Committed(读提交)大部分数据库采用的默认隔离级别。一个事务的更新操作结果只有在该事务提交之后...

2020-07-01 23:51:06 102

原创 Spring事务管理下synchronized锁失效问题

最近看到一个技术技术问题:synchronized锁问题?开启10000个线程,每个线程给员工表的money字段【初始值是0】加1,没有使用悲观锁和乐观锁,但是在业务层方法上加了synchronized关键字,问题是代码执行完毕后数据库中的money 字段不是10000,而是小于10000 问题出在哪里?Service层代码:SQL代码(没有加悲观/乐观锁):用1000个线程跑代码:简单来说:多线程跑一个使用synchronized关键字修饰的方法,方法内操...

2020-07-01 23:30:09 3018 3

原创 Spring MVC

谈到Spring MVC,我们不得不提提之前 Model1 和 Model2 这两个没有 Spring MVC 的时代。Model1 时代: 很多学 Java 后端比较晚的朋友可能并没有接触过 Model1 模式下的 JavaWeb 应用开发。在 Model1 模式下,整个 Web 应用几乎全部用 JSP 页面组成,只用少量的 JavaBean 来处理数据库连接、访问等操作。这个模式下 JSP 即是控制层又是表现层。显而易见,这种模式存在很多问题。比如①将控制逻辑和表现逻辑混杂在一起,导致代码重用率极.

2020-07-01 23:13:36 117

原创 spring

对于有一定编码年限的程序员来说,spring框架这个名字叫的名副其实,他把大家从繁琐的编程流程和管理控制中解放出来,使大家有更多的精力专注于业务,真算的上是程序员的春天。

2020-07-01 22:58:36 91

转载 适配器模式

适配器就是一种适配中间件,它存在于不匹配的二者之间,用于连接二者,将不匹配变得匹配,简单点理解就是平常所见的转接头,转换器之类的存在。  适配器模式有两种:类适配器、对象适配器、接口适配器  前二者在实现上有些许区别,作用一样,第三个接口适配器差别较大。1、类适配器模式:  原理:通过继承来实现适配器功能。  当我们要访问的接口A中没有我们想要的方法 ,却在另一个接口B中发现了合适的方法,我们又不能改变访问接口A,在这种情况下,我们可以定义一个适配器p来进行中转,这个适配器p要实现我们访

2020-07-01 21:23:03 72

原创 ConcurrentHashMap实现原理

map是大家日常coding最常用的容器之一,但是大家熟知的hashMap是线程不安全,所以在多线程情况下,需要一个安全的并发容器,大家首选的肯定是ConcurrentHashMap,但是他的原理到底是怎么实现的,下面简单看一下源码,因为jdk1.7和1.8的实现不一样,所以分开分析1. ConcurrentHashMap 1.71. 存储结构Java 7 中 ConcurrentHashMap 的存储结构如上图,ConcurrnetHashMap 由很多个 Segment 组合,而每一个

2020-06-29 14:28:39 2485

原创 HashMap浅谈

HashMap 简介HashMap 主要用来存放键值对,它基于哈希表的Map接口实现,是常用的Java集合之一。JDK1.8 之前 HashMap 由 数组+链表 组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突).JDK1.8 以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)时,将链表转化为红黑树(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树),以减少搜索时间,具体可以参考

2020-06-27 22:46:59 105

原创 ArrayList和LinkedList的区别

ArrayList和LinkedList的大致区别如下:ArrayList是实现了基于动态数组的数据结构,LinkedList是基于链表结构。 对于随机访问的get和set方法,ArrayList要优于LinkedList,因为LinkedList要移动指针。 对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。因为数组在存储数据时是按顺序存储的,存储数据的内存也是连续的,所以他的特点就是寻址读取数据比较容易,插入和删除比较困难。举个例子:一个

2020-06-27 22:00:07 170

原创 static 关键字

static 关键字主要有以下四种使用场景:修饰成员变量和成员方法:被 static 修饰的成员属于类,不属于单个这个类的某个对象,被类中所有对象共享,可以并且建议通过类名调用。被static 声明的成员变量属于静态成员变量,静态变量 存放在 Java 内存区域的方法区。调用格式:类名.静态变量名类名.静态方法名() 静态代码块:静态代码块定义在类中方法外, 静态代码块在非静态代码块之前执行(静态代码块—>非静态代码块—>构造方法)。 该类不管创建多少对象,静态代码块只执行一次. ...

2020-06-27 16:47:49 86

原创 final 关键字

final关键字,意思是最终的、不可修改的,最见不得变化 ,用来修饰类、方法和变量,具有以下特点: final修饰的类不能被继承,final类中的所有成员方法都会被隐式的指定为final方法; final修饰的方法不能被重写; final修饰的变量是常量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能让其指向另一个对象。 说明:使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个

2020-06-27 16:43:30 123

原创 线程池

为什么要用线程池?线程池提供了一种限制和管理资源(包括执行一个任务)。 每个线程池还维护一些基本统计信息,例如已完成任务的数量。这里借用《Java 并发编程的艺术》提到的来说一下使用线程池的好处:我们以**AbstractExecutorService**接口中的一个submit方法为例子来看看源代码: public Future<?> submit(Runnable task) { if (task == null) throw new Nul...

2020-06-24 16:57:59 132

原创 volatile关键字

首先看一下Java内存模型在 JDK1.2 之前,Java的内存模型实现总是从主存(即共享内存)读取变量,是不需要进行特别的注意的。而在当前的 Java 内存模型下,线程可以把变量保存本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写。这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值的拷贝,造成数据的不一致。要解决这个问题,就需要把变量声明为volatile,这就指示 JVM,这个变量是不稳定的,每次使用它都到主存中进行读取。说白了,vo.

2020-06-24 15:27:32 103

原创 synchronized 关键字

synchronized 关键字底层原理属于 JVM 层面,下面来简单看一下他的工作原理① synchronized 同步语句块的情况public class SynchronizedDemo { public void method() { synchronized (this) { System.out.println("synchronized 代码块"); } }}通过 JDK 自带的 javap 命令查看 SynchronizedDemo 类的相关字节码信息:首

2020-06-24 15:24:25 123

原创 单例模式

所谓单例,就是整个程序有且仅有一个实例。该类负责创建自己的对象,同时确保只有一个对象被创建。在Java,一般常用在工具类的实现或创建对象需要消耗资源。特点类构造器私有 持有自己类型的属性 对外提供获取实例的静态方法 懒汉式顾名思义,我比较懒,用了再给你,也就是延迟初始化,但是此写法线程不安全,严格意义上不是单例模式public class Singleton { private static Singleton instance; private Single.

2020-06-24 14:44:38 85

原创 java内存区域详解

基本问题:介绍下 Java 内存区域(运行时数据区) Java 对象的创建过程(五步,建议能默写出来并且要知道每一步虚拟机做了什么) 对象的访问定位的两种方式(句柄和直接指针两种方式)拓展问题:String类和常量池 8种基本类型的包装类和常量池1 概述对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像C/C++程序开发程序员这样为内一个 new 操作去写对应的 delete/free 操作,不容易出现内存泄漏和内存溢出问题。正是因为 Java 程序员把内存控制权利交给

2020-06-23 15:15:17 93

原创 BIO,NIO,AIO 有什么区别?

BIO (Blocking I/O):同步阻塞 I/O 模式,数据的读取写入必须阻塞在一个线程内等待其完成。在活动连接数不是特别高(小于单机 1000)的情况下,这种模型是比较不错的,可以让每一个连接专注于自己的 I/O 并且编程模型简单,也不用过多考虑系统的过载、限流等问题。线程池本身就是一个天然的漏斗,可以缓冲一些系统处理不了的连接或请求。但是,当面对十万甚至百万级连接的时候,传统的 BIO 模型是无能为力的。因此,我们需要一种更高效的 I/O 处理模型来应对更高的并发量。 NIO (Non-blo.

2020-06-17 14:19:07 118

原创 线程有哪些基本状态?

先来简述一下线程、程序、进程的基本概念。以及他们之间关系是什么?线程与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。程序是含有指令和数据的文件,被存储在磁盘或其他的数据存储设备中,也就是说程序是静态的代码。进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行

2020-06-17 14:12:16 787

原创 String、StringBuffer 和 StringBuilder 的区别是什么? String 为什么是不可变的?

简单的来说:String类中使用 final 关键字修饰字符数组来保存字符串,private final char value[],所以String对象是不可变的。补充:在 Java 9 之后,String 类的实现改用 byte 数组存储字符串private final byte[] value;而StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字...

2020-06-16 16:52:48 169

原创 java为什么重写 equals 时必须重写 hashCode 方法

不知道大家在面试的时候,有没有被面试官问过:“重写 equals 时必须重写 hashCode 方法吗?”这个问题的答案是肯定的,重写 equals 时必须重写 hashCode 方法!!!什么是hashCodehashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个 int 整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在 JDK 的 Object.java 中,这就意味着 Java 中的任何类都包含有 hashCode() 函数。散列

2020-06-16 16:47:05 180

原创 java中 == 与 equals的区别

==: 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)。equals(): 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:情况 1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。 情况 2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来比较两个对象的内容是否相等;若它们的内容相等,则返回 tr..

2020-06-16 16:34:29 96

原创 Object 类的常见方法总结

Object 类是一个特殊的类,是所有类的父类。它主要提供了以下 11 个方法:public final native Class<?> getClass()//native方法,用于返回当前运行时对象的Class对象,使用了final关键字修饰,故不允许子类重写。public native int hashCode() //native方法,用于返回对象的哈希码,主要使用在哈希表中,比如JDK中的HashMap。public boolean equals(Object obj)//

2020-06-16 16:28:11 243

空空如也

空空如也

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

TA关注的人

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