自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 spring学习之Data Access

一图千言之spring模块组成Transaction Management全面的事务支持。Spring Framework 为事务管理提供了一致的抽象,具有以下优点 跨不同事务 API 的一致编程模型,例如 Java 事务 API (JTA)、JDBC、Hibernate 和 Java Persistence API (JPA)。 支持声明式事务管理。 比复杂的事务 API(例如 JTA)更简单的用于程序化事务管理的 API。 与 Spring 的数据访问抽象

2021-07-16 14:20:42 745 1

原创 Git使用

https://git-scm.com/Git是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目。具有方便的本地分支、方便的临时区域和多个工作流等特性。https://git-scm.com/docs 文档工作区(Working Directory)在电脑里能看到的目录,比如我的learngit文件夹就是一个工作区版本库(Repository)工作区有一个隐藏目录.git是Git的版本库,其中最重要的就是称为stage(或者叫index)的暂存区.

2021-07-08 21:23:05 219

原创 再看docker系列(一)

https://docs.docker.com/get-started/overview/常见概念What is Image?一切皆对象一切皆镜像。一个镜像是用于创建一个容器指令的只读模板。通常,一个镜像基于另一个镜像,并带有一些额外的自定义。要构建您自己的镜像,您需要使用简单的语法创建一个Dockerfile,用于定义创建镜像和运行镜像所需的步骤。Dockerfile 中的每条指令都会在镜像中创建一个层。当您更改 Dockerfile 并重建映像时,只会重建那些已更改的层layerA..

2021-06-30 21:14:57 222

原创 zookeeper

http://zookeeper.apache.org/常见名词数据模型zookeeper 的视图结构和标准的文件系统非常类似,每一个节点称之为 ZNode,是 zookeeper 的最小单元。每个 znode 上都可以保存数据以及挂载子节点。构成一个层次化的树形结构持久节点(PERSISTENT) 创建后会一直存在 zookeeper 服务器上,直到主动删除 持久有序节点(PERSISTENT_SEQUENTIAL) 每个节点都会为它的一级子节点维护一个顺序 临时节点(EPHEMER

2021-06-16 11:24:50 148

原创 MySQL索引

索引首先数据是以文件的形式存放在磁盘上面的,每一行数据都有它的磁盘地址。有了索引之后,只需要在索引里面去检索这条数据就行了,因为它是一种特殊 的专门用来快速检索的数据结构,我们找到数据存放的磁盘地址以后,就可以拿到数据了。在 InnoDB 里面,索引类型有三种,普通索引、唯一索引(主键索引是特殊的唯一 索引)、全文索引索引数据结构推理数据结构二叉查找树既能够实现快速查找,又能够实现快速插入。但是二叉查找树有一个问题: 就是它的查找耗时是和这棵树的深度相关的,如果我们插入的数据刚

2021-05-27 15:39:42 157

原创 MySQL架构与执行SQL流程

MySQL体系结构连接通信协议MySQL 是支持多种通信协议的TCP/IP 协议,Unix Socket等。可以使用同步/异步的方式,支持长连接/短连接。监听默认的 3306 端口。一般来说我们连接数据库都是同步连接MySQL 既支持短连接,也支持长连接。短连接就是操作完毕以后,马上 close 掉。 长连接可以保持打开,减少服务端创建和释放连接的消耗,后面的程序访问的时候还可 以使用这个连接。一般我们会在连接池中使用长连接。保持长连接会消耗内存。长时间不活动的连接,MySQL .

2021-05-27 09:21:11 251 4

原创 任务调度

Quartzhttp://www.quartz-scheduler.org/体系结构Job - 你想要调度器执行的任务组件需要实现的接口,一个 job 就是一个实现了 Job 接口的类,该接口只有一个方法execute JobDetail - 用于定义作业的实例。。 Trigger(即触发器) - 定义执行给定作业的计划的组件。job的一个 trigger 被触发后,execute() 方法会被 scheduler 的一个工作线程调用。最常用SimpleTrigger 和 CronTr

2021-05-24 09:41:35 316

