自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Redis哨兵环境搭建与详细分析

什么是Redis哨兵?Sentinel(哨兵)是Redis的高可用性解决方案:由一个或者多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及这些主服务器下的所有从服务器。Sentinel使用流言协议(gossip protocols)来接收关于主服务器是否下线的信息, 并使用投票协议(agreement protocols)来决定是否执行自动故障迁移, 以及选择哪个从服务器作为新的主服务器。哨兵的任务监控(Monitoring): Sentinel 会不断地检查你的主服务

2020-11-27 21:49:59 438

原创 JVM堆内存分配优化

准备一个小案例,提供一个接口,每次调用都会生成1个1M的对象,然后方法返回,对象由垃圾收集器自动回收。import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class GCController { @RequestMapping("/gcTest")

2020-11-26 15:26:02 262

原创 JVM对象TLAB分配、栈上分配性能测试

-XX:-DoEscapeAnalysis -XX:-EliminateAllocations -XX:-UseTLAB -Xlog:c5_gc*public class TestTLAB { //User u; class User { int id; String name; public User(int id, String name) { this.id = id; this.nam

2020-11-26 10:45:02 280

原创 InnoDB共享、排他、意向、间隙锁机制

MySQL中的锁MySQL中不同的存储引擎支持不同的锁机制。比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking),InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。InnoDB锁本文主要探讨InnoDB存储引擎中的锁机制,大致分文如下几种锁类型:共享锁和排它锁(Shared and Exclusive Locks)意向锁(Intention Locks)记录锁(Record Locks)

2020-11-25 17:55:49 250

原创 Spring中ApplicationListener监听器设计解析

在设计模式中,观察者模式中主要由观察者和主题事件这两个角色组成,而Spring中的监听器设计相对设计模式中的观察者模式来说更加抽象,主要多出了一些额外的角色,目的是为了能够更好的让观察者和事件解耦,一起来学习一下吧!设计模式中的观察者模式 V.S Spring监听器设计模式中的观察者模式角色:抽象主题(Subject):它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。 抽象主题提供一个接口,可以增加和删除观察者对象。具体主题(Concrete Subject):

2020-11-24 17:05:05 626 1

原创 【设计模式实践系列】观察者模式

观察者模式观察者模式属于行为模式,一个目标物件管理所有依赖于它的观察者物件,并且在它本身的状态改变时主动发出通知,它定义了对象之间的一种一对多的依赖关系。在观察者模式中,主题是通知的发布者,它发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅并接收通知。意图: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。主要解决: 一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。何时使用: 一个对象(目标对象

2020-11-24 10:43:13 203 2

原创 深入分析Redis主从复制原理

Redis主从环境详细搭建过程,之前在这篇文章中已经搭建好主从复制的环境了,搭建起来非常简单,接下来就要搞清楚主从复制的原理了。主从复制的机制当一个 master 实例和一个 slave 实例连接正常时, master 会发送一连串的命令流来保持对 slave 的更新,以便于将自身数据集的改变复制给 slave :包括客户端的写入、key 的过期或被逐出等等。当 master 和 slave 之间的连接断开之后,因为网络问题、或者是主从意识到连接超时, slave 重新连接上 master

2020-11-23 20:30:05 631 1

原创 Redis主从环境详细搭建过程

首先准备两个搭建好的Redis环境,一主一从,Redis快速搭建可以参考linux下redis安装和开机自动启动,这篇文章中演示了初始搭建。现在根据上述准备好的环境中,cd到/opt/redis-5.0.9/utils目录再次执行./install_server.sh,输入6380端口,即可快速完成一套新的redis服务端搭建。现在两台redis服务端已经准备好主:192.168.70.113 6379从:192.168.70.113 6380正常情况下主从应该分别部署在两台不同的主机上,本文由

2020-11-23 11:18:26 294 1

原创 JVM缓存行对齐性能优化

缓存行缓存是由多个缓存行组成的,以缓存行为基本单位,一个缓存行的大小一般为64字节。伪共享因为缓存行存在,当不同的线程在操作两份不同的数据时,如果这两份数据刚好位于同一个缓存行中,那么彼此之间就会互相影响。假设A线程操作数据C,B线程操作数据D,C、D数据位于同一缓存行,那么当C数据发生修改时,由于缓存一致性协议的规定,就会造成缓存行失效,那么当B线程操作D数据时,就必须重新加载缓存,尽管B线程之前并没有对D进行过任何操作,同理B线程的操作同样会影响着A线程。缓存行对齐所以为了解决伪共享的问题,

2020-11-22 22:24:38 289

原创 深入理解什么是Java双亲委派模型

Java中的类加载器1、启动类加载器 (Bootstrap Class Loader)这个类加载器主要负责加载存放在<JAVA_HOME>\lib目录下的类库。public class TEST_CL{ public static void main(String[] args) { System.out.println(String.class.getClassLoader()); }}输出结果为null,则表示由Bootstrap类加载器加载。2

2020-11-20 15:09:45 483 1

原创 SpringCloud全家桶---断路器Hystrix

Hystrix主要功能1、熔断(自动开启、关闭)2、服务隔离(线程池、信号量)3、降级4、限流Hystrix可以避免在微服务中由一个或几个服务产生的问题,引发所有微服务出问题的雪崩效应,熔断可以实现快速失败,避免再去消耗额外的资源,假设某个服务5秒内,10次请求全都失败,那么就可以认为这个服务出了问题,一定时间内就没有必要再去请求他,可以直接快速失败,当然一定时间后可以再尝试调用一次这个服务看看是否已经恢复了。Hystrix基本搭建引入jar包 <dependency>

2020-11-20 13:23:48 171

原创 链表算法面试题---用链表实现队列和栈

队列和栈的概念队列:先进先出,从头进,从尾出。栈:先进后出,从头进,从头出。所以现在要做的就是用链表来实现:从头进,从头出,从尾进,从尾出这4种方法,即可组合出队列和栈的数据结构。假设以此插入1、2、3、4、5。1、从头进2、从尾进3、从头出,假设出2个元素4、从尾出,再出两个元素代码实现public class Code_02 { //双向链表 static class Node<T> { public T data;

2020-11-20 10:18:30 173

原创 Linux安装MySQL5.7详细步骤

1、查看linux环境中是否自带了mysqlyum list installed | grep mysql2、删除自带的mysqlyum -y remove mysql-libs.x86_643、给CentOS添加rpm源。wget dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm4、安装下载好的rpm文件yum install mysql-community-release-el6-5.noarch.rpm -y5

2020-11-19 13:09:00 1079

原创 链表算法面试题---删除链表节点

给定链表头节点,删除链表中所有含指定值的的节点。class Node { public Node next; public int value; public Node(int data) { value = data; }} public static Node removeNode(Node head, int value) { //先从头部节点开始找,找到值不为value的节点,跳出循环 while (head

2020-11-16 18:00:53 129

原创 链表算法面试题---反转链表

实现单链表和双链表反转单链表class Node { public Node next; public int value; public Node(int data) { value = data; }}双链表class DoubleNode{ public DoubleNode preNode; public DoubleNode nextNode; public int value; public Doub

2020-11-16 17:12:23 109

原创 SpringCloud全家桶---OpenFeign

1、SpringCloud全家桶—注册中心Eureka搭建2、SpringCloud全家桶—注册中心Eureka高可用环境搭建3、SpringCloud全家桶—客户端负载均衡Ribbon4、SpringCloud全家桶—OpenFeignOpenFeignOpenFeign是一种声明式、模板化的HTTP请求,相比前面我们使用RestTemplate的方式,OpenFeign能够更加的便捷、优雅的完成微服务之间的HTTP调用。OpenFeign的使用也非常简单,通过注解的方式即可完成,使调用者感觉

2020-11-16 10:57:47 802

原创 SpringCloud全家桶---客户端负载均衡Ribbon

1、SpringCloud全家桶—注册中心Eureka搭建2、SpringCloud全家桶—注册中心Eureka高可用环境搭建Ribbon的基本概念Ribbon是Netflix体系中的基于客户端的负载均衡器,可以通过从eureka拉取服务提供方的地址列表中,按照某种负载均衡算法请求对应的服务方。Ribbon可以单独使用,手动配置服务地址列表后就可以帮我们实现负载均衡。Ribbon也可以配置Eureka使用,从Eureka服务端获取服务提供者的地址列表,然后基于负载均衡算法选择一个服务提供者进行调

2020-11-13 17:01:07 436

原创 SpringCloud全家桶---注册中心Eureka高可用环境搭建

上一篇文章搭建了 SpringCloud全家桶—注册中心Eureka搭建,本期会在这个版本的基础上改造高可用版本。在上一个版本的基础之上,客户端和服务端只需修改配置文件即可,其他都不需要修改。先准备三个eureka服务端eurekaServer1.com服务端配置文件,注册到eurekaServer2.com,eurekaServer3.com上#默认为true#表示此实例是否应从eureka服务器获取eureka注册列表信息.eureka.client.fetch-registry=false

2020-11-12 16:25:02 218 1

原创 SpringCloud全家桶---注册中心Eureka搭建

Eureka Server服务端

2020-11-12 14:46:28 255

原创 解析Spring中@Import的实现原理

@Import介绍@Import注解通常用于添加一些自定义的bean到Spring容器中,就相当于在xml中定义一样,与xml或者其他注解注入方式不同的是,@Import更加灵活,可以自定义实现各种处理逻辑来决定是否需要添加bean到容器中,SpringBoot的自动化装配,一大层面上就是依赖@Import完成的,通过它把写在配置文件中的一些内容注入到Spring容器中。@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Docu

2020-11-11 12:02:19 1044 1

原创 线程安全集合的几种方式、性能对比、适用场景分析

Set的底层实际上就是Map,所以线程安全的Set一般都会在Map上做文章,本文介绍的主要是JDK自带的一些方式。测试方法没有使用任何专业的测试工具,直接用代码创建线程来模拟,所以为了确保数据相对准确,每种方法都测试了20组。测试代码import java.util.Collections;import java.util.Iterator;import java.util.Set;import java.util.UUID;import java.util.concurrent.Concu

2020-11-09 16:47:24 1371

原创 ArrayBlockingQueue中几种添加和取出元素方法的解析

public class TestBlockingQueue { public static void main(String[] args) { testAdd(); System.out.println("=====================我是分隔符========================="); testOffer(); System.out.println("=====================我是分

2020-11-09 11:39:58 1006

原创 Java多线程经典的4道笔试题---含多种实现方式

1、按序输出同时启动三个线程,分别为A、B、C,其中A线程打印“a”,B线程打印“b”,C线程打印“c”,要求按照abc顺序打印输出。第一种方式使用join实现,join方法表示调用线程必须等待该线程执行完成后才能继续往下执行。public class SortPrint { public static void main(String[] args) throws InterruptedException { SortPrint sortPrint = new SortP

2020-11-07 21:08:10 2773 2

原创 AbstractQueuedSynchronizer公平锁与非公平锁的实现

首先关于AbstractQueuedSynchronizer就不过多介绍了,在之前的文章中已经详细的介绍过了先关部分,不熟悉的同学建议先看之前的文章中的内容。分析AbstractQueuedSynchronizer(AQS)使用并实现自定义锁基于AbstractQueuedSynchronizer实现锁的源码分析基本使用ReentrantLock默认情况下是非公平锁,另外还提供了一个带boolean类型的构造方法,传入true,就表示要使用公平锁。 /** * Creates an

2020-11-06 13:11:49 243

原创 HashSet底层实现与源码分析

HashSetHashSet是Set接口的实现类,和List集合一样都是隶属于Collection集合框架下的一个分支,也是日常开发中常用的集合类。HashSet特点保证集合中的元素不会重复集合中的元素无序这两点刚好和我们常用的ArrayList相反,ArrayList中的元素通常都是允许重复且有序的,从两个集合类的底层数据结构来看,就能明白为什么是这样了,ArrayList底层是数组,而HashSet底层实际上是HashMap来实现的,所以他们各自会有如上的特点。构造方法最常用的无参构造

2020-11-06 11:25:18 172

原创 Redis 混合式持久化流程分析

前面的文章中分别介绍过了 AOF 和 RDB 两种持久化策略,这次要介绍一种新的方式—混合模式。为什么会有混合模式?我们知道RDB方式虽然恢复快,但是数据丢失多,而AOF相比RDB数据丢失方面几乎不存在什么问题,但是恢复时间长,体积大,重写期间还会发生阻塞问题,所以综合来看两者无论你使用哪一种都会出现一些较为麻烦的问题,所以Redis4.0开始就提出了混合模式,它结合了AOF和RDB各自的优点来解决持久化问题。如何开启混合模式?# When rewriting the AOF file, Redis

2020-11-05 16:01:08 733

原创 Redis AOF持久化流程分析与参数配置详解

上一篇文章中介绍了RDB的持久化方式,本文接着分析一下另外的一种持久化方式AOF。Redis中的AOFAOF功能在Redis中默认是关闭的,与RDB快照的方式不同,AOF是通过保存服务器执行的写命令来记录数据库状态的,也就是说AOF文件中保存的就是一条条的操作指令。如何开启AOF在redis.conf文件中,设置:appendonly yes(默认为no)这份关于AOF的摘要说明也非常好,所以贴出来,建议大家阅读。# By default Redis asynchronously dumps

2020-11-04 11:23:13 1005

原创 Redis RDB持久化流程分析与参数配置详解

为什么需要Redis持久化?redis本身是内存数据库,数据都是存储在操作系统内存中的,那么就会存在当进程退出或者服务断电等情况下内存数据丢失的问题,所以redis就需要提供某种持久化方案用来把内存中的数据保存到磁盘上,用以解决内存数据丢失的问题。持久化的几种方式?一提到持久化的方式,不仅仅是Redis,基本上所有的持久化方案都会采用“快照”和“日志”这个两种方式,快照是一种定时生成的方式,而日志则更倾向于实时产生。Redis中的RDB先来介绍Redis中的第一种持久化方案—RDB,这就是基于“快

2020-11-02 16:41:39 1218

MySQL突击面试宝典

本文主要介绍了索引的结构、失效场景以及执行计划,讨论了建立索引的条件、该在哪些列上建索引,并解决了大表带来的增删改查、添加索引、数据同步等问题。此外,还介绍了ACID特性、脏读、幻读和日志以及主从复制等相关内容。文章提供了SQL语句的优化建议和大表问题解决方法,旨在帮助读者提升数据库查询效率。

2023-08-03

如何写好代码的一些建议(Java版)

本文主要介绍了软件工程中的基础内容,包括命名规范、函数和参数的长度、日志规范、线程安全、圈复杂度、数据结构与算法、异常处理、事务管理和注释设计原则。文章详细解释了命名的含义和规则、日志打印的不同级别和要求、线程池和线程安全的相关概念、数组和链表的特点和使用场景、异常类型和使用误区、事务的传播方式和应用,以及设计原则中的单一职责和开闭原则等。

2023-08-03

空空如也

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

TA关注的人

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