- 博客(301)
- 资源 (43)
- 收藏
- 关注
原创 向上汇报模板
1、这周主要做了哪些事情(可分几点)2、完成的进度是怎么样(结果、输出、尽量数字化)3、接下来要干嘛(规划)、需协调的工作4、暴露出遇到的问题或者建议,需要解决。不是对公开讲话没自信,而是欠缺逻辑表达能力。汇报者思考两点:项目有哪些风险需要领导关注并提供支持;项目哪些地方做的好,需要领导们知晓(不提倡只闷头做老黄牛)。作为接收汇报的角色,需要思考:如何减少汇报成本,不让员工为了汇报而汇报;如何鼓励员工对暴露风险无所顾及,主动展示项目真实情况,汇报不流于形式。很多人向领导汇报,停
2022-03-04 23:34:31
386
原创 通俗易懂讲解IO模型
Java I/O模型所谓的I/O就是计算机内存与外部设备之间拷贝数据的过程,因此CPU是先把外部设备的数据读到内存里,然后再进行处理。对于一个网络I/O通信过程,比如网络数据读取,会涉及两个对象,一个是调用这个I/O操作的用户线程,另外一个就是操作系统内核。一个进程的地址空间分为用户空间和内核空间,用户线程不能直接访问内核空间。当用户线程发起I/O操作后,网络数据读取操作会经历两个步骤:用户线程等待内核将数据从网卡(外部设备)拷贝到内核空间。内核将数据从内核空间拷贝到用户空间。各种I/O模型
2020-08-09 14:10:38
524
2
原创 结构化思维
结构化思维,就是面对问题的时候你可以通过某种结构,把它拆解成一个个你能解决的部分。养成结构化思维的习惯,可以让你做到思维清晰、表达有力,并让生活和工作更加有品质,高效率。金字塔结构图结构化思维就是一种从无序到有序的思考过程。你可以建立一个“先总后分”的立体化分析方式。先看能够解决问题的关键方面,然后再往下分析,从而实现从总体到局部的鸟瞰,而不再拘泥于细节。最顶端就是你需要解决的问题,下一层是支撑解决问题的不同方面,再下一层就是支持这些不同方面的原因。一、如何识别筛选信息1、你有明确的目标,或
2020-08-09 13:38:42
1622
1
转载 项目管理心得
今天,我就跟你分享关于项目管理的一些经验和感悟,希望能给你带来启发。1. 影响力大于权力作为项目经理一定要依靠影响力来组织团队。即便是在临时组成的短期项目组里,也要有意识地建立和利用影响力。千万不要抱有“我是这个项目的项目经理,所以你们要听我的”,这样的态度和言行,否则很容易让项目组内部出现罅隙。在另一些情况下,我们也有可能会获得明确的行政权力,比如一些长期项目可能会单独建立团队编制,或者,绩效考核时,项目经理可以拥有一定的权限等等。我的建议是:即便在这种情况下,也要尽可能利用影响力而不是权力来组织
2020-08-02 23:16:53
1386
转载 关于传统的贫血模型和DDD的充血模型
什么是基于贫血模型的传统开发模式?对于大部分的后端开发工程师来说,MVC 三层架构都不会陌生。它将整个项目分为三层:展示层、逻辑层、数据层。MVC 三层开发架构是一个比较笼统的分层方式。像 UserBo 这样,只包含数据,不包含业务逻辑的类,就叫作贫血模型(Anemic Domain Model)。同理,UserEntity、UserVo 都是基于贫血模型设计的。这种贫血模型将数据与操作分离,破坏了面向对象的封装特性,是一种典型的面向过程的编程风格。什么是基于充血模型的 DDD 开发模式?在贫血模
2020-08-01 16:15:22
1413
3
转载 工作能力强的人有哪些共同特征?
1、拥有全局观,合理制定任务目标越是工作能力强的人,越是能够从全局出发,了解公司/部门最终的核心目的是什么?为了这个目的我们要做什么?(细化任务)如何才算是做好?至少要达到什么水平?(制定任务目标)从全局出发、从根本目的出发,细化工作目标,制定工作任务,有目标有方向地使劲干,而不是抓起来就像“无头苍蝇”一般蛮干。2、对任务的优先级有明确的划分每一个目标下,都会有大量的任务。面对大量的任务,工作能力强的人一般都会自己手头的任务进行明确的优先级划分,从而合理地规划自己的时间精力,分配人力。3、规划能力
2020-07-20 22:06:58
462
1
转载 成了历史古迹的CAP定理
CAP最初是作为一个经验法则提出的,没有准确的定义,目的是开始讨论数据库的权衡。那时候许多分布式数据库侧重于在共享存储的集群上提供线性一致性的语义,CAP定理鼓励数据库工程师向分布式无共享系统的设计领域深入探索,这类架构更适合实现大规模的网络服务。 对于这种文化上的转变,CAP值得赞扬 —— 它见证了自00年代中期以来新数据库的技术爆炸(即NoSQL)。CAP有时以这种面目出现:一致性,可用性和...
2020-04-24 01:09:38
305
1
原创 Redis重新选举导致数据丢失问题分析
一、数据丢失的情况异步复制同步丢失集群产生脑裂数据丢失1、异步复制丢失对于Redis主节点与从节点之间的数据复制,是异步复制的,当客户端发送写请求给master节点的时候,客户端会返回OK,然后同步到各个slave节点中。如果此时master还没来得及同步给slave节点时发生宕机,那么master内存中的数据会丢失;要是master中开启持久化设置数据可不可以保证不丢失呢?答案是...
2020-04-08 17:49:58
948
1
原创 CMS、G1、ZGC的堆内存实现区别
每次被问到Java的堆内存是如何细分?很多人回答这个问题的时候,都是上来就直接说新生代和老年代,以为所有算法的内存实现都一样。其实CMS、G1、ZGC的堆内存实现是不同的。我们可以从这三种垃圾回收器的堆内存实现更好地回答这个问题。CMSCMS堆内存和以往的垃圾回收器一样,分为新生代和老年代,新生代和老年代是物理隔离的。这些space必须是地址连续的空间。G1G1打破了以往将收集范围...
2020-03-25 03:31:50
2719
2
原创 关于安全点和安全区域
安全点安全点,即程序执行时并非在所有地方都能停顿下来开始GC,只有在到达安全点时才能暂停。Safepoint的选定既不能太少以至于让GC等待时间太长,也不能过于频繁以致于过分增大运行时的负荷。安全点的初始目的并不是让其他线程停下,而是找到一个稳定的执行状态。在这个执行状态下,Java虚拟机的堆栈不会发生变化。这么一来,垃圾回收器便能够“安全”地执行可达性分析。只要不离开这个安全点,Java虚拟...
2020-01-05 00:10:32
2052
2
转载 Linux零拷贝技术
1、为什么需要零拷贝传统的 Linux 系统的标准 I/O 接口(read、write)是基于数据拷贝的,也就是数据都是 copy_to_user 或者 copy_from_user。好处:通过中间缓存的机制,减少磁盘 I/O 的操作坏处:大量数据的拷贝,用户态和内核态的频繁切换,会消耗大量的 CPU 资源,严重影响数据传输的性能。2、什么是零拷贝零拷贝就是这个问题的一个解决方案,通...
2019-12-31 21:19:07
2325
1
原创 Redis无法获取资源(Could not get a resource from the pool)解决方法
问题出现的原因:长时间很频繁的对redis进行读或者写的操作时,会出现“Could not get a resource from the pool”的错误。出现此错误后,“Jedis jedis = jedisPool.getResource()”中的jedisPool已经无法从连接池中再获取jedis资源对象,就导致池中无可用资源,所以会出现无法获取新的资源。解决方法:Jedis 对象...
2019-12-06 19:35:15
3491
原创 关于zookeeper核心的8个问题
1. zookeeper是什么,都有哪些功能Zookeeper是一个树形数据结构的高性能的分布式应用程序的协调服务。拥有以下功能:1、命名服务(naming):是指通过指定的名字来获取资源或者服务的地址,提供者的信息。保证服务全局唯一。2、配置管理(configuration management):将配置信息保存在Zookeeper的某个目录节点中,然后将所有需要修改的应用机器监控...
2019-10-26 13:22:34
475
原创 MyBatis源码解析(六) --- 连接池
mybatis支持3种数据源:UNPOOLED,POOLED,JNDIUNPOOLEDUnPooledDataSource的getConnection()方法实现如下:/* * 获取数据连接 */private Connection doGetConnection(Properties properties) throws SQLException{ //1.初始化驱动 ...
2019-09-15 23:58:30
226
1
原创 并发编程——详解 CLH 锁
CLH lock is Craig, Landin, and Hagersten (CLH) locks, CLH lock is a spin lock, can ensure no hunger, provide fairness first come first service.The CLH lock is a scalable, high performance, fairness ...
2019-09-12 21:11:28
588
1
转载 领域驱动设计(DDD)实现之路
前言2004年,当Eric Evans的那本《领域驱动设计——软件核心复杂性应对之道》(后文简称《领域驱动设计》)出版时,我还在念高中,接触到领域驱动设计(DDD)已经是8年后的事情了。那时,我正打算在软件开发之路上更进一步,经同事介绍,我开始接触DDD。我想,多数有经验的程序开发者都应该听说过DDD,并且尝试过将其应用在自己的项目中。不知你是否遇到过这样的场景:你创建了一个资源库(Repos...
2019-08-25 17:30:59
6997
3
原创 阻塞队列BlockingQueue源码分析
介绍BlockingQueue通常用于一个线程在生产对象,而另外一个线程在消费这些对象的场景,例如在线程池中,当运行的线程数目大于核心的线程数目时候,经常就会把新来的线程对象放到BlockingQueue中去。阻塞队列原理原理简单的来讲:就是一个线程往队列里面放,而另外的一个线程从里面取当线程持续的产生新对象并放入到队列中,直到队列达到它所能容纳的临界点。注意,队列的容量是有限的,不可能...
2019-08-22 11:00:17
295
原创 MyBatis源码解析(五) --- SQL执行流程
前面分析了配置文件和映射文件的解析过程。经过前面复杂的解析过程后,现在, MyBatis 已经进入了就绪状态,等待使用者发号施令。本章将对 MyBatis 执行 SQL 的过程进 行较为详尽的分析。包括但不限于以下技术点:为 mapper 接口生成实现类根据配置信息生成 SQL,并将运行时参数设置到 SQL 中一二级缓存的实现插件机制数据库连接的获取与管理查询结果的处理,以及延迟加载...
2019-08-11 23:17:26
508
1
转载 MyBatis源码解析(四) --- 解析Mapper节点
映射文件包含多种二级节点,比如 ,,以及 <select|insert|update|delete> 等。除此之外,还包含了一些三级节点,比如 ,, 等。这些节点的解析过程将会在接下来的内容中陆续进行分析。在分析之前,我们 先来看一个映射文件配置示例。<mapper namespace="xyz.coolblog.dao.AuthorDao"> <cac...
2019-08-11 20:56:44
347
1
转载 MyBatis源码解析(三) --- 映射文件解析
映射文件用于配置 SQL 语句,字段映射关系等。映射文件中包含、、、、 <select|insert|update|delete>等二级节点,这些节点将在接下来内容中进行分析。1、映射文件解析解析入口映射文件的解析过程是配置文件解析过程的一部分,MyBatis 会在解析配置文件的过程 中对映射文件进行解析。解析逻辑封装在 mapperElement 方法中,下面来看一下。// -...
2019-08-11 17:25:42
221
1
转载 MyBatis源码解析(一) --- 配置文件解析
MyBatis给我们提供丰富的配置来满足我们的需求,本文会对MyBatis的配置文件解析过程进行分析, 其中包含但不限于 properties、 settings、typeAliase、typeHandlers 等。1、配置文件解析入口在单独使用 MyBatis 时,第一步要做的事情就是根据配置文件构建SqlSessionFactory对象。相关代码如下:String resource = ...
2019-08-11 12:18:43
319
1
转载 MyBatis源码解析(二) --- 反射模块Reflector
本文主要介绍MyBatis的反射模块是如何实现的。DefaultReflectorFactory 源码分析基础支持层反射模块Reflector/ReflectorFactory,DefaultReflectorFactory 用于创建 Reflector,同时兼有缓存的功能,它的源码如下。public class DefaultReflectorFactory implements Ref...
2019-08-11 10:25:09
493
2
转载 Tomcat自带数据库连接池源码分析
目的通过阅读tomcat-jdbc的源码以学习一个数据库,或者可以扩展到更广意义上的连接池的实现。选择tomcat-jdbc的原因是足够的轻量,源码足够的简洁,同时又不失核心的功能。本工程基于JDK 9构建,在JDK 8上不需要额外的引入多余的依赖便可以使用javax.annotation包下的注解,但在JDK 9上不行,具体的解决方案可以参考:Java 9: how to get ac...
2019-08-10 21:46:28
1062
2
转载 解密Kafka吞吐量高的原因
众所周知kafka的吞吐量比一般的消息队列要高,号称the fastest,那他是如何做到的,让我们从以下几个方面分析一下原因。生产者(写入数据)生产者(producer)是负责向Kafka提交数据的,我们先分析这一部分。Kafka会把收到的消息都写入到硬盘中,它绝对不会丢失数据。为了优化写入速度Kafak采用了两个技术,顺序写入和MMFile。顺序写入因为硬盘是机械结构,每次读写都会寻...
2019-07-25 02:08:40
2456
1
原创 浅谈CMS垃圾收集器
介绍CMS(Concurrent Mark-Sweep)是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。对于要求服务器响应速度的应用上,这种垃圾回收器非常适合。在启动JVM参数加上-XX:+UseConcMarkSweepGC ,这个参数表示对于老年代的回收采用CMS。CMS采用的基础算法是:标记–清除CMS过程1、初始标记2、并发标记3、并发预清除4、重新标记5、并发清...
2019-07-25 01:36:25
1022
1
原创 深入理解G1垃圾收集器
G1(Garbage First)垃圾收集器是当今垃圾回收技术最前沿的成果之一。早在JDK7就已加入JVM的收集器大家庭中,成为HotSpot重点发展的垃圾回收技术,JDK9 默认就是使用的G1垃圾收集器。不同于其他的分代回收算法,G1最大的特点是引入分区的思路,弱化了分代的概念,合理利用垃圾收集各个周期的资源,解决了其他收集器甚至CMS的众多缺陷。每块区域既有可能属于O区、也有可能是Y区,且每...
2019-07-25 00:02:51
1104
1
转载 堆外内存(直接内存)
1、堆外内存定义内存对象分配在Java虚拟机的堆以外的内存,这些内存直接受操作系统管理(而不是虚拟机),这样做的结果就是能在一定程度上减少垃圾回收对应用程序造成的影响。使用未公开的Unsafe和NIO包下ByteBuffer来创建堆外内存。2、为什么使用堆外内存1、减少了垃圾回收使用堆外内存的话,堆外内存是直接受操作系统管理(而不是虚拟机)。这样做的结果就是能保持一个较小的堆内内存,以减少...
2019-05-26 11:54:03
1334
2
原创 Linux性能优化实战
平均负载预先安装stress和sysstat,如apt install stress sysstatstrees是linux压力测试工具,用来mo模拟负载升高sysstat是linux性能工具,用来监控和分析系统的性能,主要用到的两个命令mpstat用来实时查看每个cpu的性能指标及所有cpu的平均指标pidstat是进程性能分析工具,实时查看进程的cpu、内存、IO以及上下文切换等性...
2019-05-08 23:25:54
2653
1
原创 Nginx学习笔记
Nginx的中间件架构什么是中间件,应用与应用之间的交互,应用与操作系统的交互。1、Nginx简述Nginx是一个开源且高性能、可靠的HTTP中间件、代理服务。2、为什么选择nginx?原因一、 IO多路复用epoll多个描述符的IO操作都能在一个线程内并发交替地顺利完成,这就叫IO多路复用,这里的“复用”指的是复用同一个线程。什么是epoll?IO多路复用的实现方式selec...
2019-05-06 10:13:26
2092
1
原创 Spring源码深度解析(三)---创建AOP代理
前言我们都知道要使用AOP需要自定义配置完成对AnnotationAwareAspectJAutoProxyCreator类型的自动注册。当Spring加载这个bean时会在实例化前调用其postProcessAfterInitialization方法,对于AOP逻辑的分析由此开始。创建代理流程在父类AbstractAutoProxyCreator的postProcessAfterIniti...
2019-05-04 18:49:21
437
原创 B+树和LSM树比较
由于传统的机械磁盘具有快速顺序读写,慢速随机读写的访问特性,为了改变这个特性,文件系统或数据系统通常会对数据进行排序后存储,加快数据检索速度,这就需要保证数据在不断更新、插入、删除保持依然有序,目前最广泛的做法就是使用B+树和LSM树。B+树B+树是一种专门针对磁盘存储而优化的N叉排序树,以树节点为单位存储在磁盘中,从根开始查找所需数据所在的节点编号和磁盘位置,将起加载到内存中然后继续查找,直...
2019-05-04 01:43:48
3511
原创 Spring源码深度解析(二)---循环依赖问题
什么是循环依赖循环依赖就是循环引用,就是老公或者多个bean相互之间的持有对象,比如A依赖B,B依赖C,C依赖A,则它们最终形成一个环。实例化bean的过程需要对循环依赖的解决。Spring如何解决循环依赖Spring容器循环依赖包括构造器循环依赖和setter循环依赖1、构造器循环依赖表示通过构造器注入构成的循环依赖是无法解决的,只能抛异常BeanCurrentlyInCreatio...
2019-05-03 22:43:33
943
原创 InnoDB关键特性-插入缓存,两次写,自适应hash索引,异步IO
插入缓存(Insert Buffer)作用:提高非聚集索引插入的性能对于非聚集索引叶子节点的插入若不是顺序的,就需要离散地访问非聚集索引页,随机读取的存在会导致插入操作性能下降。然而有了Insert Buffer后,对非聚集索引的插入或更新操作,不是每次直接插入到索引页中,而是先判断插入的非聚集索引页是否在缓存池中,若在,则直接插入,若不在,则先放在到一个Insert Buffer对象中。再...
2019-04-12 00:09:23
337
转载 Java并发之AQS详解
一、概述 谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)! 类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch...。 以下是本文的目录大纲:...
2019-04-03 10:00:43
282
转载 RabbitMQ进阶
消息何去何从mandatory和immediate是channel.basicPublish方法两个参数,都有当消息传递过程不可达到目的地时会将消息返回给生产者的功能mandatory参数当mandatory参数设为true时,交换器无法根据自身的类型和路由键找到一个符合条件的队列,那么RabbitMQ会调用Basic.Return命令将消息返回给生产者。当mandatory参数设置为fal...
2019-03-10 22:11:54
1042
原创 浅谈Buffer I/O 和 Direct I/O
通常来说,文件I/O可以分为两种:Buffer I/ODirect I/OBuffer I/O缓存 I/O 又被称作标准 I/O,大多数文件系统的默认 I/O 操作都是缓存 I/O。 在 Linux 的缓存 I/O 机制中,这种访问文件的方式是通过两个系统调用实现的:read() 和 write()。调用read()时,如果 操作系统内核地址空间的页缓存( page cache )有...
2019-03-08 16:51:36
10394
1
原创 浅谈JVM OOP-Klass二分模型
OOP-Klass二分模型介绍HotSpot中采用OOP-Klass模型用来描述Java对象实例OOP或OOPS(Ordinary Object Pointer)指的是普通对象指针,主要职能是表示对象的实例数据而Klass用来描述对象实例的具体类型,实现语言层面的Java类。OOP在Java应用程序运行过程中,每创建一个Java对象,在JVM内部也会相应创建一个OOP对象来表示Jav...
2019-03-06 23:41:35
3380
原创 RabbitMQ入门
介绍RabbitMQ是一个由erlang开发的基于AMQP(Advanced Message Queue)协议的开源实现。RabbitMQ整体上是一个生产者和消费者模型,主要负责接收、存储和转发消息。是当前最主流的消息中间件之一。RabbitMQ的整体模型架构如下图:生产者和消费者生产者生产者创建消息,然后发布到RabbitMQ中。消息包括(消息体和标签),RabbitMQ会根据标签把...
2019-02-16 11:14:18
366
原创 LeetCode题型总结(Java)
LeetCode of algorithms with Java solution二分查找[704] Binary Search[441] Arranging Coins[222] Count Complete Tree Nodes[162] Find Peak Element[744] Find Smallest Letter Greater Than Target[2...
2019-01-09 18:55:39
2614
原创 关于JMH运行ERROR: transport error 202: connect failed: Connection refused ERROR解决
ERROR: transport error 202: connect failed: Connection refusedERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_INIT(510)JDWP exit error AGENT_ERROR_TRANSPORT_INIT(197): No transports ...
2018-12-08 00:45:22
11306
6
大型网站技术架构+核心原理与案例分析+李智慧 (带书签).pdf
2017-09-05
思维导图.rar
2019-07-19
Java高级架构师面试必备思维导图
2019-06-08
异常值处理
2018-06-26
基于Springboot高并发商品限时秒杀系统
2018-06-21
基于Zookeeper+Netty+Protostuff实现的简单RPC框架源码
2018-06-21
一款社交APP,采用EasyUI+环信+百度地图+MVP进行开发源码
2018-06-21
Java后端面试知识点总结
2018-06-21
android面试题集锦(珍藏)
2018-02-06
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人