原创 Redis 集群

Redis 主从复制(replication)主从复制配置例如一主多从,203 是主节点,在每个 slave 节点的 redis.conf 配置文件增加一行,slaveof 192.168.8.203 6379 // 在主从切换的时候,这个配置会被重写成: # Generated by CONFIG REWRITE replicaof 192.168.8.203 6379或者在启动服务时通过参数指定 master 节点: ./redis-server --slaveof 1...

2021-05-19 19:25:05 203

原创 Redis高级特性和原理

发布订阅模式Redis 提供了一组命令实现发布/订阅模式订阅者订阅频道:可以一次订阅多个,比如这个客户端订阅了 3 个频道subscribe channel-1 channel-2 channel-3发布者可以向指定频道发布消息(并不支持一次向多个频道发送消息):publish channel-1 2673取消订阅(不能在订阅状态下使用)unsubscribe channel-1按规则(Pattern)订阅频道支持?和*占位符。?代表一个字符,*代表 0 个或者多个字符

2021-05-19 09:59:03 104

原创 Redis基础篇数据结构

数据类型https://redis.io/topics/data-types-introString:二进制安全字符串。 Lists列表:根据插入顺序排序的字符串元素的集合。它们基本上是链表。 Sets集合:唯一,未排序的字符串元素的集合。 Sorted sets排序集合,类似于集合,但是每个字符串元素都与一个称为score的浮点数字值相关联。元素总是按照它们的分数排序,因此与Sets不同,可以检索一系列元素(例如,您可能会问:给我前10名或后10名)。 Hashes哈希,是由与值相关联的

2021-05-17 22:22:50 176

原创 消息中间件之kafka原理分析

副本数据同步原理初始状态leader和follower的HW和LEO都是0,leader副本会保存remote LEO,表示所有follower LEO,也会被初始化为0。这个时候,producer没有发送消息。follower会不断地个leader发送FETCH 请求,但是因为没有数据,这个请求会被leader寄存,当在指定的时间之后会强制完成请求,这个时间 配置是(replica.fetch.wait.max.ms),如果在指定时间内producer有消息发送过来,那么kafka会唤醒 fetc

2021-05-12 10:10:40 184

原创 消息中间件之kafka

消息中间件的场景如果是在分布式系统中,两个服务之间需要通过这种异步队列(生产消费者模式)的方式来处理任务,那单进程级别的队列就无法解决这个问题了。 因此,引入了消息中间件,也就是把消息处理交给第三方的服务,这个服务能够实现数据的存储以及传输,使得在分布式架构下实现跨进程的远程消息通信。 所以,简单来说: 消息中间件是指利用高效可靠的消息传输机制进行平台无关的数据交流,并且基于数 据通信来进行分布式系统的集成。可以先从基本的消息中间件需求开始思考最基本的是要能支持消息的发送和接收 需要涉及到网络

2021-05-11 20:08:09 219 1

原创 nacos 配置源码初解

入口//NacosConfigServiceonfigService configService = NacosFactory.createConfigService(properties);String content = configService.getConfig(dataId, group, 5000);System.out.println(content);configService.addListener(dataId, group, new Listener() { @Ov.

2021-04-29 17:46:05 1132

原创 dubbo 服务引用

https://dubbo.apache.org/zh/docs/v2.7/dev/source/refer-service服务引用原理引用时机Spring 容器调用 ReferenceBean 的 afterPropertiesSet 方法时引用服务(默认饿汉式) ReferenceBean 对应的服务被注入到其他类中时引用(懒汉式)源码分析服务引用的入口方法为 ReferenceBean 的 getObject 方法public synchronized T get() {.

2021-04-28 09:36:12 224

原创 dubbo 服务导出

https://dubbo.apache.org/zh/docs/v2.7/dev/source/export-service要实现服务发布和注册,需要做哪些事情?1. 配置文件解析或者注解解析2. 服务注册3. 启动 netty 服务实现远程监听Spring 默认会加载 jar 包下的 META-INF/spring.handlers 文件寻找对应的 NamespaceHandler。DubboNamespaceHandler把不同的配置分别转化成 spring 容器中的不.

