自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 常见安全漏洞及解决方案

CSRF攻击XSS攻击DoS攻击Jsonp劫持SQL注入

2018-06-30 17:13:35 3058

原创 初识Java SPI思想

     最近在找实习,博客没有及时更新。最近了解了下一下SPI思想,记录一下。     spi的全称是:Service Provider Interface,也就是服务提供接口。我们都知道,我们在开发提倡面向接口开发,在运行期动态指定接口的具体的实现。在Java中,我们可以用反射,IOC(底层也是基于反射机制)来实现动态指定服务的具体提供者,从而达到解耦的目的,不在代码中写死了,从而达到在不修改...

2018-04-19 22:18:01 1897

原创 Zookeeper系列(6)-- Zookeeper的典型应用场景

    在寒假前,完成了Zookeeper系列的前5篇文章,主要是分布式的相关理论,包括CAP,BASE理论,分布式数据一致性算法:2PC,3PC,Paxos算法,Zookeeper的相关基本特性,ZAB协议。今天,完成Zookeeper系列的最后一篇也是最为重要的内容:Zookeeper的典型应用场景的介绍,我们只有知道zk怎么用,用在哪,我们才能真正掌握Zookeeper这个优秀的分布式协调框...

2018-02-25 22:20:58 3906 5

原创 Zookeeper系列(5)--ZAB协议,消息广播,崩溃恢复,数据同步

