CAP理论CAP理论可表述为,一个分布式系统最多只能同时满足一致性Consistency、可用性Availability和分区容错性Partition Tole
简历投递 每天早上9点左右投递简历 面试前 充分了解面试的公司 面试过程中 提问: 公司技术栈 最优成就感的项目 最有挑战的事情 难点 由于业务需要转岗过一段时
使用Redis作为MySQL的前置缓存,可帮助MySQL挡住绝大部分的查询请求,这种方法对于像电商中的商品系统、搜索系统这类与用户关联不大的系统、效果特别好,因
当我们使用计算机来播放音乐时,其实是使用shell发送指令给Kernel内核,由Kernel控制硬件来完成音乐播放;操作系统其实是一组软件,由于这组软件在控制整
Linux中文本编辑器有emacs、pico、nano、joe、vim等,所有Unix Like系统都会内建vi文本编辑器,其他文本编辑器不一定会存在,很多个别
计算机最小单位是bits,1byte=8bits这就是所谓的二进制,如数字1用二进制表示为00000001,其实数字1只占用了1个bit,而其他的7个bits是
重要热键Tab键具有命令补全和文件名补齐功能,即Tab键接在一串命令的第一个命令后,则为命令补全;Tab键接在一串命令的第二个命令以后,则为文件名补齐; Ctr
家电&品牌 冰箱:荣升BCD-506WKK1FPGZA-GQ51 双十一价格:10959 浴霸:奥普Q360A PRO(2个) 双十一价格:3643 前
基本要求 个人喜好说明 注重方便实用&舒适性 很居家:做饭比较多 不喜欢乱糟糟:尽可能多做一点收纳 有养绿植的爱好:阳台尽可能能养一点绿植 隐蔽工程&a
基本要求 个人喜好说明 注重方便实用&舒适性 很居家:做饭比较多 不喜欢乱糟糟:尽可能多做一点收纳 有养绿植的爱好:阳台尽可能能养一点绿植 隐蔽工程&a
C++是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程,被认为是一种中级语言,它综合了高级语言和低级语
TypeScript是由微软开发的自由和开源的编程语言是JavaScript的一个超集,TypeScript可编译出纯净、 简洁的JavaScript代码,且可
JavaScript能够以不同方式显示数据:使用window.alert()写入警告框、使用document.write()写入HTML输出(在HTML文档完全
流是一连串连续不断的数据集合 输入流:从输入设备流向内存的流 输出流:从内存流向输出设备的流 输入&输出流类: iostream: istream:用于
变量定义定义变量时等号两边不能有空格,定义shell脚本时开头一定要以#!/bin/bash开头 12345#!/bin/bash# 注意:"="号两边不能有空
虽然HTTP协议具有相当优秀和方便的一遍,但HTTP协议可能存在信息窃听或身份伪装等安全问题,HTTP有如下不足: HTTP本身不具备加密功能,通信使用明文,内
由欧洲孩子研究组织CERN的蒂姆伯纳斯李博士提出的一种能让远隔两地的研究者们共享知识的设想,最初设想的基本理念是,借助多文档之间的相互关联形成的超文本,连成可相
服务启动注册成功隔段时间被踢掉使用的Nacos版本为1.2.1,服务启动时能正常注册到Nacos上,说明服务是能连上Nacos的,隔段时间被踢掉,很明显是因为N
Redis快:完全基于内存操作,C语言实现对几种基础数据结构做了大量的优化,使用单线程无上下文的切换成本,基于非阻塞的IO多路复用机制,内存预分配,渐进式reh
跳跃游戏非负整数数组nums,最初位于数组的第一个位置,数组中的每个元素代表在该位置可以跳跃的最大长度,使用最少的跳跃次数到达数组的最后一个位置 1234567
用栈来实现队列可以通过两个栈实现队列,输入数据都压入输入栈,获取数据时若输出栈为空则将输入栈中的数据压入输出栈再出栈 字符串解码通过栈的方式来实现,一开始一直入
相交链表 暴力求解:双重循环将A中每个节点与B中比较 Hash表:将A中节点存入Hash表中,再遍历B去Hash表里判断,时间复杂度O(n) 双指针: 链表遍历
位运算两个相同的数异或结果为0,任何数与0异或结果都是其本身 1234567// 判断基偶数n & 1// 交换两个数,使用异或a = a ^ b;b
传统文件读写有三个步骤:把文件内容读入到内存中、修改内存中的内容、把内存的数据写入到文件中,page cache页缓存是读写文件时的中间层,内核使用页缓存与文件
Docker搭建Prometheus&GrafanaPrometheusPrometheus集成了数据的采集,处理,存储,展示,告警一系列流程,存储数据是使用多维数据模型即由度量名称和键值对标识的时间序列数据,通
Kubernetes简称K8S,用于自动部署、扩展和管理容器化应用程序的开源系统。 核心特点; 服务发现与负载均衡:无需修改应用程序即可使用陌生的服务发现机制
使用微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,若每个微服务都要手动启停,效率很低、维护量很大。可使用Docker Compose
Docker是一个开源的容器引擎,有助于更快地交付应用。 Docker可将应用程序和基础设施层隔离,且能将基础设施当作程序一样进行管理。使用Docker可更快地
TCP协议TCP是面向连接的、可靠的、基于字节流的传输层通信协议,且TCP连接是全双工的。TCP会将数据临时存储到连接的发送缓存send buffer中,该se
大多数场景下应用都只需要操作单一数据库,该情况下的事务称之为本地事务(Local Transaction)。本地事务的ACID特性是数据库直接提供支持。在JDB
Canal模拟MySQL Slave的交互协议伪装自己为MySQL Slave,向MySQL Master发送Dump协议MySQL Master收到Dump请
秒杀业务特性秒杀具有瞬时高并发的特点,秒杀请求在时间上高度集中于某一特定的时间点(秒杀开始那一秒),就会导致一个特别高的流量峰值,它对资源的消耗是瞬时的。 但对
消费者以消费者组的模式开展。消费者组之间有集群模式和广播模式两种消费模式。消费模式有推模式和拉模式。推模式是由拉模式封装组成。 Push模式1234567891
工厂模式vs建造者模式工厂模式和建造者模式都属于对象创建类模式,都用来创建类的对象,工厂模式注重的是整体对象的创建方法,而建造者模式注重的是部件构建的过程,旨在
Producer的启动是通过DefaultMQProducer来完成的 123DefaultMQProducer producer = new DefaultM
数组的特点:下标和随机访问,缺点插入和删除很慢时间复杂度O(n),数组下标为什么从0开始,因为数组的内存地址是连续的,可以通过起始地址+数组下标方便的获取对应数
对于PriorityQueue优先队列最核心的就是其添加元素删除元素后维持元素的顺序的逻辑,其实用的算法其实就是堆排序。堆其实是一种特殊的树,堆是一颗完全二叉树
RocketMQ架构 TopicTopic是一类消息的集合,是一种逻辑上的分区,Kafka的Topic也是一种逻辑概念,每个Topic的数据会分成多个Parti
12345<dependency> <groupId>org.elasticsearch.client</groupId>
分值计算首先根据用户query条件,过滤出包含指定term的doc,Field-length norm即field长度越长相关度越弱。 123query "he
Elasticsearch是用Java开发的当前最流行的开源的企业级搜索引擎,能够达到实时搜索,稳定,可靠,快速,安装使用方便。Elasticsearch是基于
整个Zookeeper就是一个多节点分布式一致性算法的实现,底层采用的实现协议是ZAB,即Zookeeper Atomic Broadcast原子广播协议。ZA
服务端处理客户端的请求入口是通过NettyServerCnxnFactory无产构造函数中启动Netty服务端时绑定的CnxnChannelHandler的ch
客户端客户端调用Dubbo方法时首先通过InvokerInvocationHandler调用MockClusterInvoker首先判断Mock逻辑,若未配置M
Spring启动过程中会将@Reference注解标注的属性赋值,赋值对象为ReferenceBean中get()方法所返回的代理对象。ReferenceBea
服务导出首先确定服务参数,确定服务支持的协议,构造服务最终的URL,将服务URL注册到注册中心且向注册中心注册监听器,监听Dubbo的中的动态配置信息变更,主要
Dubbo常见SPI写法,表示获取black对应的Person接口扩展点,然后通过URL参数动态指定具体Person实现类中注入的Car的具体实例。12345E
Dubbo与Spring的集成主要完成propertie文件解析处理、@Service注解解析、@Reference注解解析。主要是通过@EnableDubbo
12345678910111213141516171819202122232425# Spring boot applicationspring.applica
无锁串行化大多数场景下并行多线程处理可提升系统并发性能,但若对于共享资源并发访问处理不当,会带来严重锁竞争,最终会导致性能下降。为了尽可能避免锁竞争带来的性能损
NioEventLoopGroup初始化NioEventLoopGroup时若未传入线程数,在调用超类MultithreadEventLoopGroup构造方法
IO模型就是用怎样的通道进行数据的发送和接收,Java共支持BIO,NIO,AIO3种网络编程IO模型。 BIO BIO是同步阻塞模型,一个客户端连接对应一个处
NIO类库和API繁杂,使用麻烦需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等,且客户
ShardingSphere包含ShardingJDBC、ShardingProxy和ShardingSidecar三个重要的产品。ShardingJDBC是用
实际生产中,往往数据量会极为庞大,并且数据的安全性要求也更高,生产环境中MySQL必须是要搭建一套主从复制架构,同时可基于一些工具实现高可用架构。在此基础上则可
MongoDB的安装和启动,MongoDB启动默认使用/data/db路径作为数据存放路径,也可通过--dbpath参数指定其他路径,若未创建则启动报错,通过-
Kafka基础Kafka是scala语言编写的支持partition分区、replica多副本,基于Zookeeper协调的分布式消息系统,可实时处理大量数据以
消费者以消费者组的模式开展。消费者组之间有集群模式和广播模式两种消费模式。消费模式有推模式和拉模式。推模式是由拉模式封装组成。 PUSH模式PullMessag
RocketMQ的存储文件包括消息文件Commitlog、消息消费队列文件ConsumerQueue、Hash索引文件IndexFile、监测点文件checkP
普通消息同步消息是通过当前线程直接调用DefaultMQProducerImpl的sendDefaultImpl方法,异步消息会将任务提交给异步线程池执行,最终
消息模型RocketMQ主要由Producer、Broker、Consumer三部分组成,Producer负责生产消息,Consumer负责消费消息,Broke
RocketMQ架构 Producer消息发布的角色,支持分布式集群方式部署。Producer通过MQ的负载均衡模块选择相应的Broker集群队列进行消息投递,
消息可靠性投递持久化:Exchange持久化、Queue持久化、Message持久化;生产方确认Confirm;消费方确认Ack;Broker高可用; 生成端确
MQ的优势系统的耦合性越高,容错性就越低,可维护性就越低,可使用MQ对应用解耦,提升容错性和可维护性; 异步提速,提速用户体验和系统吞吐量 削峰填谷,可以提高系
Zookeeper集群的启动是通过QuorumPeerMain的main方法中调用initializeAndRun方法,单机模式的启动是调用ZooKeeperS
基本信息姓名:姚应龙(可以叫我小姚或姚工) 性别&年龄:男/1993(身份证1991与实际有出入) 工龄:Java开发,正式工作4年半,大学期间公司实习
Zookeeper是一个分布式协调框架,是Apache Hadoop的一个子项目,主要用来解决分布式应用中经常遇到的一些数据管理问题,如统一命名服务、状态同步服
分布式锁的各种问题及优化并发情况下以下代码可能导致超买 12345678int stock = Integer.parseInt(stringRedisTemp
配置文件调优123456789101112131415161718192021222324252627282930313233343536373839# 列表对
主从架构12345678910111213141516171819# 复制一份redis.conf文件port 6380pidfile /var/run/red
Redis是非关系型的键值对数据库,可根据键以O(1)时间复杂度取出或插入关联值,Redis数据是存在内存中,键值对中键可以是字符串、整型、浮点型等且键唯一。值
Feign是Netflix开发的声明式、模板化的HTTP客户端,可帮助我们更加便捷、优雅地调用HTTP API,Feign可以做到使用HTTP请求远程服务时就像
网关作为流量的入口,常用的功能包括路由转发,权限校验,限流等,Spring Cloud Gateway是Spring Cloud官方推出的由WebFlux +
以下是分布式事务的核心逻辑,确切的说是Seata中TM事务管理器的核心逻辑,跟本地事务的核心逻辑很类似,Seata的AT模式也是基于本地事务的,对本地事务的处理
Seata的集成包括两部分,一部分是对@GlobalTransactional、@GlobalLock等分布式事务注解的支持,一方面是对分支事务用到的一些RPC
sentinel规则的推送模式原始模式、Pull模式、Push模式三种,原始模式是通过API将规则数据推送至客户端,并直接更新到内存中,简单无任何依赖,但规则保
计数器法定义一个时间窗口,以及时间窗口内最大请求数,当每个请求来时判断请求时间是否小于窗口起始时间加时间窗口时长,即是否在时间窗口内,若在则将计数器加一,且判断
客户端使用Sentinel可通过@SentinelResource注解以AOP增强的方式,也可通过SentinelWebInterceptor拦截器的方式。对于
Sentinel规则发布是通过Dashboard模块的FlowControllerV1的apiAddFlowRule方法,首先将数据保存到服务端缓存中,若扩展了
主流的负载方案分为集中式负载均衡,在消费者和服务提供方中间使用独立的代理方式进行负载,如硬件的F5,软件的Nginx;客户端负载均衡,客户端会有一个服务器地址列
服务端配置加载Nacos启动时通过DumpService的子类ExternalDumpService在初始化时调用dumpOperate来完成配置从数据库加载到
客户端配置拉取对于客户端配置的拉取主要是通过NacosConfigBootstrapConfiguration配置类中注册的NacosPropertySourc
@ConfigurationProperties被@ConfigurationProperties注解修饰的类的属性注入,可通过@ConfigurationPr
在RaftPeerSet组件初始化时,会将所有集群成员遍历初始化成RaftPeer,即完成peers初始化以及将ready设置为true。 1234567891
服务注册同步客户端在调用服务端接口注册实例时,会调用ConsistencyService#put方法将实例对象添加到注册表,以及同步给其它服务端成员。注册服务的
成员列表初始化Nacos集群模式启动时,会加载nacos.home文件夹下conf/cluster.conf集群节点列表。然后通过周期延时任务对每个节点发送心跳
Nacos客户端需要引入spring-cloud-starter-alibaba-nacos-discovery依赖。 1234<dependency&g
服务注册:Nacos Client通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身元数据,如ip地址、端口等信息。Nacos Ser
在执行java -jar命令时会在Jar包中找到META-INF/MANIFEST.MF文件,在该文件中通过Main-Class指定了应用的启动类,在Sprin
SpringBoot容器启动时最终会调用refresh()方法来扫描项目中的Bean注册为BeanDefinition然后将其加载到容器中。扫描注册过程还是在i
SpringBoot的启动是SpringApplication.run(ElevenApplication.class, args)来完成的,首先在实例化Spr
Mybatis执行SQL时首先从SqlSessionFactory中获取一个SqlSession然后由SqlSession去执行具体的Mapper中映射的SQL
Spring中集成Mybatis主要有两个难点,一是事务的集成,二是Mapper接口注册到Spring容器中,Spring中集成Mybatis需要引入mybat
一级缓存一级缓存是SqlSession级别的缓存,每个HTTP请求都会创建一个新的SqlSession即DefaultSqlSession,默认开启,可通过lo
Mybatis通过加载配置文件流构建一个DefaultSqlSessionFactory,是通过SqlSessionFactoryBuilder的build方法
在Spring MVC中是通过DispatcherServlet前端控制器来完成所有Web请求的转发、匹配、数据处理后,并转由页面进行展示,是MVC实现中最核心
Web容器启动时会调用ServletContainerInitializer的onStartup方法,以Tomcat容器为例,其调用实际是在StandardCo
桥接模式的一个常用使用场景就是为了替换继承,继承拥有很多优点,比如抽象,封装,多态等,父类封装共性,子类实现特性。继承可以很好地帮助我们实现代码复用或封装的功能
事务的解析与执行是依赖AOP实现的,Spring中开启事务是通过@EnableTransactionManagement注解来完成的,在该注解上通过@Impor
@Transactional生效的方法的调用,还是走AOP代理调用逻辑,即通过ReflectiveMethodInvocation的proceed()调用逻辑,
创建代理给Bean创建代理的地方有两个,存在循环依赖的Bean会调用实现了SmartInstantiationAwareBeanPostProcessor接口的
Spring AOP是通过给一个类加上@Aspect注解来定义一个切面类,定义一个Pointcut方法,最后定义一系列的增强方法,这样就完成一个对象的切面操作。
AOP面向方面编程或面向切面编程,AOP联盟网站下有以下AOP技术: AspectJ:源代码和字节码级别的编织器,用户需要使用不同于Java的新语言。 Aspe
Spring事件体系包括事件,事件监听器,事件广播器三个组件,实现原理其实就是观察者模式。Spring内置事件由系统内部进行发布,只需要注入监听器即可: Con
面向对象技术可很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和对象的个数。当对象数量太多时,将导致运行代价过高,带来性能下降等问题。享元模
生命周期首先Bean是通过ConfigurationClassPostProcessor解析配置类的后置处理器,将Bean从类中注册到BeanFactory中,
Spring启动时最终会调用ApplicationContext的无参构造函数,该函数中会实例化用于读取资源的BeanDefinitionReader和用于扫描
生命周期相关内容 Bean的作用域Bean的作用域通过@Scope注解在来指定,Bean的作用域有以下5个: singleton:单例模式,当创建applica
自定义的Bean解析与注册是通过refresh()中invokeBeanFactoryPostProcessors()方法最终调用PostProcessorRe
现在用的比较多的注解的方式,这里仅对于注解的容器即AnnotationConfigApplicationContext的加过程的总结。使用时启动一个容器仅一行或
JDK8中ConcurrentHashMap实现有很大的变化,首先没有了分段锁,所有数据都放在一个大的HashMap中,其次是引入了红黑树。若头结点是Node类
为了提高并发度,一个HashMap被拆分成多个子HashMap,每个HashMap被称为Segment,多个线程操作多个Segment相互独立。每个Segmen
JDK只提供了两种线程启动方式,这两种方式中的run()方法的返回值是void类型,Callable不算是线程启动方式,Thread类也并没有接收Callabl
SynchronousQueueSynchronousQueue是一种特殊的BlockingQueue,其本身没有容量,先调用put方法线程会阻塞,直到另一个线
ScheduledThreadPoolExecutor12345678910111213ScheduledThreadPoolExecutor scheduledThreadPoolExecutor = new S
BlockingQueue是一个带阻塞功能的队列,入队时若队列已满则阻塞调用者,出队时若队列为空则阻塞调用者。该接口和JDK中Queue接口是兼容的,在其基础上
线程线程是调度CPU资源的最小单位,线程模型分为KLT模型与ULT模型,JVM使用的KLT模型,Java线程与OS线程保持1:1的映射关系,也就是说有一个jav
Condition本身也是一个接口,其功能与wait/notify类似。 123456789101112public interface Condition &
和互斥锁相比,ReentrantReadWriteLock读写锁是读线程之间不相互互斥,写线程与写线程和读线程间互斥,ReentrantReadWriteLoc
下面的方法基本都是会用到下面的两个方法123456789101112131415public abstract class AbstractQueuedSync
Java并发编程核心在于java.util.concurrent包,JUC中大多数同步器实现都是围绕着共同的基础行为,如等待队列、条件队列、独占获取、共享获取等
定义解释器模式是给定一门语言,定义它的语法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子,是一种按照规定语法进行解析的方案,属于行为型模式,
Unsafe位于sun.misc包下,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升Java运行效率、
快照读即不加锁的简单SELECT都属于快照读,当前读即读取最新数据而不是历史数据,加锁的SELECT或对数据进行增删改都会进行当前读。 MVCC多版本并发控制机
计算机模型 CPU缓存结构 CPU为了提升执行效率,减少CPU与内存的交互,一般在CPU上集成了多级缓存架构,常见的为三级缓存结构,存储器存储空间大小:内存&g
事务基本特征ACID事务是并发控制的单位,是用户定义的一个操作序列,由一组SQL语句组成的逻辑处理单元,这些操作要么都成功,要么都失败,是一个不可分割的工作单位
分页查询优化业务系统分页功能可能会用如下sql实现,表示取出从10001行开始的10行记录,看似只查询10条,实际SQL是先读取10010条记录,然后抛弃前10
使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析查询语句或是结构的性能瓶颈,在select语句之前增加explain关键字,MySQL会在查询上设置一
MySQL大体来说可以分为Server层和存储引擎层两部分 Server层主要包括连接器、查询缓存、分析器、优化器、执行器等,涵盖大多数核心服务功能,以及所有的
索引设计原则代码先行,索引后上建完表不要立马就建立索引,一般应等主体业务功能开发完毕,把涉及到该表相关sql都要拿出来分析之后再建立索引。 联合索引尽量覆盖条件
示例数据12345678910111213CREATE TABLE `employees`( `id` int(11) NOT NULL AUTO_INCREM
索引是帮助MySQL高效获取数据的排好序的数据结构。索引的数据结构:二叉树、红黑树、Hash表、B-Tree; MySQL的索引使用的是B+树而不是使用的B树,
Tomcat的启动是通过Bootstrap类的main方法来启动的,Bootstrap类只是入口,真正的初始化是通过Catalina类来完成的。启动的时候会将阻
热部署和热加载是类似的,都是在不重启Tomcat的情况下,使得应用的最新代码生效,热部署表示重新部署应用,它的执行主体是Host表示主机;热加载表示重新加载cl
Tomcat是一个Servlet容器,在Tomcat中容器分为Wrapper、Context、Host、Engine。从Tomcat的server.xml中也可
在Tomcat7中,默认为BIO,可以通过如下配置改为NIO 1<Connector port="8080" protocol="org.apache.c
和读取数据原理类似,getOutputStream方法调用的是Tomcat底层Response的getOutputStream方法,最终是通过CoyoteOut
数据在操作系统层面是通过TCP协议来传输通过Socket来实现,Tomcat是实现的HTTP等应用层的协议,通过Socket去获取解析数据,解析出请求行、请求头
JVM参数汇总查看命令java -XX:+PrintFlagsInitial:打印出所有参数选项的默认值java -XX:+PrintFlagsFinal:打印
Class常量池与运行时常量池Class常量池可以理解为Class文件中的资源仓库,Class文件中除了包含类的版本、字段、方法、接口等描述信息外,还有一项信息
用jstat -gc PID命令可以计算出一些关键数据,有了这些数据就可以采用一些优化思路,先给系统设置一些初始性的JVM参数,比如堆内存大小,年轻代大小,Ed
JVM整体结构及内存模型 JVM内存参数设置 Spring Boot程序的JVM参数设置格式(Tomcat启动直接加在bin目录下catalina.sh文件里)
栈和局部变量操作将常量压入栈的指令aconst_null 将null对象引用压入栈iconst_m1 将int类型常量-1压入栈iconst_0 将int类型常
状态模式也称为状态机模式适用于当某个对象在它的状态发生改变时,其行为也随着发生比较大的变化,在行为受状态约束的情况下可以使用状态模式,而且使用时对象的状态最好不
访问者模式是一种集中规整模式,特别适用于大规模重构的项目,通过访问者模式可以很容易把一些功能进行梳理。还可以与其他模式混编建立一套自己的过滤器或者拦截器。 访问
外观模式也叫门面模式,注重统一的对象,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。 该模式对外有一个统一接口,外部应用程
备忘录模式又叫快照模式,就是一个对象的备份模式,提供了一种程序数据的备份方法。当后悔时能撤销当前操作,使数据恢复到它原先的状态。 备忘录创建出来就要在“最近”的
实现观察者模式时要注意具体目标对象和具体观察者对象之间不能直接调用,否则将使两者之间紧密耦合起来,这违反了面向对象的设计原则。 定义定义对象间一种一对多的依赖关
组合模式也叫合成模式,有时又叫部分整体模式,主要是用来描述部分与整体的关系; 只要是树形结构, 就要考虑使用组合模式, 只要是要体现局部和整体的关系的时候, 而
btracebtrace是生产环境&预发的排查问题大杀器; 查看当前谁调用了ArrayList的add方法,同时只打印当前ArrayList的size大
从JDK1.2开始增加java.util.Iterator接口, 并逐步把Iterator应用到各个Collection聚集类中,Collection、List
适配器模式是一个补偿模式,通常用来解决接口不相容的问题 ,又叫变压器模式,也叫包装模式。 适配器模式最好在详细设计阶段不要考虑它,它不是为了解决还处在开发阶段的
当实现某一个功能存在多种算法或者策略,可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能。 如果使用多重条件转移语句实现即硬编码,不但使条件语句变得很
动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。是对继承的有力补充。 扩展一个类的功能会使用继承方式来实现。但继承具有静态特征
定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。 责任链模式
commons-lang312345<dependency> <groupId>org.apache.commons</group
命令模式是一个高内聚的模式 ,将一个请求封装成一个对象, 从而让你使用不同的请求把客户端参数化, 对请求排队或者记录请求日志, 可以提供命令的撤销和恢复功能 。
范式设计实际应用中经常需要混用范式设计和反范式设计,最常见的反范式化数据的方法是缓存表、汇总表,缓存表即在不同的表中存储相同的特定列,汇总表即汇总count等信
分库分表主要是为了解决因数据量太大而导致查询慢的问题以及应对高并发的问题;如果数据量太大就分表,若并发请求量高就分库;中大型项目中,一旦遇到数据量比较大,都知道
经常需要在容器启动时做一些钩子动作,比如注册消息消费者,监听配置等。 容器刷新完成扩展点监听容器刷新完成扩展点ApplicationListener<Co
常常会出现好多对象之间存在复杂的交互关系,这种交互关系常常是网状结构,它要求每个对象都必须知道它需要交互的对象。若把这种网状结构改为星形结构的话,将大大降低它们
用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。用这种方式创建对象非常高效,无须知道对象创建的细节。 在实际项目中,原型模式
对于分布式高并发系统需要考虑的问题:容量规划、架构设计、数据库设计、缓存设计、框架选型、数据迁移方案、性能压测、监控报警、领域模型、回滚方案、高并发、分库分表。
由于某些原因需要给某对象提供一个代理以控制对该对象的访问。访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。 代理模式是一个使用
建造者模式也叫生成器模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的
工厂方法模式工厂方法模式使用的频率非常高 ,用于创建对象的接口, 让子类决定实例化哪一个类。 工厂方法使一个类的实例化延迟到其子类 。用于封装和管理对象的创建,
模板方法模式非常简单应用非常广泛的模式,定义一个操作中的算法框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 A
高效并发是从JDK1.5到JDK1.6的一个重要改进,HotSpot虚拟机为了在线程之间更高效地共享数据,以及解决竞争问题,从而提高程序的执行效率在该版本上花费
注解一种标记式高耦合的配置方式,Java注解是从JDK1.5引入的。注解用于为Java代码提供元数据。作为元数据注解不直接影响代码执行。注解的本质就是一个Ann
线程的实现线程是CPU调度的基本单位,是比进程更轻量级的调度执行单位,线程可以把进程的资源分配和执行调度分开,各个线程既可以共享进程资源(内存地址、文件I/O)
所有的并发模式在解决线程安全问题时,采用的方案都是序列化访问临界资源。即同一时刻只能有一个线程访问临界资源,也称作同步互斥访问。 Java提供synchroni
redis的速度非常的快,单机的redis就可以支撑每秒10几万的并发,相对于mysql来说,性能是mysql的几十倍。速度快的原因主要有几点: 完全基于内存操
单例模式的核心代码就是将构造方法私有化,只有一个实例,自己负责创建自己的对象即自行实例化,提供一种访问其唯一对象的方式,可直接访问,不需要实例化该类的对象。 优
在说Volatile原理前先熟悉一下相关的基本概念原子性、可见性、有序性 Volatile原理关键字Volatile是Java虚拟机提供的最轻量级的同步机制,当
硬件效率与一致性计算机的存储设备与处理器的运算速度有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存来作为内存与处
代理的基础类 12345678910public interface Subject { void doSomething(String param)
反射主要指程序可以访问、检测和修改他本身状态和行为的一种能力,程序在运行时能获取自身的信息;对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象
数据存储结构JDK7中数据结构的存储由数组+链表的方式,因为数组是一组连续的内存空间,易查询,不易增删,而链表是不连续的内存空间,通过节点相互连接,易删除,不易
哈希算法 直接定址法:直接以关键字k或者k加上某个常数(k+c)作为哈希地址。 数字分析法:提取关键字中取值比较均匀的数字作为哈希地址。 除留余数法:用关键字k
基础 == 与 equals区别 hashCode和equals HashMap原理 如何解决hash冲突 扩展策略 Lambda表达式 final有哪些用法:
字节、字、位、比特1位 = 1比特, 1字节 = 8位,1字=2字节, 1Byte=8bit 1B = 8bit, 1KB = 1024B 位:计算机最小存储单
ThreadLocal是一个线程内部的存储类,可以在指定线程内存储数据,数据存储以后,只有指定线程可以得到存储数据。提供了线程内存储变量的能力,这些变量不同之处
设计模式分类23种设计模式大体上可以分为三类: 创建型模式(5个):对象实例化的模式,用于解耦对象的实例化过程; 结构型模式(7个):把类或对象结合在一起形成一
IoC容器概述依赖反转的概念:依赖对象的获得被反转了,基于该结论为控制反转创造了一个更好听的名字:依赖注入。依赖控制反转的实现方式有很多种,Spring中IoC
Spring子项目Spring Framework(core)包含一系列Ioc容器的设计,提供了依赖反转的实现,集成了AOP,还包含了MVC、JDBC、事务处理
时间复杂度常见的时间复杂度:O(1):常数复杂度,O(log n):对数复杂度,O(n):线性时间复杂度,O(n^2):平方,O(n^3):立方,O(2^n):
Unix是最早的多用户、多任务操作系统,按操作系统分类属于分时操作系统,Unix大多被用在服务器、工作站,现在也有用在个人计算机上。它在创建互联网、计算机网络或
左子树上所有节点的值均小于根节点的值,而右子树上所有结点的值均大于根节点的值。故二叉搜索树中序遍历是单调递增的。 插入的序列越接近有序,生成的二叉搜索树就越像一
平衡二叉树是一种特殊的二叉排序树,每个节点左子树和右子树高度差至多等于1。 将二叉树上节点左子树深度减去右子树深度的值称为平衡因子BF,平衡二叉树上所有节点的平
Spring AOP IOC 源码 SpringBoot SpringCloud 数据库 常见面试笔试内容 算法 树(前序遍历、中序遍历、后序遍历、层序遍历)
6大设计基本原则:单一职责原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特法则、开闭原则 单一职责原则SRP 单一职责原则提出了一个编写程序的标准,用职
IDEA中POM变更IDEA中由于POM中未配置maven-compiler-plugin插件可能导致每次POM发生变更时,Language level变成5,
Go语言是静态类型语言,所有的内存在 Go 中都是经过初始化的,当一个变量被声明之后,系统自动赋予它该类型的零值:int 为 0,float 为 0.0,boo
图可分为有向图和无向图,一般用G=(V,E)来表示图,V表示顶点,E表示通过图的边,常用邻接矩阵或者邻接表来描述一副图。图的遍历算法,根据访问节点的顺序,可
特点 每个节点有零个或多个子节点; 没有父节点的节点称为根节点; 每个非根节点有且仅有一个父节点; 除了根节点以外,每个子节点都可分为多个不相交的子树; 术语
什么是BeanFactory?它与ApplicationContext的区别?BeanFactory可以理解为含有bean集合的工厂类, 包含了种bean的定义
本文仅仅是对Excel中的数据进行了简单的读取抽出并统一输出到指定的地方,在读取老版本xls文件的时候可能会出现编码的问题导致文件读取失败:1UnicodeDe
十种常见的排序算法可分为比较类排序和非比较类排序。比较类排序通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类
Groovy是构建在JVM上的一个轻量级动态语言,其是Java实现的,与Java语法类是,能很好的与Java代码结合,及扩展现有代码。 Java在语音动态性方面
购买技巧 每到年中,年底,长的节假日前,国债逆回购利息都会比较高 国债逆回购收益最高一般出现在节假日前的第二天,一般是周四,此时逆回购收益是最高的 每年1月初的
指数基金 上证 50:主要投资大型企业, 50 是代表它所投资企业的数量 沪深 300:主要投资中大型企业,是国内影响力最大、最重要的指数基金,沪深300是从上
12345678910111213141516171819202122232425262728293031323334353637383940414243444
在某些情况下可能会需要将JAR包提供给第三方使用,但又不想泄露源码,可以对架包进行加密处理。可以使用xjar-maven-plugin插件对生成得JAR进行加密
在某些场景下,比如有N个产品,经常需要从这N个产品中抽取M个产品打包运行。而且每个产品都会持续迭代。若是将每个产品都写成一个项目会出现大量得重复代码,而且打包时
SM2为非对称加密,基于ECC 椭圆曲线密码机制。该算法已公开。由于该算法基于ECC,故其签名速度与秘钥生成速度都快于RSA。ECC 256位(SM2采用的就是
SM4 无线局域网标准的分组数据算法。对称加密,密钥长度和分组长度均为128位。 分组密码常用得五种模式,这里主要讲SM4的ECB模式: EBC-电码本模式 C
在Spring Cloud中可能会用到sleuth做链路追踪,以及内部链路中需要用到Header中得一些数据,在单线程是没有问题得,但是在某些场景下就会有问题,
PotPlayer非常好用的视频播放器。 Typora轻便简洁的Markdown编辑器,支持即时渲染 TeamViewer用于远程控制的应用程序 Notepad
ArthasJava 线上诊断工具 EasyExcel用来对 Java 进行解析、生成 Excel 的框架,它重写了 poi 对 07 版 Excel 的解析,
在项目中需要对某些接口进行限流和熔断处理,防止由于某些接口资源消耗过大影响到整个的所有接口,防止单独的依赖耗尽资源;对一些依赖服务进行隔离,防止当依赖服务不可用
旧的日期类是可变且线程不安全的,Java8中引入了一套全新的日期API,java.time包中的类是不可变且线程安全。 LocalDatejava.time.L
方法调用并不等同于方法执行,方法调用阶段唯一任务是确定被调用方法的版本,暂时不涉及方法内部具体运行过程。程序运行时,进行方法调用是最普遍最频繁的操作。 Clas
栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,是虚拟机运行时数据区中的虚拟机栈的栈元素。每个方法从调用开始至执行完成的过程,都对应一个栈帧在虚拟机栈中从
一般步骤 创建maven-plugin项目,打包方式必须为maven-plugin,可使用maven-archetype-plugin快速创建 编写插件目标,每
Maven为了支持构建的灵活性,内置了属性、Profile、资源过滤三大特性。 Maven属性Maven共有6类属性,分别为内置属性、POM属性、自定义属性、S
IT测试主要测试模块之间的接口和接口数据传递关系,以及模块组合后的整体功能。 在做集成测试时,若涉及到数据库的数据变更的,最好在测试过后将数据还原,可以先构建一
UT测试主要测试单元内部的数据结构、逻辑控制、异常处理等。单元测试实现容易、运行速度快、能完全控制被测试的单元不包含外部依赖、测试用例相互独立无依赖关系。能够帮
SonarQube的安装很简单,这里不做赘述。主要总结一下SonarQube的一些实际应用。 SonarQube Jenkins配置安装并配置好SonarQub
聚合Maven聚合又称为多模块,该特性是为了一次构件多个项目,而不用到每个项目下分别执行mvn命令。且聚合模块其打包方式packaging必须为pom否则无法构
Maven核心仅仅定义了抽象的生命周期,具体任务交给插件来完成,插件以独立的构件形式存在,Maven核心分发包不到3M大小,Maven会在需要时下载并使用插件。
坐标和依赖是任何一个构件在Maven世界中的逻辑表示方式,任何一个构件都有一组坐标唯一标识,而构件的物理表示方式是文件,Maven通过仓库来统一管理这些文件。
Maven的生命周期是抽象的,生命周期本身不做任何实际的工作,其实际行为都由插件来完成,生命周期和插件两者协同工作,密不可分。每个生命周期步骤都可以绑定一个或多
类生成插件配置1234567891011121314151617181920212223242526272829303132333435363738394041
Maven坐标详解groupId:定义当前Maven项目隶属的实际项目,不应该对应隶属的组织或公司,表示方式与Java包名表示方式类是。 artifactId:
Lombok1234<dependency> <groupId>org.projectlombok</groupId> &l
Java内存模型是围绕着在并发过程中如何处理原子性、可见性、和有序性这三个特征来建立的。 原子性Java内存模型要求lock、unlock、read、load、
Java中各种操作共享数据按照线程安全的安全程度由强至弱分为不可变、绝对线程安全、相对线程安全、线程兼容、线程对立; 不可变不可变的对象一定是线程安全的,只要一
互斥同步同步是指在多个线程并发访问共享数据时,保证共享数据在同一个时刻只被一个线程使用(或者是一些,使用信号量的时候),互斥是实行同步的一种手段,临界区、互斥量
在实际的项目中,可能会用到HTTP异步请求方式来提高系统的吞吐量。 同步请求客户端发起同步HTTP请求时,线程进入等待状态,直到接受到一个response对象或
Tomcat 的总体结构: Connector 和 Container 是Tomcat 两个核心组件。Connector 主要负责对外交流 ,Container
输出Gzip压缩在SpringBoot项目中启用输出Gzip压缩,需要添加如下配置。 123456789101112server: compression: e
查看索引1show index from compliance_page_info; 创建联合唯一性索引1234567alter table complianc
source /etc/profile: 使配置文件生效ps -aux | grep java:查看进程jstat -gcutil 30996 3000 :每3
排序在用到Stream做排序时,如果数据存在null值就会抛出空指针异常,可能最理想的方式排除空值的内容进行排序,最后将空值的内容排在最后或者最前面。 下面的示
断言在对接口进行测试时,通常需要对接口调用结果进行断言,以确定接口调用是否达到预期,同时也可以在结果数中看到接口是否调用成功。响应断言和jp@gc - JSON
HTTPS请求LoadRunner对HTTPS接口进行测试时,最好加上web_set_sockets_option("SSL_VERSION"
把类加载阶段中通过类的全限定名来获取描述此类的二进制字节流的动作放到Java虚拟机外部去实现,以便让程序自己决定如何去获取所需的类,实现该动作的代码模块称为类加
Class文件中描述的各种信息最终都需要加载到虚拟机中之后才能运行和使用,虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最
Java虚拟机指令是由一个字节长度、代表某种特定操作含义的数字操作码Opcode以及跟随其后的零至多个代表此操作所需参数操作数Operands而构成。但由于Ja
在Class文件、字段表、方法表都可以携带自己的属性表集合,属性表集合不要求各个属性表具有严格顺序。 属性名称 使用位置 含义 Code 方法表 Java代码编
12345678910111213141516171819202122232425262728293031323334353637383940414243444
本地Jar包发布将本地的jar包发布到本地的Maven仓库中,-Dfile是需要上传的jar包的绝对路径,-DgroupId构成该jar包在pom.xml的坐标
IDEA中POM变更IDEA中由于POM中未配置maven-compiler-plugin插件可能导致每次POM发生变更时,Language level变成5,
各种不同平台的虚拟机与平台都统一使用的程序存储格式——字节码是构成平台无关性的基石。 虚拟机也是语言无关的,实现语言无关性的基础任然是虚拟机和字节码存储格式。J
Linux中每个装置都被当成一个文件,硬盘文件名为/dev/sd[a-p],若使用的是云机,可能得到的是虚拟机,虚拟机内的磁盘是使用仿真器生成的磁盘文件名为/d
Java体系技术中所提倡的自动内存管理最终可以归结为自动化地解决两个问题:给对象分配内存以及回收分配给对象的内存。 对象的内存分配,往大的方向讲就是在堆上分配,
对于Java应用可以通过一些配置把程序运行过程中的GC日志全部打印出来,然后分析GC日志得到关键性指标,分析GC原因,调优JVM参数。打印GC日志方法,在JVM
Git文件状态变化周期工作目录下每个文件都只有两种状态:已跟踪和未跟踪。 已跟踪的文件是指那些被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间
git checkout -b localbranch remotebranch 基于远程分支创建本地分支git reset --head commit_id
Minor GC新生代通常存活时间比较短,是基于复制算法进行回收的。从年轻代空间(包括Eden和两个Survivor区域)回收内存被称为Minor GC。 当J
JVM内存池JVM共享内存区域或者叫内存池分堆和方法区或者称为永久代(Permgen)两块,其中堆内存分为年轻代(Young)和老年代(Tenured),而年轻
垃圾收集器是内存回收的具体实现。Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定。 两者之间存在连线的收集器可以相互搭配使用,收集器所处区域表示其属于
标记清除算法标记清除算法是最基础的收集算法,分为标记和清除两个阶段,标记阶段标记出所有需要回收的对象,清除阶段统一回收所有被标记的对象。之所以说标记清除算法是最
Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人想出来。 了解GC和内存非配的目的是:当需要排查各种内存溢出
Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人想出来。 运行时数据区域Java虚拟机在执行Java程序的过
Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人想出来。 堆溢出堆中存储的是对象的实例,只要不断的创建对象,
Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人想出来。 对象的创建Java中创建对象(例如克隆、反序列化)
对于TCP/IP网络在网络通信过程中,通常数据从应用层到数据链路层会被层层封装加上各层的报头,在数据链路层会加上以太网的报头,而以太网的报头中包含目标MAC地址
在经历了持续不断的需求,通常多个需求会同时开发,以及发布情况复杂很多时候需求上不了,需要回退代码且版本管理混乱后,通过别人的建议和自己的思考,总结了一些自己觉得
以太网属于TCP/IP协议族四层概念模型的最底层数据链路层,以太网网络通信信号的基本单元是以太网帧,帧的最小长度是64字节。以太网帧的基本机构如下图所示: 前导
搭建网络的主要设备及其作用 设备 作用 网卡 使计算机联网的设备 中继器 从物理层上延长网络的设备 网桥/2层交换机 从数据链路层上延长网络的设备 路由器/3层
再看一些书或者是在一些博客时,会发现有的地方将TCP/IP协议族定义为一个四层参考模型,而有的地方又将其定义为五层参考模型。 四层参考模型主要包括:应用层、传输
基本快捷键Ctrl + C 快速复制当前行Ctrl + D 复制当前行到下一行Ctrl + E 最近的文件Ctrl + G 定位行和列,很多时候通过行号找东西非