自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(32)
  • 问答 (3)
  • 收藏
  • 关注

原创 spring循环依赖&三级缓存

spring循环依赖&三级缓存

2022-07-10 15:33:33 152 1

原创 垃圾收集器

垃圾收集器上图展示了HotSpot虚拟机所有收集器及组合(连线),它们所处区域表明是属于新生代收集器还是老年代收集器,两个收集器间有连线表明它们可以搭配使用。Serial&Serial Old使用-XX:UseSerialGC,新生代使用Serial GC,老年代自动使用Serial Old GCSerial(串行)垃圾收集器是最基本、发展历史悠久的收集器;JDK1.3.1前是HotSpot新生代收集的唯一选择。特点:使用单个GC线程进行垃圾回收,进行垃圾收集时,必须暂停所有工作线程,

2021-04-04 18:21:49 125

原创 Redis集群-主从复制原理

Redis集群-主从复制主从模式(master-slave)可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制(replicate)另一台服务器,这种工作模式我们称为主从模式。其中被复制的服务器为主服务器(master),对主服务器进行复制的服务器称为从服务器(slave)。示意图相关命令# 设置主服务器 host:主服务器ip port:主服务器端口SLAVEOF host port实现原理旧版复制功能的实现Reids的复制功能分为同步(sync)和命令

2021-04-01 00:13:46 226

原创 Redis集群-哨兵模式原理(Sentinel)

哨兵模式(Sentinel)哨兵模式是Redis的高可用性解决方案:由一个或多个Sentinel实例组成的Sentinel系统可以同时监控任意多个主服务器,以及每个主服务器下的所有从服务器。在监视到主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。示意图双环代表主服务器server1单环代表三个从服务器server2、server3、server4server2、server3、server4三个从服务器正在复制

2021-04-01 00:06:44 230

原创 Redis持久化机制(RDB&AOF)

Redis持久化Redis是将数据存储在内存中的,要是服务宕机,所有数据将会丢失,为了防止数据丢失,Redis支持两种策略将内存中的数据写到磁盘中来防止数据丢失。Redis提供两种持久化方式:RDB(Redis DataBase)和AOF(Append Only File)RDB该方式服务器进程会fork一个子进程,由子进程去做持久化操作,子进程会先将Redis所有非空数据库的数据进行拷贝到自己的内存空间,然后将这些数据写到一个临时文件,写入完毕,会使用临时文件替换掉dump.rdb文件,线程销毁

2021-03-28 14:21:36 180

原创 Redis的数据结构和对象系统

Redis 的数据结构和对象系统Redis是一个开源的key-value存储系统,它使用了六种底层数据结构构建了包含了字符串对象、列表对象、哈希对象、集合对象、和有序集合对象的对象系统。本篇就来学习一下它的数据结构和对象系统的实现原理。数据结构简单动态字符串Redis使用动态字符串SDS来表示字符串。下图展示了一个值为Redis的SDS结构...

2021-03-26 01:25:20 190

原创 Redis事件机制详解

Redis事件详解文件事件处理器的构成文件事件是对套接字操作的抽象,每当一个套接字准备好执行 连接应答、写入、读取、关闭等操作时,就会产生一个文件事件。由于一个服务器通常会连接多个套接字,所以多个文件事件可能并发的出现。I/O多路复用程序负责监听多个套接字,并向文件事件分派器传送那些产生了事件的套接字。尽管多个文件事件可能会并发地出现,但I/O多路复用程序总是会将所有产生的套接字放到一个队列里,然后文件事件处理器会以有序、同步、单个套接字 的方式处理该队列中的套接字,也就是处理就绪的文件事件。文

2021-03-24 22:41:13 204

原创 JDK动态代理原理