在前一篇中,写了Zookeeper的相关概念,以及节点、acl,watcher等机制,这一篇就写一下保证ZK集群高可用及数据一致性的底层实现算法:ZAB协议。ZAB协议概述在前面的文章中,介绍了经典的分布式数据一致性算法Paxos算法,但事实上zookeeper并没有采用完全的Paxos算法,而是采用了一种称为Zookeeper Atomic Broadcast(ZAB,zookeeper原子消息...

2018-02-02 18:12:08 7125 2

原创 Zookeeper系列(4)--ZK概述,数据模型,节点特性,Watcher机制、ACL及数据存储

在zookeeper系列的前三篇,介绍分布式数据一致性的相关原理及经典的分布式一致性算法,比如:2PC,3PC,Paxos算法。在本篇,我们正式开始介绍Zookeeper,Zookeeper是分布式一致性问题的工业解决方案,是常用的分布式协调框架。本篇,会介绍Zookeeper的基本概念,数据模型,节点特性,Watcher机制及ACL等机制,在后边我们会介绍Zookeeper为了保证一致性使用的算...

2018-02-02 15:58:35 4021 1

原创 Zookeeper系列(3)--Paxos算法的原理及过程透彻理解

     从上一篇我们了解了2PC和3PC之后,我们可以发现,无论是二阶段提交还是三阶段提交都无法彻底解决分布式的一致性问题以及无法解决太过保守及容错性不好。Google Chubby的作者Mike Burrows说过,世上只有一种一致性算法,那就是Paxos,所有其他一致性算法都是Paxos算法的不完整版。Paxos算法是公认的晦涩,很难可能能将清楚,但是工程上也很难实现,所以有很多Paxos算...

2018-02-01 16:23:46 17777 7

原创 Zookeeper系列(2)--2PC、3PC及其应用

在上一篇中,我们介绍了为什么使用分布式,为什么会出现分布式数据一致性问题,以及相关分布式理论:CAP/BASE理论,这些是我们进行后边介绍的分布式一致性算法的基础,正是由于在系统的可用性和数据一致性之间反复的权衡,于是出现了一系列的一致性协议,如2PC,3PC,paxos算法等。本篇就介绍两个最常见的分布式一致性算法:两阶段提交(2PC),三阶段提交(3PC)以及它们的相关应用。其实我觉得这些

2018-01-31 17:04:40 7809 3

原创 Zookeeper系列(1)--分布式一致性理论,CAP,BASE理论

Zookeeper系列,会从分布式一致性理论开始介绍,设计诸如:CAP,BASE理论,分布式一致性算法:2PC,3PC,Paxos,ZAB以及Zookeeper的节点特性,Zookeeper如何保证一致性及高可用,最后会介绍zk的各种应用。关于数据的一致性,我们在数据库中有了解过,因为数据库事务的ACID特性的C就代表一致性,这ACIC可以简单的把一致性理解为正确性或者完整性,那么数据一致性通

2018-01-30 22:20:26 6013 3

原创 Redis 原理及应用(4)--Redis应用场景分析

来到了Redis系列的最后一篇,在前三篇中,介绍了Redis的数据类型及底层实现,持久化,集群分区,事务,缓存淘汰策略,HA哨兵机制等内容,其实关于Redis最重要的是其应用场景,只有知道Redis在什么场景下使用才是第一步。在这篇文章中,我们就来讨论一下Redis典型的应用场景。缓存提到redis,我们第一想到的应用场景肯定是缓存,因为redis是基于内存的数据库,具有很强大的读写性能。

2018-01-30 18:38:01 2538

原创 Redis 原理及应用(3)--内存淘汰机制、主从同步原理,HA策略(哨兵机制)分析

在前两篇,我们学习了一下Redis的相关数据类型、底层实现、持久化、集群分区等知识,这一篇我们重点搞懂一下Redis的内存淘汰机制,用于容错的哨兵机制以及非常重要的应用场景。Redis内存淘汰机制   Redis是内存数据库,我们能时时刻刻能感受到Redis作者为更好地使用内存而费尽各种心思,例如最明显的是对于同一种数据结构在不同应用场景下提供了基于不同底层编码的实现(如压缩列表、跳跃表等

2018-01-30 15:40:32 1827

原创 Redis 原理及应用(2)--持久化方式、集群管理、事务及与Memcached的对比

在上一篇文章中,主要学习了一下Redis的5种数据结构的底层实现原理,在这一篇中,将介绍Redis的持久化方式,与Memcached的区别,Redis3.0的集群部署以及广泛的应用场景。Redis持久化方式redis默认创建16个数据库,通过select语句可以切换数据库。我们知道,Redis是一个内存数据库,在内存中以K-V形式来存储数据,但是它可以配置持久化选项来进行持久化,这也是Re

2018-01-29 21:56:19 816

原创 Redis 原理及应用(1)--数据类型及底层实现方式

Redis是一个key-value存储系统,现在在各种系统中的使用越来越多,大部分情况下是因为其高性能的特性,被当做缓存使用。Redis由于其丰富的数据结构也可以被应用到其他场景。Redis是一个K-V的非关系型数据库(NoSQL),常见的NoSQL数据库有:K-V数据库如Redis、Memcached,列式数据库如大数据组件HBase,文档数据库如mogoDB。Redis应用广泛,尤其是被作为缓

2018-01-29 19:50:41 9774 4

原创 IO复用模式--select、poll、epoll详解

IO模式,从大类上可以分为同步IO和异步IO,同步和异步的区别主要是针对IO事件的执行者,拿读数据来说,异步IO是内核等待内核缓存区数据就绪,然后由内核负责将数据拷贝到用户空间缓冲区,再发送实现完成信号,而同步IO是发送内核缓冲区数据就绪信号,将数据copy到用户缓冲区还是由应用程序进行io系统调用实现。同步IO又包括阻塞IO、非阻塞IO、IO多路复用和信号IO模式。其中,IO复用是现在实现高性能

2018-01-29 11:33:49 856

原创 数据结构及算法练习--树相关

上一章写了总结了一些链表的算法操作,另外,在实际中树尤其是二叉树的操作也是很重要的,接下来再总结一下。类名后边的数字是剑指offer书上的题号,题目都是在牛客网上AC的,但是它们的那个平台的方法入口名有些不规范。判断是否是二叉搜索树的后序遍历/** * 题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。

2018-01-27 19:09:42 183

原创 数据结构及算法练习--链表相关

最近用Java写了一些算法题,在这里分类总结一下,主要是剑指offer上的,下边就直接给相关代码实现,不多做解释了,可以直接看代码读懂。类名后边的数字是剑指offer书上的题号,题目都是在牛客网上AC的,但是它们的那个平台的方法入口名有些不规范删除链表中重复的结点/* public class ListNode { int val; ListNode next =

2018-01-27 18:43:19 193

原创 一致性哈希算法

一直性Hash算法在很多场景下都有应用,尤其是在分布式缓存系统中,经常用其来进行缓存的访问的负载均衡,比如:redis等非关系数据库作为缓存系统。我们首先来看一下采用取模方式进行缓存的问题。一致性Hash算法的使用场景   假设我们的将10台redis部署为我们的缓存系统,存储数据,存储方式是:hash(k)%10,用来将数据分散到各个redis存储系统中。这样做,最大的问题就在于:如果此

2018-01-25 21:46:39 4030 1

原创 TCP协议的相关理解

TCP/IP协议栈是计算机网络的核心,在学习过程中,记录了一些比较重要的问题。一些重要的点TCP报文头部信息 3次握手(结合状态转移) 4次挥手(结合状态转移) 为什么要3次握手,4次挥手 设置TIME_WAIT 状态的原因 (1) 防止ACK丢包,导致服务器端无法正常关闭。(2) 防止相似连接立即建立,接收到关闭连接延迟到达的数据 TIME_WAIT 设置为2MSL的原因 超时

2017-12-25 15:05:52 329

原创 递归和回溯经典题目--n皇后问题

递归和回溯密不可分,可以把递归的过程就是回溯的过程。其中BFS,DFS等经典问题都是与递归和回溯的思想紧密相关的。我们可以不用纠结于每个问题的标签,只要能运用相关的思想解决问题即可。下边,来讨论一下回溯和递归的经典算法问题:n皇后问题。问题描述:我们可以把此问题看成递归图:  此题关键是:如何判断冲突。也就是列,对角冲突

2017-12-13 20:25:57 432

原创 智力题小总结

最近看了一些智力题,感觉有点意思,同时智力题也是面试中可能会问到的题,所以就记录下来以后看。 我觉得对于智力题,千万不要试图用穷尽和常规的办法去想答案,有时候强迫自己去转变一下思考的角度,可能答案就出来了。烧绳子题对于烧绳子这类题,其解题的关键就是明白:绳子是可以两头烧的,可以精确获得一半时间,如果只想着一端烧,必然不行。 1. 一条绳子(粗细不均,长短不一),从一头点燃,全部烧完要耗时1个小时

2017-10-30 20:40:47 415

原创 设计模式--责任链模式

责任链设计模式是一种对象的行为模式,在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。 主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递

2017-10-27 10:33:38 158

原创 JDK源码解析集合篇--HashMap无敌全解析

前两篇写了Collection体系的List下的ArrayList与LinkedList,另外一部分是Set集合下的集合类,但是Set集合的实现类基本是由Map集合的实现类实现的,所以先分析一下重要的HashMap。 数组存储区间是连续的,占用内存严重,故空间复杂的很大。但数组的二分查找时间复杂度小,为O(1);数组的特点是:寻址容易,插入和删除困难;链表存储区间离散,占用内存比较宽松,故空间复杂

2017-09-01 12:08:29 367

原创 JDK源码解析集合篇--LinkedList全解析

LinkedList是基于链表实现的,链表和数组是两种不同的线性物理存储结构,具体不再介绍链表的用法,这是基本的数据结构知识。LinkedList是通过双向链表的实现,即:链表中任意一个存储单元都可以通过向前或者向后寻址的方式获取到其前一个存储单元和其后一个存储单元。对于此,可看LinkedList的源码节点的定义: private static class Node<E> {

2017-08-31 17:13:36 205

原创 JDK源码解析集合篇--ArrayList全解析

对于一个集合的使用,我们首先关注的是: 1、 增删改查的特点(时间复杂度是怎样的) 适用于随机访问 2、是否允许空 允许为空 3、是否允许重复数据 允许 4、是否有序,有序的意思是读取数据的顺序和存放数据的顺序是否一致 有序 5、是否线程安全 非线程安全ArrayList实现原理ArrayList就是一个以数组形式实现的集合,但是它实现了长度可变。我们可以看其源码属性:

2017-08-31 11:32:29 188

原创 JDK源码解析集合篇--综述

Java集合工具包位于Java.util包下,包含了很多常用的数据结构,如数组、链表、栈、队列、集合、哈希表等。学习Java集合框架下大致可以分为如下五个部分:List列表、Set集合、Map映射、迭代器(Iterator、Enumeration)、工具类(Arrays、Collections)。在JDK1.5后,util包下加入了concurrent包,更加完善了集合框架对于并发多线程情况下的处理

2017-08-30 21:59:17 318 1

原创 设计模式--工厂模式(简单工厂、工厂方法、抽象工厂模式)

工厂模式是最常用的一类创建型设计模式,通常我们所说的工厂模式是指工厂方法模式,它也是使用频率最高的工厂模式。本章将要学习的简单工厂模式是工厂方法模式的“小弟”,它不属于GoF 23种设计模式,但在软件开发中应用也较为频繁,通常将它作为学习其他工厂模式的入门。此外,工厂方法模式还有一位“大哥”——抽象工厂模式。这三种工厂模式各具特色,难度也逐个加大,在软件开发中它们都得到了广泛的应用,成为面向对象软件

2017-08-30 10:44:01 273

原创 设计模式--装饰者模式(在IO体系中的应用)

上一篇介绍了适配器模式,它是将一个类的接口,转化成客户期望的另一个接口,适配器让原本接口不兼容的类可以合作无间。装饰者模式:动态的将责任附加到对象上(因为利用组合而不是继承来实现,而组合是可以在运行时进行随机组合的)用来扩展功能。若要扩展功能,装饰者提供了比继承更富有弹性的替代方案(同样地,通过组合可以很好的避免类暴涨,也规避了继承中的子类必须无条件继承父类所有属性的弊端)。我们的目标是允许类统一扩

2017-08-29 21:21:51 1529 1

原创 设计模式--适配器模式(JDK中的应用)

本来想开始进行java集合框架的学习,但是看到集合框架中用到了适配器模式,所以先学习一下此设计模式,能让我们对java集合框架的设计思想理解更深入。JDK源码中应用了很多设计模式,在学习源码的遇到的时候会一一进行学习。闲言少叙,开始适配器模式。适配器模式定义适配器模式定义是:适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。其别名为

2017-08-29 17:57:26 1081

原创 JDK源码解析基础篇-String、StringBuilder、StringBuffer

首先向搞懂常量池的知识点:触摸Java常量池 常量池技术 java.lang包的最后一篇基础篇。搞完这篇就开始集合框架和并发包等内容。Sting、StirngBuilder、StringBuffer的内容很早之前写过 String、StringBuffer和StringBuilder的区别和应用场景 ,但写的太简单了。这次再重新梳理一下这部分内容,留作以后复习。 在 java 语言中, 用来处理

2017-08-29 11:55:31 218

原创 二分搜索及其变形应用

二分搜索(折半查找)是应用很广泛的一种算法,当出现有序序列时,我们可以立马想到能否可以用二分法,其写法也较为固定,但是如果不注意其变换条件也是很容易写错。下边给出了二分查找的非递归和递归写法,只要注意其边界判断和变换,代码很简单:二分法的递归和非递归写法package com.blog.binarysearch;/** * @Description: 二分法(二分搜索 折半查找)

2017-08-27 20:14:09 197

原创 10大排序算法大总结--Java实现

今天总结了一下排序算法,在这里给出总结。主要以代码形式给出,没有涉及过多的解释。但是都比较简单,看代码注释也可以看懂。首先,来个综述:这是百度上的一个总结,为什么这里说有10种排序算法呢,这是因为加上了计数排序和桶排序,这两种排序方法再加上基数排序是3种线性排序方法。是不基于比较实现的,其他的都是基于比较实现的,其时间复杂度最低为O(nlongn),此性质可以进行证明。直接插入排序

2017-08-26 22:51:13 383

原创 JDK源码解析基础篇-8种基本数据类型的包装类及相关讨论

这是源码解析系列的第二篇,依然来学习java.lang包下常用的类–8种基本数据类型对应的包装类。将从概念到源码进行学习,并对其缓存、自动拆装箱的语法糖等注意点进行分析。 在开始之前,今天看到一个有趣问题:Java到底是纯面向对象语言吗?有人认为是,有人认为不是。认为不是的因为:(1)类的static修饰的静态内容(变量和方法)不属于任何对象,所以这是非对象的东西;(2)所有的8种基本数据类型都不

2017-07-30 22:20:38 461

原创 一篇彻底学会常用的sql语句

为了以后查阅方便,对常用的sql语句进行一下总结。主要内容包括,增删改查(CURD),重点在查询(子查询,模糊查询,分组查询等)。 在开始之前,要注意:sql是不区分大小写的,但是为了代码容易阅读与调试,一般将Sql关键字大写,对所有的表名和列明使用小写。多条sql语句需要用 分号(;)分隔,单条可以不加,但为了不出现错误,一般都加上,使用mysql命令行必须加分号来结束。另外sql语句可以写在一

2017-07-25 22:38:14 4330 5

原创 JDK源码解析基础篇--java.lang.Object及其方法约定

这是源码阅读的开端,当然选择从类层次结构的根类--java.lang.Object类开始。 所有类的默认继承Object类(若没有继承其他类),Object类是继承体系的根类,由类直接或间接继承。Object方法分类 首先,可以先看一下Object类中有哪些方法。 方法很少,很简单对不对!但是这些方法都很重要,可以将这些方法分一下类。它非final方法有:equals,hashCode,toS

2017-07-22 22:48:21 540

原创 Java的四种引用类型与ReferenceQueue

Java垃圾回收算法中,判断一个引用对象是否还存活是很重要的。Java有四种引用类型:分别为:强引用,软引用,弱引用,虚引用。 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及(reachable)状态,程序才能使用它。从JDK 1.2版本开始,把对象的引用分为4种级别,从而使程序能更加灵活地控制对象的生命周期。这4种级别由高

2017-06-30 15:38:33 564

原创 设计模式--CGLib动态代理的实现与解析

在前两篇的JDK动态代理中,它是通过Proxy类和实现InvocationHandler接口实现的。但是此方式最大的缺点是:要求被代理的目标类必须实现一个接口,而且只能对接口中的方法实现代理。因为最终生成的代理类是继承了Proxy类以及实现了目标类的接口。 如果被代理的目标类没有实现接口,JDK就无法完成代理。这时,可以采用CGLib动态代理。JDK动态代理与CGLib动态代理均是实现Spring

2017-06-29 21:42:28 277

原创 设计模式--JDK动态代理的实现与原理解析(2)

在上一篇博客中,实现了JDK的动态代理。但是,我们不仅要学会如何使用,更要理解其内部的具体实现。 我们是通过此方法获得对目标对象的代理类: public Object getProxy() { //参数意义:1. 当前类加载器 2. 目标类的class对象 3. 目标类的所有接口 4. 实现InvocationHandler接口的类 return Proxy.

2017-06-29 20:25:14 284

原创 设计模式--JDK动态代理的实现与原理解析(1)

代理模式是一种很重要很有用的设计模式。被应用到很多著名的框架中,其中Spring Aop的底层就是通过JDK动态代理和CGLib动态代理实现的。其中,JDK动态代理是其默认实现。动态代理的作用就是在不修改原目标类的前提下,对目标类方法进行增强。比如横切一些逻辑:事务管理,日志记录,检验等。J相对于静态代理,JDK动态代理避免了重复编写代理类的缺点。只需要简单的指定一组接口及目标类就可以获得代理对象。

2017-06-29 16:21:39 331

原创 理解null关键字及集合或字符串需先判断null再判断长度的原因

Java中,null是一个关键字,代表不确定的对象。null只能用于赋给引用类型变量,不可以赋给基本数据类型变量。类成员引用变量默认为null。但对于非类成员变量,不能只声明定义,不进行初始化,但后边的代码中使用了它,这时候,就会进行报错。下边代码:

2017-05-31 21:39:05 1415 3

原创 深入分析ThreadLocal

在JDK1.2 版本中,提供了java.lang.ThreadLocal。它为解决多线程并发问题提供了一种新的思路,有其特定的应用场景。1. 如何理解ThreadLocal ThreadLocal,很多人叫它线程本地变量。它为每个线程都创建一个副本,每个线程访问自己内部的副本变量。不会影响其他线程的副本变量。变量是同一个,但是每个线程都使用此变量的一个新的副本,从而为多线程环境常出现的并

2017-05-30 20:25:12 233

原创 对于算法一些概念的小总结

一般采用渐进表达式来衡量算法的时间复杂度和空间复杂度,忽略了常数。首先要理解,指数增长是极其恐怖的,在算法运行时间中应当尽量避免。很多算法都可以用指数时间的穷举算法来实现,但是否存在多项式时间算法是计算机科学的核心问题。 这里再简单介绍一个标题的这些概念。 多项式规约:是指经过多项式个步骤将一个问题A转化为另一个问题B,多项式调用解决B问题的算法可以解决问题A。多项式规约,是证明一个问题是NPC的基础。 NP:NP问题的定义是:一个算法存在多项式检验算法,也就是给定一个解可以

2017-04-30 21:58:25 322

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