- 博客(109)
- 收藏
- 关注
原创 无锁编程的原理和应用
一、基于锁的编程的缺点在传统的多线程编程中,多线程之间一般用各种锁的机制来保证正确的对共享资源进行访问和操作。只要需要共享某些数据,就应当将对它的访问串行化。比如像++count(count是整型变量)这样的简单操作也得加锁,因为即便是增量操作这样的操作,实际上也是分三步进行的:读、改、写(回)。在使用锁机制的过程中,即便在锁的粒度、负载、竞争、死锁等需要重点控制的方面解决的很好,也无法彻...
2018-02-25 10:04:19 1482
原创 Java从基础到架构总结
一、数据结构和算法常用数据结构 数组:大小固定的数据结构。顺序存储,随机访问。链表:链表存储,顺序访问。主要有循环单链表,双向链表,循环双向链表。堆:二叉堆。栈:又叫LIFO表,后进先出。限制插入和删除只能在栈顶进行操作。队列:又叫FIFO表,先进先出。限制删除只能在对头进行操作,插入只能在队尾进行操作。二叉树算法思想 算法分析:按照时间复杂度和空间复杂度。算法思想:递推、...
2018-02-24 12:58:13 749
原创 关系型数据库设计总结
一、设计阶段流程规划阶段:主要工作是对数据库的必要性和可行性进行分析。确定是否需要使用数据库,使用哪种类型的数据库,使用哪个数据库产品。概念阶段:主要工作是收集并分析需求。识别需求,主要是识别数据实体和业务规则。对于一个系统来说,数据库的主要包括业务数据和非业务数据,而业务数据的定义,则依赖于在此阶段对用户需求的分析。需要尽量识别业务实体和业务规则,对系统的整体有初步的认识,并理解数据的流...
2018-02-23 17:34:27 2247
原创 Java并发包之Lock锁和Condition条件
一、Synchronizedsynchronized是Java的一个关键字,也就是Java语言内置的特性,如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,执行代码块时,其他线程便只能一直等待,等待获取锁的线程释放锁,而获取锁的线程释放锁会有三种情况: 1. 获取锁的线程执行完该代码块,然后线程释放对锁的占有。 2. 线程执行发生异常,此时JVM会让线程自动释放锁。...
2018-02-23 15:00:37 1511
原创 Java并发包之闭锁/栅栏/信号量
一、Java多线程总结:描述线程的类:Runable和Thread都属于java.lang包。内置锁synchronized属于jvm关键字,内置条件队列操作接口Object.wait()/notify()/notifyAll()属于java.lang包。提供内存可见性和防止指令重排的volatile属于jvm关键字。而java.util.concurrent包(J.U.C)中包含的是...
2018-02-23 12:08:11 2960
转载 Java异常的设计原则
原文地址:https://www.jianshu.com/p/1e0199e3c34e每个软件都可能遇到异常,所以从设计阶段就要考虑异常处理的问题,纳为业务流程的一部分。异常是需要妥善处理的,但是处理的前提是发现异常,而发现异常的前提的对异常有清楚的认识,我们要先认识到程序中都有什么样的异常(定义异常),然后在程序结构中检测和抛出异常(捕获异常),最后用恰当的业务流程去分别处理(处理异常)...
2018-02-23 10:19:51 394
原创 spring原理总结
Spring中的Scope的作用Scope为对象在Spring容器中的创建方式,也可以理解为对象在容器中的生命周期。Scope的类型有:Single、Prototype、Request、Session、Global Session五种: Single:单例模式,从容器启动到第一次getBean被实例化后,就一直存在于容器中,知道容器退出或销毁。Prototype:多例模式,每次getB...
2018-02-12 14:09:49 356
原创 系统设计总结
不好的设计的几个特性:僵化性:很难对系统进行改动,因为每个改动都会迫使许多对系统其他部分的改动。脆弱性:对系统的改动会导致系统中和改动的地方在概念上无关的许多地方出现问题。牢固性:很难解开系统的纠结,使之成为一些可在其他系统重用的组件。粘滞性:做正确的事情比做错误的事情要困难。不必要的复杂性:设计中包含有不具任何直接好处的基础结构。不必要的重复:设计中包含有重复的结构,而该重复的结...
2018-02-12 10:47:13 1674
原创 大流量和高并发应对手段总结
大流量和高并发的常规应对手段扩容、动静分离、缓存、服务降级和限流。限流的常用算法和实践思路目前主流的算法主要有三种:令牌桶算法、漏桶算法和计数器算法。 令牌桶算法:主要限制流量的流入速率,允许出现一定程度的突发流量。Nginx的限流模块就是使用的这种算法实现的。 每秒会有r个令牌按照固定速率放入桶中。桶的容量是固定不变的,如果桶满了再放入令牌,则溢出。若桶中的可用令牌不足...
2018-02-12 10:25:44 5006
原创 导致系统性能卡又慢的原因汇总(不断补充)
系统的配置参数没有正确配置,如数据库,redis等。具体可以参考:项目性能优化参数配置汇总TCP的配置,在特定的场景中,有可能会遇到延迟的ACK,它会限制链路上所发送的数据包,每秒钟只会有2-5个数据包。这是因为TCP两个算法所引起的死锁:Nagle以及TCP Delayed Acknowledgement。在200-500ms的超时之后,会打破这个死锁,但是微服务之间的通信却会分别受到影响。...
2018-02-11 17:35:06 1812
原创 项目性能优化参数配置汇总
nginx(在nginx.conf配置文件里面)worker_processes:启动进程,跟CPU核数相同。worker_connections:单个进程的最大并发数,所以nginx的最大并发数即worker_processes*worker_connections。tomcat(server.xml)protocol:服务器协议,目前我们使用的是Http11AprPro...
2018-02-11 17:07:35 557
原创 netty原理总结(未完、待续)
UNIX提供了5中I/O模型阻塞I/O模型:在进程空间中调用recvfrom,其系统调用直到数据包到达且被复制到应用进程的缓冲区中或者发生错误时才返回,期间会一直阻塞等待。非阻塞I/O模型:recvfrom从应用层到内核的时候,如果缓冲区没有数据,就返回一个EWOULDBLOCK错误,然后一直轮询检查这个状态,看内核是不是有数据到来。I/O复用模型: select/poll:进程通过将...
2018-02-11 16:53:54 308
原创 mysql总结
MySQL Query Optimizer基本工作原理当客户端向MySQL请求一条Query,命令解析器模块完成请求分类,区别出是SELECT并转发给MySQL Query Optimizer时,MySQL Query Optimizer首先会对整条Query进行优化,处理掉一些常量表达式的预算,直接换算成常量值。并对Query中的查询条件进行简化和转换,如去掉一些无用或显而易见的条件、结构调...
2018-02-11 16:48:30 279
原创 java虚拟机JVM总结
内存模型:程序计数器、虚拟机栈、本地方法栈、堆、方法区(永久代)程序计数器(counter) 线程私有。是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。唯一一个在Java 虚拟机规范中没有规定任何OutOfMemoryError情况的区域。虚拟机栈(VM stack) 线程私有,使用连续的...
2018-02-11 15:54:51 276
原创 nginx原理总结
nginx后端节点健康检查主要有三种实现方式: 1. 本身自带的ngx_http_proxy_module模块和ngx_http_upstream_module模块,惰性检测。ngx_http_proxy_module:proxy_connect_timeout(与后端服务器建立连接的超时时间)、proxy_read_timeout(从后端服务器读取响应的超时)和proxy_next_up...
2018-02-11 09:51:31 385
原创 《亿级流量网站架构核心技术》总结
nginx后端节点健康检查主要有三种实现方式: 1. 本身自带的ngx_http_proxy_module模块和ngx_http_upstream_module模块,属于惰性检测。 ngx_http_proxy_module:proxy_connect_timeout(与后端服务器建立连接的超时时间)、proxy_read_timeout(从后端服务器读取响应的超时)和proxy_next...
2018-02-10 15:45:35 6416 1
原创 《人人都是架构师》总结
警惕Dubbo因超时和重试引起的系统雪崩超时时间一定要设置,要根据业务场景而定,设置太短容易引发重试,设置太长容易引发请求堆积。超时设置过短的后果:Dubbo默认失败重试2次,所以假设有1000个并发,都超时了,则会重试2次,变成3000个请求,导致请求流量翻了3倍。重试设置:写服务一般要考虑幂等性,所以失败后不进行重试。Dubbo重试的集中容错方案: failover(失败重试其他...
2018-02-10 15:30:30 1060
原创 《JAVA程序性能优化》总结
设计优化单例模式:延时加载(内部类)。反射和序列化会破坏单例代理模式:延时加载 静态代理:包括主题接口、真实主题、代理类、main。初始化时使用代理,真正使用时再通过代理加载真实主题。动态代理:jdk动态代理、CGLIB、javassist基于动态代码的代理、ASM。动态加载过程(以CGLIB为例): 根据指定的回调类生成class字节码,并保存在byte数组中。通过反射,调用C...
2018-02-10 15:23:28 645
原创 《构建高性能web站点》总结
数据发送的过程(从主机到线路的过程)应用程序首先将数据写到该进程的地址空间中。应用程序通过系统函数库接口向内核发出系统调用,系统内核将这些数据从用户态内存复制到内核缓冲区中。(内核缓冲区大小有限,所有数据都以队列的方式进入这里)。数据写入内核缓冲区后,内核通知网卡控制器来取数据,将数据复制到网卡的缓冲区中。网卡缓冲区将要发送出去的数据进行字节到位的转换(二进制),然后依次发出。...
2018-02-10 14:53:11 368
原创 消息队列原理总结
消息队列应用的场景业务解耦:消息队列要解决的最本质问题,实现设计的单一性原则,不耦合其他模块的业务。最终一致性:用来处理延迟不那么敏感的“分布式事务”场景或者不重要的业务。广播:下游有很多系统关心你的系统发出的通知的时候。错峰和流控:上下游系统处理能力存在差距的时候,利用消息队列做一个通用的“漏斗”。在下游有能力处理的时候,再进行分发。为什么消息队列需要broker(消息队列...
2018-02-09 17:40:30 7698 1
原创 redis原理总结
redis单点吞吐量单点TPS达到8万/秒,QPS达到10万/秒。redis的5中存储类型string、list、set、map(hash)、stored-setredis的string类型能表达3中类型:字符串、整数和浮点数。根据场景相互间自动转型,并且根据需要选取底层的承载方式value内部以int、sds作为结构存储。int存放整型数据,sds存放字节/字符串...
2018-02-05 22:53:40 7691 3
原创 Dubbo并发通信原理解析
从Dubbo开源文档中看到:Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。 Dubbo通信默认采用的是Netty框架。Netty实质就是通过Socket进行通信,Socket(TCP)通信是全双工的方式。 因为采用单一长连接,所以如果消费者多线程请求,服务端处理完消息后返回,就会造成消息错乱的问题。解决这个问
2018-02-05 20:11:13 4451
原创 Dubbo暴露服务源码解析
Dubbo服务提供方的JavaBean对应的就是ServiceBean。ServiceBean除了继承dubbo自己的配置抽象类以外,还实现了一系列的spring接口用来参与到spring容器的启动以及bean的创建过程中去。 由于ServiceBean是单例模式的,在Spring的容器启动过程中会预先初始化。最后finishRefresh会触发ContextRefreshedEvent事件
2018-02-04 18:47:07 689
原创 Dubbo定义的元素注册到Spring容器的原理解析
Spring对第三方自定义元素配置的支持Spring中bean的定义可以通过编程,可以定义在properties文件,也可以定义在通过xml文件中,用的最多的是通过xml形式,由于xml格式具有很好的自说明便于编写及维护。对于xml的文档结构、数据定义及格式验证可以通过DTD和Schema, 在spring2.0之前采用的是DTD,在spring2.0之后采用Schema。使用Schema方
2018-02-04 15:31:48 1642
原创 Dubbo异步调用的方式及配置
异步通讯对于服务端响应时间较长的方法是必须的,能够有效地利用客户端的资源,在dubbo中,消费端通过 async=”true”标识。reference id="xxx" ....> name="method1" async="true" />reference>具体有以下四种方式:1、 NIO future主动获取结果,返回结果放在RpcContext中。需要注意的是
2018-02-04 14:13:11 3580
原创 常用限流算法:令牌桶和漏桶算法解析
漏桶算法漏桶算法思路很简单,水(请求)先进入到漏桶里,漏桶以一定的速度出水,当水流入速度过大会直接溢出,可以看出漏桶算法能强行限制数据的传输速率。 令牌桶算法对于很多应用场景来说,除了要求能够限制数据的平均传输速率外,还要求允许某种程度的突发传输。这时候漏桶算法可能就不合适了,令牌桶算法更为适合。如图2所示,令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理
2018-02-04 11:58:08 3458
原创 Dubbo原理总结
Dubbo主要的节点角色及之间的关系主要的节点角色: Provider:暴露服务的服务提供者Consumer:调用远程服务的服务消费者Registry:服务注册与发现的注册中心Monitor:统计服务调用次数和调用时间的监控中心Container:服务运行容器节点角色之间的关系: 服务容器负责加载、运行服务提供者。服务提供者在启动时,向注册中心注册自己提供的服务。服务消费者...
2018-02-03 17:02:45 824 1
转载 HttpClient 4.3连接池参数配置及源码解读
一、HttpClient连接池、请求参数含义二、执行原理及源码解读 1、创建HttpClient,执行request 2、连接池管理 2.1、连接池结构 2.2、分配连接 & 建立连接 2.3、回收连接 & 保持连接 2.4、instream.close()、resp...
2017-12-14 18:03:55 399
原创 Centos6.5升级内核,并安装docker
一、内核升级,从2.6升级到3.10.1071、先确定当前内核版本# uname -r2.6.32-220.el6.x86_64# cat /etc/centos-release CentOS release 6.5 (Final)2、安装依赖开发环境和开发库# yum grouplist //查看已经安装的和未安装的软件包组,来判断我们是否安装了相应的开发环境和开发库;# yum gr...
2017-11-04 12:07:55 1572
原创 nginx编译安装
一、编译安装1、安装编译nginx所需的依赖包yum install gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel2、上传nginx压缩包到/usr/local/src目录3、编译安装nginxcd /usr/loc
2017-10-31 15:22:45 255
转载 java NIO原理解析和代码实现
一.java NIO 和阻塞I/O的区别 1. 阻塞I/O通信模型 2. java NIO原理及通信模型二.java NIO服务端和客户端代码实现 具体分析: 一.java NIO 和阻塞I/O的区别 1. 阻塞I/O通信模型 假如现在你对阻塞I/O已有了一定了解,我们知道阻塞I/O在调用InputStream.read()方法时是阻塞的
2017-07-02 16:23:18 325
原创 线程池的选用与线程数的指定
1、选用的两个角度高性能:将提交到线程池中的任务直接交给线程去处理(前提:线程数小于最大线程数),不入队缓冲执行:希望提交到线程池的任务尽量被核心线程(corePoolSize)执行掉2、高性能队列:SynchronousQueue最大线程数:一般设为Integer.MAX_VALUE(整数最大值),防止回绝任务典型案例:newCachedThreadPool尤其适合于执行
2017-06-30 22:38:26 2495 2
转载 Executors源码解析
原文地址:http://www.cnblogs.com/java-zhao/p/5149906.html1、Executors与ThreadPoolExecutorThreadPoolExecutor可以灵活的自定义的创建线程池,可定制性很高想创建好一个合适的线程池比较难使用稍微麻烦一些实际中很少使用Executors可以创建4种线程池,这四种线程池基本上已经包含了所有需求,将来根据业务特点选用就...
2017-06-30 22:34:57 381
转载 ThreadPoolExecutor使用+工作机理+生命周期
原文地址:http://www.cnblogs.com/java-zhao/p/5146601.html1、最基础的线程池ThreadPoolExecutor使用方式: 1 /** 2 * ThreadPoolExecutor测试类 3 * 注意: 4 * 1、ThreadPoolExecutor是一个线程池 5 * 2、多个任务都可以由该线程池中选出几条线程来执行 6 */...
2017-06-26 17:34:10 1543
转载 ThreadPoolExecutor源码解析
原文地址:http://www.cnblogs.com/java-zhao/p/5147811.html1、源代码主要掌握两个部分线程池的创建:构造器提交任务到线程池去执行:execute() 2、构造器2.1、一些属性: /** * runState provides the main lifecyle control, taking on values: * ...
2017-06-26 17:31:45 319
原创 常见5中并发集合的对比总结
1、常用的五种并发包ConcurrentHashMapCopyOnWriteArrayListCopyOnWriteArraySetArrayBlockingQueueLinkedBlockingQueue2、ConcurrentHashMap线程安全的HashMap的实现数据结构:一个指定个数的Segment数组,数组中的每一个元素Segment相当于一个HashTabl
2017-06-22 18:32:07 1159
转载 LinkedBlockingQueue源码解析
原文地址:http://www.cnblogs.com/java-zhao/p/5135958.html1、对于LinkedBlockingQueue需要掌握以下几点创建入队(添加元素)出队(删除元素)2、创建Node节点内部类与LinkedBlockingQueue的一些属性 static class Node<E> { E item;//节点封装的数据 ...
2017-06-22 18:27:03 312
转载 ArrayBlockingQueue源码解析
原文地址:http://www.cnblogs.com/java-zhao/p/5135410.html1、对于ArrayBlockingQueue需要掌握以下几点创建入队(添加元素)出队(删除元素)2、创建public ArrayBlockingQueue(int capacity, boolean fair)public ArrayBlockingQueue(int capacity)使用方法...
2017-06-22 18:07:12 305
转载 CopyOnWriteArraySet源码解析
原文地址:http://www.cnblogs.com/java-zhao/p/5122447.html1、对于CopyOnWriteArraySet需要掌握以下几点创建:CopyOnWriteArraySet()添加元素:即add(E)方法删除对象:即remove(E)方法遍历所有对象:即iterator(),在实际中更常用的是增强型的for循环去做遍历注:CopyOnWriteArraySet...
2017-06-22 17:33:04 575
转载 HashSet源码解析
原文地址:http://www.cnblogs.com/java-zhao/p/5110953.html1、对于HashSet需要掌握以下几点HashSet的创建:HashSet()往HashSet中添加单个对象:即add(E)方法删除HashSet中的对象:即remove(Object key)方法判断对象是否存在于HashSet中:containsKey(Object key) 注:HashS...
2017-06-22 17:27:43 245
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人