自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 聊一聊Redis的Sentinel与Cluster

文章目录哨兵模式什么是哨兵模式?哨兵模式的小细节哨兵是如何去监控这些节点的哨兵模式的下线模式哨兵模式的选举消息丢失Cluster模式什么是cluster模式?cluster模式的缺点cluster的启动流程Gossip协议Gossip协议的消息集群的伸缩Client是如何操作Cluster的Sentinel与Cluster的比较参考文献哨兵模式什么是哨兵模式?它是Redis的一种高可用架构,遵循CAP原则中的CP原则。我们在这里其实就可以把它看作为一个Zookeeper的集群,一般由3个以上的节点组成

2020-05-29 01:13:20 1346 1

原创 小白对Raft的理解

小白对Raft的理解1. Raft简介1.1 Raft的前世今生Raft算法它实际上是一种共识算法,脱胎于Paxos算法。因为Paxos算法不好理解,而且实现起来非常复杂,所以Raft算法就此诞生。1.2 Raft应用场景Raft在工程领域的应用特别多,比如Redis的哨兵选举机制、InfluxDB的leader选举、Dragonboat、腾讯云的消息队列CMQ等等。经常被用作CP原则的一致性算法。2.Raft基础2.1 Raft中的名词概念在一个Raft集群中,它有n个服务器构成,其

2020-05-23 14:28:20 1088 2

原创 初始class文件

class文件class文件的构成一个class文件主要分为十个部分。MagicNumber 魔数,它是用来标志一个class文件的,是class文件的第一部分,共4个字节,固定为0xCAFEBABE,虚拟机加载的时候就会先去加载这4个字节,当发现class文件的前面4个字节不是0xCAFEBABE的时候就会拒绝加载这个class文件。Version 版本号,它由两部分组成。Ma...

2019-09-16 14:51:34 242

原创 用Java去执行Linux命令,或者在Linux中运行脚本

背景前一段时间项目需要在程序里面使用shell命令,就比较纠结,问我导师,导师给我说你可以去百度一下,Java是可以执行shell命令的。听到这个消息我就有点懵了,Java还可以执行Shell命令,有点强大啊!后来在网上搜了一些博文,看了看,还真的是可以的。代码public static String execShell(String shell) { StringBuild...

2019-07-14 16:20:45 786

原创 多model的情况下Consider defining a bean of type错误排查

今天遇到一个问题,就是在多Model的SpringBoot项目里,明明已经加了@Service注解,但是在启动的时候还是无法启动,报出下面的错误Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.2019-07-13 ...

2019-07-13 18:51:10 1663 1

原创 什么是面向对象

我们经常说Java是一门面向对象语言,那么什么是对象?我jio得吧,对象就是现实中各种事物在计算机语言中的映射,相比以往的面向过程语言来说,面向对象它关注的是事物,然后基于这些事物的问题去产生一个新类型的对象。也就是说面向对象它关注的是问题本身,而不是问题的具体解决步骤。它就是将一个事务抽象成计算机中的一种特殊的变量,具有自己的属性,而这些属性就分为动态和静态,动态的就是方法。例如:跑、跳。而...

2019-06-28 15:35:08 469

原创 Java 读取大文件CSV,然后将数据存入redis中

前些天,项目需要用到从csv文件中读取数据,然后将数据存入redis中。我看了一下csv文件的大小,1G多。这个虽然算不上大文件,但是考虑到以后如果数据量增加可能到2G、3G、甚至更大,所以就不打算用普通读取文件的方式去读取这个文件。因为普通读取文件是将文件全部加载进内存,然后再内存中读取。这种情况下,文件比较小那还好说,如果文件大了,就会占用大量的内存。出于这样的考虑,我决定用读取大文件的方...

2019-06-15 12:45:29 5238

原创 Java new一个对象的具体过程

我们在Java中,new一个对象看似很简单。只需要new一下就可以了,但是你知道在JVM中,它是如何实现的吗?Object obj=new Object();当JVM遇到了一个new的指令的时候,它会执行两步操作,第一步是先进行类加载机制,第二步是去给对象分配内存。类加载机制包括   加载、验证、准备、解析、初始化等操作,但是它并不是严格按照这个程序来开始的。具体的介绍请看我以前写的...

2019-02-25 15:45:53 1899

原创 五种网络IO模型

网络IO模型总共有5种,分别是:阻塞IO、非阻塞IO、多路复用IO、信号驱动IO、异步IO前四个都是同步IO,在内核数据copy到用户程序时都是阻塞的,而第五个则是异步的。对网络IO来说,它会涉及两个部分,一个是用户空间、一个是内核。当用户程序给内核发送请求,表示需要一些数据的时候,内核就会开始准备,里面的数据需要互相copy,不能直接拿来就用。目录阻塞IO非阻塞IO...

2019-02-08 01:38:34 842

原创 PageHelper不生效的原因

PageHelper是一个比较简单的分页插件,但是好些人在用的时候却无法生效了。遇到这种情况不要方,首先先看看自己的配置,我这里用的是注解配置import com.github.pagehelper.PageHelper;import org.springframework.context.annotation.Bean;import org.springframework.cont...

2019-01-14 17:11:54 9369 3

原创 MySQL中的锁

根据加锁的范围,MySQL里面的锁可分为全局锁、表锁、行锁这三类。 目录全局锁表级锁表锁MDL行锁两阶段锁死锁全局锁它是对整个数据库的实例进行加锁。如果你想去加一个全局读锁可以通过:Flush tables with read lock;(也就是我们常说的FTWRL)这条语句进行加锁,它可以让我们的数据库处于一种只读状态,当有其他线程对这个数据库实例进行...

2019-01-04 13:00:52 471

原创 MySQL的索引(一)

目录 概念哈希表有序数组搜索树InnoDB的索引模型概念索引的出现就是为了提高数据查询效率,就像字典里的目录一样。当我们需要查找某个字或者某个单词的时候肯定会先进入目录页,查找相应的页数,这就是索引。索引模型有很多种,主要的就是这三种:哈希表、有序数组、搜索树。哈希表它是一种key-value型的数据结构,我们只要输入要查找的key值就可以找到与它对应的...

2019-01-02 00:18:36 368

原创 ElasticSearch外网访问遇到的坑

Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c5330000, 986513408, 0) failed; error='Cannot allocate memory' (errno=12)            #            # There is insufficien...