2021-04-27 10:24:49 209

原创 dubbo spi

https://dubbo.apache.org/zh/docs/v2.7/dev/source/dubbo-spi/SPI 全称为 Service Provider Interface,是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口替换实现类。Dubbo 就是通过 SPI 机制加载所有的组件。通过指定目录下配置一个对应接口的实现类,然后程序会进行查找和解析,找到对应的扩展点dubbo spi 的拓展

2021-04-25 15:17:16 185

原创 netty

netty的强大在于三个方面IO模型 线程模型 数据协议Pipeline一个 Channel 包含了一个 ChannelPipeline,而 ChannelPipeline 中又维护了一个由ChannelHandlerContext 组成的双向链表。这个链表的头是 HeadContext,链表的尾是 TailContext,并且每个ChannelHandlerContext 中又关联着一个 ChannelHandlerprotected AbstractChannel(Channe

2021-04-14 17:09:41 116 1

原创 ThreadLocal

常见用途每个线程需要一个对象。工具类。 每个线程需要保存全局变量。让不同方法使用避免参数的传递原理每个线程都有一个 ThreadLocal.ThreadLocalMap threadLocals = null重要方法initalValue该方法会返回当前线程的初始值,这是一个懒加载当调用get方法的时候才会触发 如果线程已经调用过了set方法,不会调用initalValue 通常每个线程只执行一次,除非调用了remove方法 如果不重写方法,默认返回nulls.

2021-04-10 18:24:47 107

原创 线程池

线程池的目的固定数量的线程来执行多数的任务,来避免反复创建和销毁线程所带来的的开销问题线程池的启动corePoolSize maxPoolSize keepAliveTime workQueue threadFactory Handler添加线程的规则如果线程数小于corePooSize,即使其他线程处于空闲状态也会创建新的线程 如果线程数大于等于corePooSize小于maxPoolSize,则将任务放入队列 如果队列已满,并且线程数小于maxPoolSize,则创

2021-04-10 15:17:27 88

原创 Java死锁的产生到消除

首先看一个必然死锁的例子package com.study.deadlock;public class MustDeakLock implements Runnable { int flag = 1; static Object o1 = new Object(); static Object o2 = new Object(); public static void main(String[] args) { MustDeakLock m1 =

2021-04-10 10:28:24 105

原创 JAVA内存模型的原理学习之重排序,可见性,原子性

JVM内存结构 vs JMM内存模型 vs JAVA对象模型JVM内存结构JAVA对象模型JAVA对象自身的存储模型。JVM会给这个类创建一个InstanceKlass,保存在方法区。用来在JVM层展示该Java类。当我们在代码中使用new创建一个对象时,Jvm会创建一个InstanceOopDesc对象,这个对象中包含了对象头以及实例数据JMM(Java Memory Model)Java内存模型是一个规范,如果没有这个规范。不同虚拟机经过重排序之后会导致多线程的执行

2021-04-09 20:50:22 133

原创 线程核心之安全和性能

线程安全当多个线程访问一个对象时,如果不用考虑这些线程在运行时的交替执行和调度,也不需要进行额外的同步或者在调用方法时进行其他的协调工作,调用这个对象的行为都可以得到正确结果,那这个对象是线程安全的。三大安全问题a++读写 死锁 对象发布和初始化方法返回一个private对象 还未完成初始化就把对象提供给外面 在构造函数中未初始化完毕就this赋值 隐式溢出----注册监听事件 构造函数中运行线程线程性能问题上下问切换挂起一个线程,将这个线程在cpu中的状态(上下

2021-04-09 13:15:53 142

原创 线程核心之线程属性和线程异常处理

线程属性ID:线程id 从1开始private static synchronized long nextThreadID() { return ++threadSeqNumber;}NAME:线程名称 Thread-public Thread(ThreadGroup group, Runnable target) { init(group, target, "Thread-" + nextThreadNum(), 0);}IS DAEMON:是否是守护线程

2021-04-08 23:59:29 97

原创 线程核心之Thread和Object方法详解

wait:会释放锁,那个对象执行wait就会释放那个对象的锁notify:唤醒一个等待锁的线程,实现线程之间的通信notifyAll:唤醒等待锁的所有线程wait ,notify,notifyAll 都是锁级别的操作,而每个Object对象头都有一把锁。所以这些方法放在Object类中wait原理首先从入口集entry set 开始去获取锁 获得了锁 执行wait方法释放锁进入wait set 被唤醒时开始尝试获取锁(线程的状态从waiting变成blockd) 获得锁(抢到

2021-04-08 20:38:01 239

原创 线程核心之启动与终止

Start和run的区别public class StartAndRun { public static void main(String[] args) { Runnable runnable = ()->{ System.out.println(Thread.currentThread().getName()); }; runnable.run();//main new Thread(runn.

2021-04-08 14:29:55 378

原创 mybatis插件与spring整合

MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed) ParameterHandler (getParameterObject, setParameters) ResultSetHandler (handleResultSets, handleO

2021-04-01 10:23:35 158 1

原创 MyBatis工作流程和缓存机制

MyBatis 的工作流程首先在mybaits启动的时候去解析配置文件,包括全局配置文件和映射器 配置文件把它们解析成一个 Configuration 对象 接下来,是操作数据库的接口SqlSession,要获得一个会话 ,必 须 有 一 个 会 话 工 厂 SqlSessionFactory 。SqlSessionFactory 里面又必须包含我们的所有的配置信息,所以我们会通过一个 Builder 来创建工厂类 SqlSession 持有了一个 Executor 对象,用来封装对数据库的 操作,

2021-03-31 12:00:54 175 1

原创 Spring MVC流程

初始化阶段首先找到 DispatcherServlet 这个类,必然是寻找 init()方法。然后,我们发现其 init 方法其实在父类 HttpServletBean 中又 调 用 了 一 个 重 要 的 initServletBean() 方 法最后有调用了@Overrideprotected void onRefresh(ApplicationContext context) { initStrategies(context);//初始化九大组件}HandlerM...

2021-03-26 15:28:15 97

原创 spring流程原理之AOP

寻找入口Spring 的 AOP 是通过接入 BeanPostProcessor 后置处理器开始的,它是 Spring IOC 容器经常使用到 的一个特性,这个 Bean 后置处理器是一个监听器,可以监听容器触发的 Bean 声明周期事件.BeanPostProcessor 后置处理器的调用发生在 Spring IOC 容器完成对 Bean 实例对象的创建和属性的 依赖注入完成之后在 AbstractAutowireCapableBeanFactory 类中initializeBean()方法

2021-03-26 13:56:28 185

原创 springDI依赖注入流程

依赖注入发生的时间当 Spring IOC 容器完成了 Bean 定义资源的定位、载入和解析注册以后,IOC 容器中已经管理类 Bean 定义的相关数据,但是此时 IOC 容器还没有对所管理的 Bean 进行依赖注入,依赖注入在以下两种情况 发生:用户第一次调用 getBean()方法时,IOC 容器触发依赖注入。 当用户在配置文件中将元素配置了 lazy-init=false 属性,即让容器在解析注册 Bean 定义 时进行预实例化,触发依赖注入。DI大致流程 1 A...

2021-03-25 15:44:26 274

原创 Spring的入门之IOC初始化

Spring的出现可以说是大大简化了Java的开发。基于 POJO 的轻量级和最小侵入性编程; 通过依赖注入和面向接口松耦合; 基于切面和惯性进行声明式编程; 通过切面和模板减少样板式代码;而他主要是通过:面向 Bean(BOP)、依赖注入(DI)以及面向切面(AOP)这三种方式来达成的。 Bean Oriented Programming, BOPSpring 提供了 IOC 容器通过配置文件或者注解的方式来管理对象之间的依赖关系,控制反转(其中最常见的实现方式叫做依赖注入(De

2021-03-24 14:34:42 204

原创 设计模式之委派模式和策略模式

委派模式delegate pattern:负责任务的调度和分配应用场景当你要实现表现层和业务层之间的松耦合的时候。 当你想要编排多个服务之间的调用的时候。 当你想要再封装一层服务查找和调用时候示例代码public interface IEmployee { public void doing(String command);}public class EmployeeA implements IEmployee{ @Override public voi

2021-03-21 16:19:29 309

原创 设计模式之单例模式

单例模式(Singleton Pattern)是指确保一个类在任何情况下都绝对只有一个实例,并 提供一个全局访问点。单例模式是创建型模式饿汉式单例是在类加载的时候就立即初始化,并且创建单例对象。绝对线程安全,在线程还没出现以前就是实例化了,不可能存在访问安全问题。 示例代码//饿汉式的单例模式public class HugrySingleton { //一个私有的构造方法 private HugrySingleton(){}; //立刻初始化 priv

2021-03-20 15:04:22 116

原创 k8s基础

基础概念Kubernetes集群Kubernetes将底层的计算资源连接在一起对外体现为一个高可用的计算机集群。允许将容器化的应用程序部署到集群中。是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能Master节点:负责集群的管理。Master 协调集群中的所有行为/活动,例如应用的运行、修改、更新等 Node Controller第一个是在注册时将CIDR块分配给节点。第二个是使节点控制器的内部列表与云提供商的可用机器列表保持最新。第三是监测节点

2021-03-18 16:33:18 190

原创 调优之池化技术和异步化以及锁优化

对象池http://commons.apache.org/proper/commons-pool/index.html

2021-03-10 21:22:51 117

原创 数据库调之索引和语句优化

https://dev.mysql.com/doc/refman/8.0/en/optimization-indexes.htmlB-Tree和B+Tree的差异B+Tree有n个子节点的节点中有n个关键字 B-Tree是n个子节点的节点中有n-1个关键字 B+Tree中,所有的叶子节点中包含了全部关键字的信息,且叶子节点按照关键字的大小顺序连接 B-Tree的叶子节点不包含全部关键字 B+Tree中,非叶子节点仅用于索引,不保存数据记录,记录存放在叶子节点中 B-Tree中,非叶子节

2021-03-07 21:27:38 143

原创 数据库调优慢查询

慢查询日志分析使用方式一[mysqld]log_output='FILE,TABLE';slow_query_log=on;long_query_time=0.01然后重启mysql例如service mysqld restart使用方式二使用全局变量设置这种方式无序重启即可生效,但一旦重启需要重新配置set global slow_output='FILE,TABLE';set global slow_query_log='on';set global long_que..

2021-03-06 20:43:06 190 1

原创 jvm调优工具

https://docs.oracle.com/en/java/javase/11/tools/https://chriswhocodes.com/hotspot_option_differences.htmlhttps://docs.oracle.com/javase/8/docs/technotes/tools/unix/index.html内置工具监控工具jps可以使用该jps命令列出目标系统上已检测到的JVM进程,此命令是实验性的jps [-q] [-mlvV][host

2021-03-05 17:38:24 257

原创 jvm优化之方法内联和逃逸分析

方法内联的条件方法体足够小热点方法:如果方法体小于325字节会尝试内联,可用-XX:FreqInlineSize修改大小 非热点方法:如果方法体小于35字节会尝试内联,可用-XX:MaxInlineSize修改大小被调用方法运行的实现可以被唯一确定static,private,final,JIT可以确定具体实现的代码 public的实例方法,指向的实现可能是自身,父类,子类的代码,当JIT可以确定具体实现的代码时才有可能实现内连内连的问题:codeCache的溢出,导致jvm退化成解释执行

2021-03-04 20:39:15 431 2

原创 分布式技术之限流

guava RateLimiter限流Nginx限流IP限流https://blog.csdn.net/chy2z/article/details/108369972 参看大神博客limit_req_zone 用来限制单位时间内的请求数,即速率限制,采用的漏桶算法 "leaky bucket"。limit_req 配合 limit_req_zone 使用示例:limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1.

2021-02-23 10:21:14 191

空空如也

空空如也

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

TA关注的人

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