JDK动态代理原理通过一个例子引入JDK动态代理需求描述对Dao层类中的方法进行增强。例如:使用日志记录操作数据库所花的时间类结构图代码实现接口定义public interface Mapper { void insert();}真正干活的类public class RealMapper implements Mapper { @Override public void insert() { System.out.println("do ins

2021-03-20 23:47:37 198 4

原创 Mybatis面试

#{}和${}的区别#{}是占位符,预编译处理;${}是拼接字符串,没有预编译处理Mybatis在处理#{}时,会先将SQL中的#{}替换为?号,再通过调用PrepareStatement的set方法来赋值Mybatis在处理${}时,仅仅是字符串的替换,相当于JDBC中的Statement#{}可以有效的防止SQL注入,提高系统的安全性;${}不能防止SQL注入实体类的属性与表字段不一样,怎么处理?方案一:使用SQL语句定义字段名的别名特性,让字段名的别名和实体类的属性名一致<

2021-03-15 10:39:53 73

原创 类加载机制

类加载机制一、概述虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。整个类的生命周期从类被加载到虚拟机内存开始,到卸载出内存为止要经历:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。二、类加载2.1 加载阶段类加载过程

2021-03-14 22:20:16 130

原创 Redis集群-高可用集群搭建

环境说明物理机:ubuntu:20.04Redis:6.0.7基本命令cluster info:查看集群信息cluster nodes:查看节点信息cluster meet :将节点加入到工作集群cluster keyslot key:计算key的CRC16算法结果值cluster addslots slot:设置槽位拓扑图搭建说明如上图所示,本次搭建3台Master,6台Slave实际应用中Redis节点是需要部署到不同物理机,笔者作为演示,这块使用单机的不同端口跑多个Red

2021-03-14 18:00:16 245

原创 Redis知识点总结

Redis知识点总结什么是Redis?Redis是一个基于内存的K-V键值对数据库,它支持数据的持久化,单线程处理请求,QPS可达10W+,也支持简单的事务。五大数据类型String(字符串)存储原理Redis底层使用SDS(Simple Dynamic String)来存储,没有使用C语言的默认字符串,且string类型是二进制安全的使用场景Hash(哈希)Redis持久化Redis是将数据存储在内存中的,要是服务宕机,所有数据将会丢失,为了防止数据丢失,Redis支持两种策略将内存

2021-03-10 20:59:52 134

原创 深入剖析Mysql索引原理

深入剖析Mysql索引原理数据库索引是什么?数据库索引,是数据库管理系统(DBMS)中一个有序的数据结构,以协助快速查询、更新数据库表中的数据。索引数据结构选择与演变数组特点:数组是一块连续的存储空间。通过下标查询很快,时间复杂度为O(1)存在的问题:插入耗时比较长链表特点:不连续的存储空间,插入快,但查询较慢存在的问题:查询好使较长二叉查找树特点:左子树的节点小于父节点的值;右子树的节点大于父节点的值。缺点:当顺序插入时,二叉树会退变为链表,导致查询效率低下平衡二叉树(AVL

2021-03-01 19:08:53 293

转载 JDK1.8 你好,Metaspace;再见,永久代

JMM的演进历程前言首先需要明确的是,以下我们讨论的HotSpot虚拟机,其他类型的虚拟机,例如JRockit与J9等,压根就没有永久代的概念。因此,下面所说的“虚拟机”都是HotSpot版本的。要想理解这种变化的原因,需要先理解方法区、永久代与元空间的概念与之间的关系。方法区与永久代、元空间之间的关系方法区是一种规范,不同的虚拟机厂商可以基于规范做出不同的实现,永久代和元空间就是出于不同JDK版本的实现。说白了,方法区就像是一个接口,永久代与元空间分别是两个不同的实现类而已。只不过永久代是这个

2021-02-28 12:12:01 718

原创 Mybatis源码解析--TypeHandler

Mybatis源码解析–TypeHandler背景Mybatis作为开源的持久层框架,极大的简化了使用JDBC操作数据库的繁琐流程,作为JAVA与数据库之间的桥梁,会存在数据类型转化的问题。我们都知道在java语法中定义了一套数据类型例如String、Integer、Double等,而在数据库中也有自己的一套数据类型VARCHAR、CHAR、INT等。这篇就来探索一下Mybatis是如何解决这一问题的。提供的功能Mybatis定义了一个TypeHandler接口,主要负责在添加或更新操作时将JAVA

2021-02-26 11:01:14 222

原创 HashMap深入浅出

HashMap深入浅出HashMap基本概念HashMap是基于哈希表的一种实现,允许null值和null键。HashMap有两个参数影响其性能:初始容量和加载因子初始容量:初始容量是哈希表在创建时的容量加载因子:是触发哈希表扩容的一个重要参数,当哈希表中的条目数超过加载因子和当前容量的乘积时,则要对哈希表进行rehash操作(重建内部数据结构)—来自百度百科常见的数据结构在正式开始之前,我们先来说下常见的数据结构,我们使用最多的当属数组和链表数组数组用于存储相同类型数据的集合,在内存中

2021-02-25 17:47:15 151

原创 Mybatis源码解析--ResultHandler

Mybatis源码解析--ResultHandler背景在Mybatis源码解析--ResultsetHandler中我们知道ResultsetHandler是对JDBC中Statement结果集的处理。而StatementHandler将Statement的参数设置和结果集的解析逻辑分别交给ParameterHandler和ResultSetHandler进行处理,本篇就来研究ResultsetHandler的内部实现。ResultHandler的创建public ResultSetHa

2021-02-23 22:08:51 577

原创 Mybatis源码解析--ParameterHandler

Mybatis源码解析--ParameterHandler背景在Mybatis源码解析--StatementHandler中我们知道StatementHandler是对JDBC中Statement功能的封装,而针对3种Statement提供了对应的StatementHandler,而StatementHandler将Statement的参数设置和结果集的解析逻辑分别交给ParameterHandler和ResultSetHandler进行处理,本篇就来研究ParameterHandler的内部实现。

2021-02-23 22:08:04 701 1

原创 Mybatis源码解析--StatementHandler

Mybatis源码解析--StatementHandler背景概述StatementHandler的分类 RoutingStatementHandler:更具不同的StatementType创建对应的StatementHandler(装饰者模式) BaseStatementHandler:对公用逻辑的抽取 SimpleStatementHandler:用来处理Statement PreparedStatementHandler:用来处理Prepare.

2021-02-23 22:07:34 206

原创 Mybatis源码解析--缓存

Mybatis源码解析--缓存背景Mybatis作为一个持久层框架,极大的简化了使用JDBC对数据库操作的繁琐流程,只需定义接口编写SQL模板即可操作数据库,消除了手动获取连接、创建Statement、设置参数、解析结果集等。Mybatis除了对数据库操作进行简化之外,还在性能上做了优化,提供了缓存。开始之前,先思考下面这个场景:一般用户会向应用发起一个请求,通过应用处理之后会响应一个预期结果给用户。设想一下由于业务比较复杂,可能这次请求需要对数据库访问十几次才能获取完本次业务处理所需数据,而一

2021-02-23 22:05:39 247 2

原创 JDBC

JDBC背景我们的应用都是动态运行的,最早就是用于复杂计算领域,你给应用一些入参,应用通过一系列的复杂计算,最终得到结果,返回给使用者。现在的应用也一样,只不过支持的领域比较广,业务更复杂而已。我们都知道应用是需要加载到内存,才能运行。这样的话,当关闭进程,所有的数据都会丢失。所以为了保存数据,出现了数据库技术--主要用于存储数据。数据库介绍数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。数据库技术的

2021-02-23 22:04:50 133 2

原创 Mybatis源码分析--Plugin(插件原理)

Mybatis源码分析--PluginMybatis插件介绍支持拦截的方法 Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed) ParameterHandler (getParameterObject, setParameters) ResultSetHandler (handleResultSets, handleOutputParamet

2021-02-23 22:04:07 419

原创 Mybatis源码解析--Mapper代理对象

Mybatis源码解析--Mapper代理对象背景我们在分析Mybatis源码解析--SqlSession的Mapper代理方式执行sql只是简单的一笔带过,考虑到篇幅过长问题,所以在这篇我们单独分析。Mapper的获取在Mybatis源码解析--SqlSession中已经分析过,通过SqlSession的getMapper(Class<T> type)获取指定类的Mapper对象,而且SqlSession是个接口,真正返回的是DefaultSqlSession对象。Defa

2021-02-23 22:02:10 665

原创 Mybatis源码解析--SqlSession

Mybatis源码解析--SqlSessionSqlSession介绍Mybatis框架的主要目的就是简化JDBC操作数据库的繁琐流程,只需要提供sql语句和相关参数即可,不用再对参数手动设置,以及遍历结果集将其手动封装成目标对象,不用担心资源的释放等等。而SqlSession这个类就是Mybatis的核心,对外暴露的所有接口都在里面,只需要了解该类的方法就可以对数据库进行操作。SqlSession相关类介绍构建SqlSessionFactory我们模拟官网的示例写一个demoSt

2021-02-23 22:01:11 738

原创 Mybatis源码分析--初相识

Mybatis源码分析--初相识Mybatis版本:3.5.6本人的GitHub地址:https://github.com/KeminaPera/mybatis-3分支名称:study/mybatis-3.5.6个人建议:将Mybatis的源码fork到个人仓库,按照官网文档编写demo,然后调试跟踪包结构包名称 package-info.java内容 描述 annotations The MyBatis data mapper framework ma

2021-02-23 21:59:59 219 1

原创 Spring源码解析-@ComponentScan注解

Spring死磕系列-@ComponentScan注解一、ComponentScan注解定义@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)@Documented@Repeatable(ComponentScans.class)public @interface ComponentScan { /**basePackages属性的别名*/ @AliasFor("basePackages") String[]

2020-10-28 22:54:45 333

原创 Spring源码解析-@PropertySource注解

Spring死磕系列-@PropertySource注解PropertySource注解介绍该注解给Environment中添加PropertySource提供了一种便捷且申明式的机制,@PropertySource注解是配合@Configuration标记的配置类一块使用的。PropertySource注解使用Demo演示-类布局Demo演示-主配置类@Configuration@PropertySources({ @PropertySource("classpath:my

2020-10-25 01:03:40 538

原创 Spring源码解析-@Import注解

Spring死磕系列-@Import注解一、Import注解介绍代表一个或多个需要导入的组件类(典型的比如@Configuration类),这种方式和XML方式中import标签的功能类似。Import注解可以用来导入配置类,ImportSelector和ImportBeanDefinitionRegistrar的实现类,从4.2开始,也支持导入普通类。该注解只能作用于类上或者作为元注解二、Import注解3种使用方式导入配置类或普通类(4.2之后支持)导入ImportSelector实现

2020-10-22 21:35:18 402

原创 Java SPI机制

Java SPI机制什么是SPI在编码过程中,我们经常会按照上图的方式进行编码,通常会定义一个接口,然后定义该接口的实现类。在使用时会“父类引用指向子类对象”的方式使用。这是在类的层面比较直观的一种展示。我们不妨在放开眼界,在模块,应用层面思考一下。我们对上面类关系进行放大,我们一个模块或应用依赖一组接口,比如JDBC、日志框架等上图我们发现接口是介于调用方和具体实现的中间层,那什么时候接口更偏向与调用方,什么时候接口更偏向与实现方???接口属于实现方的情况,也就是实现方提供了接口和实现,我

2020-10-15 23:59:54 167

原创 Java日志框架

Java日志框架文章目录Java日志框架一、门面模式二、日志框架2.1、日志门面2.2、日志库2.3、日志适配器2.4、几种常见的日志概念slf4j【日志门面】slf4j静态绑定原理commons-logging【日志门面】commons-logging动态查找原理Log4j【日志实现】Logback【日志实现】三、slf4j和commons-logging对比四、常见日志方案4.1、Commons-logging+log4j4.2、Commons-logging+log4j+slf4j4.3、Slf4j

2020-10-11 12:03:53 207

原创 Spring源码解析-@Conditional注解

Spring死磕系列-@Conditional注解一、Conditional注解介绍Conditional注解表示仅当所有指定条件都匹配时,该组件才会被注册。二、Conditional注解三种使用方式作为类级别的注解使用:作用于任何直接或间接被@Component注解的类上,除此之外还包括@Configuration注解的类作为方法级别的注解使用:作用于任何被@Bean注解的方法上作为元注解使用:目的是组成自定义注释如果一个@Configuration类也被@Conditional标记

2020-09-30 22:04:55 774

原创 JVM 内存分配与回收策略

内存分配与回收策略1.概述JAVA 体系中提倡的自动内存管理最终归根结底为自动化的解决了两个问题:给对象分配内存和回收分配给对象的内存。2.对象优先在Eden区分配大多数情况下,对象在新生代Eden区中分配,当Eden区没有足够的空间分配时,虚拟机将发起一次Minor GC。public class MemoryAllocation { private static int _...

2019-11-24 15:29:57 112

空空如也

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

TA关注的人

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