2019-01-01 21:43:01 3089 2

原创 Nginx学习第一天

目录 Nginx的优缺点Nginx的组成部分Nginx的配置语法Nginx的命令热部署Nginx的优缺点Nginx主要有5个优点高并发,高性能:从数据上看32核64G的服务器可以轻松达到数千万的并发链接 可扩展性好:模块化设计稳定,导致第三方模块生态圈非常的丰富 高可靠性:可以持续不间断的在Web服务器上运行数年, 热部署:在不停止服务的情况下,升级Ngi...

2018-12-29 21:54:20 324

原创 浏览器输入一个网址后执行的过程

当我们在浏览器里输入一个网址后它的底层大概是这样的我们把网络包当成一块buffer客户端浏览器会通过DNS解析出网址的IP地址通过这个IP地址找到客户端到服务器的路径,然后向服务器发送一个请求加上HTTP头,发出一个HTTP请求,buffer再给TCP层,在TCP加上了TCP头,里面含有目标端口buffer再给三层,然后加上IP头,里面含有目标地址buffer再给二...

2018-12-28 21:50:10 798

原创 MySQL中update语句的执行流程

前面介绍了MySQL的底层机制与它的日志模块MySQL的底层机制MySQL的日志模块而update语句的执行就得需要去用到MySQL的日志模块。update user set user_name="XXX" where Id=1当你执行这条命令的时候,执行器首先会让InnoDB去查找到这一行,看这一行的数据页有没有在内存中,如果有就直接返回,如果没有就在磁盘中找,再读入到内存...

2018-12-28 14:45:42 6994 1

原创 MySQL的日志模块

MySQL的持久化能力非常强大,它可以恢复到两周内任意一秒的状态。像查询所需要执行的一套流程,更新也会再执行一次。如果不知道,可以看这里.MySQL的底层机制但是更新操作会牵扯到日志模块,这里的日志是redo log与bin log。也就是我们常说的重做日志和归档日志。目录redo logbin logredo log在MySQL里,如果每一次更新操作都要先查询再更新,...

2018-12-28 14:10:30 726

原创 MySQL的底层机制

MySQL大致可以分为Service层和引擎层。目录Service层连接器查询缓存分析器优化器执行器存储引擎层Service层它包括连接器、查询缓存、分析器、优化器、执行器。它涵盖了MySQL的大多数核心服务功能和所有的内置函数,所有跨存储引擎的功能都在这里实现。连接器负责跟客户端建立连接、获取权限、维持或者管理连接。当我们连接到这个数据库的时,我们...

2018-12-28 00:41:15 1106

原创 时间复杂度的计算

Big O notation常见的复杂度O(1):常数复杂度,这是常数级的运算,不管是O(1)、O(2)、O(3)都为O(1)public class Test { public static void main(String[] args) { int n=100; System.out.println("n="+n); }}O...

2018-12-25 11:45:32 265

原创 锁优化

目录自旋锁自适应自旋锁锁消除锁粗化锁升级自旋锁 因为线程的阻塞到唤醒需要CPU从用户态转为内核态,这样所需要的资源是比较大的,如果频繁的去阻塞和唤醒这对CPU是一件压力很大的事情,并且有时候会发现对象锁的状态只会持续一段时间,为了这段比较短的时间去让CPU从用户态转化为内核态是一件得不偿失的事情。所以基于这个就出现了自旋锁。 那么,什么是自旋锁呢?...

2018-12-06 13:59:42 568

原创 Java中线程有几种状态

在线程的生命周期里,线程总共有6种状态,这是Java5之后在公共内部枚举类Thread.State里面声明的。他们分别是NEW:新建,表示的是线程被创建出来但还未被投入使用。RUNNABLE:就绪,这个线程已经在JVM里被执行,有可能是正在运行也有可能是等待CPU分配资源进入了就绪队列BLOCKED:阻塞,线程在等待Monitor。当这个线程想要调用一个已经被另一个线程获取了synch...

2018-12-01 13:18:15 371

原创 JVM的类加载机制

从class文件变成内存中的类按先后顺序需要经过加载、链接以及初始化这三大步骤。目录加载链接初始化加载查找字节流,并且根据字节流创建类的过程。JVM是借助类加载器来完成查找字节流的过程,用定制木质家具来比较的话,你首先需要给木匠说一下房型,这里的家具就是类,木匠就是类加载器。每一个木匠都有同一个祖宗“鲁班”,也就是说每一个类加载器都有同一个类加载器叫做启动类加载器,它是用C...

2018-11-23 01:16:45 435

原创 synchronized与ReentrantLock的区别

synchronized是Java原语,提供了互斥的语义和可见性,当一个线程已经获取了当前的锁时,其他试图获取锁的线程就只能等待或者阻塞。ReentrantLock是实现了Lock接口,是一个互斥的同步器。当一个线程试图获取一个它已经获取的锁时,这个获取动作自动成功。在基本用法上,synchronized与ReentrantLock很是类似,都是可重入锁,不过ReentrantLock是A...

2018-11-20 14:31:06 484 1

原创 HashTable与ConcurrentHashMap的区别

HashTable比ConcurrentHashMap低效,它的实现基本就是给put、get、size等方法加了synchronized,所以并发操作的时候就需要去竞争一把锁,一个线程进行同步操作时,其它线程只能等待。一般不适用于高并发情况下。ConcurrentHashMap分为JDK1.8之前与JDK1.8之后,早期的ConcurrentHashMap 实现基于分离锁与volatile...

2018-11-20 00:55:50 344

原创 阻塞与非阻塞,同步与异步

Java的IO有三种:IO、NIO、AIO第一种是Java刚开始就出现的IO即BIO(同步阻塞IO),我们一般常说的IO就是这种IO,这种IO相对来说比较简单,基于流模型,提供一种IO操作。交互方式是同步、阻塞,调用的顺序是线性顺序,这种IO有一个好处就是,代码简单,但是缺点就是IO的效率较低、扩展性不好。在Java1.4后,出现了NIO(同步非阻塞IO),提供了Channel、Buffe...

2018-11-20 00:49:34 231

原创 浅析Java线程池

在Java里,线程池的运用场景很多,几乎所有需要异步或者并发执行任务的程序都可以使用线程池。目录线程池的好处线程池的工作流程线程池的组成元素向线程池提交任务关闭线程池Java自带的四种线程池线程池的好处 降低资源消耗。通过重复利用已创建的线程降低了创建线程和销毁线程的资源消耗 提高了响应速度。当有任务时,任务可以不用等线程的创建就可以执行 提高...

2018-11-20 00:44:30 243

原创 浅析final关键字

final可以用来修饰类、方法、变量,分别有不同的意义。修饰类:这个类不能被继承,所有的方法不能被重写,但是里面的成员变量并不是不可变得,如果需要让它们不可变则需要用final去修饰变量。修饰方法:不可以被重写,但是子类可以去使用这个方法。修饰变量:不可修改,可以用于保护只读数据,尤其是在并发中,有利于减少额外的同步开销,也可以省去一些防御性的拷贝。final指的是引用不可变性,也...

2018-11-06 15:44:11 327

原创 双重校验锁 为啥要用volatile修饰

public class Single { private static volatile Single single; public static Single getSingle(){ if (single==null){ synchronized (Single.class){ if (single==...

2018-11-06 15:41:39 1009

原创 浅解volatile

volatile是Java的关键字,可以被理解为轻量级的synchronized,在多线程并发中可以保证共享变量的可见性,每当有线程修改这个共享变量的时候,对其他的线程就是可见的。一般被volatile修饰的共享变量会认为这个变量是易变得。它有三个特性:可见性、有序性、原子性。可见性:对一个volatile的读,总能看到任意线程对这个volatile写的最后的写入原子性:对任意单个vo...

2018-11-01 11:18:58 229

原创 HashTable、HashMap、TreeMap的区别

 Map是集合框架的一部分(另一部分是Collection),以键值对的形式存储和操作数据的数据容器。HashTable是Java早期基于Hash表的实现的类,本身就是同步,不论是key还是value都不支持null值,而且因为同步开销太大,现在基本不用这个容器了。 HashMap是也是基于Hash表实现的类,与HashTable的主要区别在于HashTable是线程安全的,而Has...

2018-10-16 01:43:28 307

原创 Vector、ArrayList、LinkedList的区别

  Vector、ArrayList、LinkedList实现的都是List,即有序集合。Vector,是Java早期的线程安全的动态数组。默认创建大小为10的Object数组,将capacityIncrement设置为0,在插入的时候,如果数组大小不够,当capacityIncrement>0的时候,会将数组扩大到size+capacityIncrement。当capa...

2018-10-15 23:27:00 226

原创 多态的底层原因

目录静态分派动态分派动态分配的实现多态的底层就是分派,分派分为静态分派(重载)与动态分派(重写)。静态分派发生在编译时期,因此静态分派的动作实际上不是由虚拟机来执行的,只能通过语言上的规则去理解和推断哪个是更加合适的版本,自动转型: char->int->long->float->double的顺序转型时进行匹配,但不会匹配到byte和short类型...

2018-10-15 23:23:25 382

原创 int与Integer的区别

int是Java的八个基本类型之一,基本类型都有:byte,char,short,int,float,double,boolean,long.Integer是int的包装类,它有一个int类型的字段存储数据,并且提供了基本操作。而且Integer里有缓存区间[-128-127];自动拆装箱其实是一种语法糖,语法糖是JVM的一个小手段,它可以提高效率。它发生在编译器,在编译为字节码的时候,如...

2018-09-29 01:00:51 293

原创 final、finally、finalize的区别

final可以用来修饰类、方法、变量,分别有不同的意义。修饰类:这个类不能被继承,所有的方法不能被重写,但是里面的成员变量并不是不可变得,如果需要让它们不可变则需要用final去修饰变量。修饰方法:不可以被重写,但是子类可以去使用这个方法。修饰变量:不可修改,可以用于保护只读数据,尤其是在并发中,有利于减少额外的同步开销,也可以省去一些防御性的拷贝。final指的是引用不可变性,也...

2018-09-26 00:26:35 254

原创 JVM的分代年龄为什么是15

在一次面试中,被问到JVM的分代年龄问题,最后面试官问了一句,为什么它的分代年龄是15,而不是17或者16?当时有些太想当然,觉得这个和HashMap的负载因子是0.75类似,就答得是多次试验后得出来的一个平衡的数字。后来面试就凉凉了,接着回去查了一下资料,原来原因是在MarkWord里。这就是一个MarkWord,其中对象的分代年龄占4位,也就是0000,最大值为1111也就是最大为15...

2018-09-23 15:09:34 3786 8

原创 String、StringBuffer、StringBuilder的区别

String被声明为final class,所有属性为final的,因为是被final修饰保证了基础线程安全,因为你没办法对里面的数据结构进行改变,在并发情况下一个对象被多次访问,可以省略同步时间和锁的等待时间可以大幅度的提高性能。也是因为不变,所以每次裁剪、拼接字符串等操作都会产生新的String对象。StringBuffer是为了减少拼接或裁减中产生的太多中间对象而提供了一个类,可以用ap...

2018-07-21 00:32:39 309

空空如也

空空如也

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

TA关注的人

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