- 博客(73)
- 收藏
- 关注
原创 从bitmap到布隆过滤器,再到高并发缓存设计策略
从bitmap到布隆过滤器,再到高并发缓存设计策略前言:怎么能把风马牛不相及的概念串在一块,就得看笔者的本事了。bitmap和布隆过滤器海量整数中是否存在某个值--bitmap在一个程序中,经常有让我们判断一个集合中是否存在某个数的case;大多数情况下,只需要用map或是list这样简单的数据结构,如果使用的是高级语言,还能乘上快车调用几个封装好的api,加几个if els...
2019-06-08 19:35:53
1849
3
原创 事务隔离级别二三事
事务隔离级别二三事如果你是一个数据库设计者,你会如何考虑数据库的事务设计呢?首先,我们要明确事务的四个基本特性:ACID,在此处就不多作介绍,这已经是大部分程序员烂在嘴巴里的四个字母。我们需要考虑的是,打破这个四个特性的情况和行为,以及如何防范和取舍。三种问题脏读,不可重复读,幻读。先说说脏读,取名为...
2018-08-21 19:21:42
322
原创 Hash一致性算法与分布式缓存服务器
Hash一致性算法与分布式缓存服务器在大型的分布式项目中,解决性能问题是重中之重,在前端搭建缓存服务器是常见的一种解决后台资源访问的一种方案。就以图片缓存服务器为例,用户近期访问的图片,将会被从后台读取到客户端,并缓存到前端缓存服务器中,当再次访问该资源时,就可以直接在前端缓存中读取,不必访问后台,这对后台服务器性能是一个很好的提升。这样的...
2018-08-15 19:54:27
743
原创 nginx
nginxnginx是个比较大的命题了,似乎写这么一篇文章不是几句科普就能圆回来的。首先,引发这么一些思考,nginx是什么?---反向代理服务器?路由网关???,作用是什么?---负载均衡?入口网关?,负载均衡算法呢?没错,以上都是自卖自夸的内容,这一篇文章,统统告诉你们。科普nginx...
2018-08-07 19:25:20
232
原创 Dubbo和SpringCloud的区别和优劣
Dubbo和SpringCloud的区别和优劣前言:Dubbo和SpringCloud是目前最常见的两个分布式服务治理框架,一个来自国内大名鼎鼎的阿里团队,一个则来自Spring的团队,两者之间有着怎么样的区别和异同呢?首先,说说两者的模块组成:1、Dubbo主要分为服务注册中心,服务提供者,服务消费者,还有管控中心;2、...
2018-08-04 16:04:32
8611
1
原创 SpringCloud的架构总结(一):注册服务中心,Eureka
SpringCloud的架构总结(一):注册服务中心,EurekaSpringCloud是一个分布式服务框架,提供了分布式开发中所需要的重要模块,如服务注册中心,服务提供者和消费者等等,基于SpringBoot开发也使得开发分布式服务时更加的便捷。SpringCloud有诸多的模块,笔者将会循序渐进,推出相关的介绍,首先说说SpringCloud注册服务中心--Eu...
2018-08-04 14:32:35
314
原创 希尔排序:打破直接插入排序得2^n
希尔排序:打破直接插入排序得2^n八大排序中分为如下的几类,选择排序类,插入排序类,交换排序类。选择排序,直接插入排序,冒泡排序分别是这三类排序中时间复杂度为O(2^n)的简单实现,不愿服输的数学家们自然不会满足如此低性能的算法,所以对应地都写每一种算法的优化。其中,冒泡排序的优化是快速排序,同样是不停的进行交换,快速排序使用递归的方式,...
2018-08-02 19:16:15
166
原创 Tomcat类加载机制以及线程上下文类加载器
Tomcat类加载机制以及线程上下文类加载器 tomcat类加载需要解决的问题tomcat是一个很经典的web服务器,一个服务器就相当于一个Java应用,而在这个Java应用中又有着多个被部署的Web应用,因此,有着如下的几个问题等着被解决:1、多个web应用之间不能相互影响;2、jsp能够热部署;3、web服务器本身使用的类库,不被干扰;4、多个web应用能够共享l...
2018-07-26 20:05:43
2241
原创 Dubbo:这可能是最菜的一篇Dubbo总结
Dubbo:这可能是最菜的一篇Dubbo总结 相对来说,对Dubbo的了解还是比较少的,标题也不敢取的太过嚣张,抛砖引玉吧,还望指正。(本文无源码分析,只是使用层面的总结)Dubbo是什么?Dubbo是一个成熟的分布式服务治理框架,在国内有许许多多的公司用它,一个Dubbo模型中有提供者,消费者,监控者,注册中心这四个主要的角色。Dubbo引发的问题默认使用的是什么通信框架...
2018-07-23 16:57:38
235
原创 一个Java程序员眼中的Http协议
一个Java程序员眼中的Http协议从业也有一年之久了,谢希仁老师的那本计算机网络估计已经承灰了,此文就Http协议做一个总结,如果有问题还望指出。大致介绍一下HTTP协议Http协议是在应用层的一个超文本传输协议,底层依赖于Tcp/IP进行实现,这也就意味着它是一个面向连接的过程。Http有这么一个显著的特点,它是无状态的,什么是无状态呢?服务器端接收到一个Http请求它只管处理...
2018-07-21 14:36:49
623
原创 堆排序:原理解析及Java实现
堆排序:原理解析及Java实现在排序算法中,堆排序的出现频率相当高,相比其他排序算法如快排,他可能依赖一丢丢的数据结构基础,接下来我们详细地解释堆排的原理。什么是堆?堆其实是一种特殊的完全二叉树,在笔者之前的文章中,曾经讲解过二叉查找树,但是对于完全二叉树和满二叉树却一笔带过了,出来混总是要还的,接下来我们先把堆的概念普及一下。完全二叉树的概念,就是自上而下,自左而右,依次的将每一...
2018-07-21 10:37:43
1308
1
原创 MySQL:从B树到B+树到索引再到存储引擎
MySQL:从B树到B+树到索引再到存储引擎 学习Java也有一年多了,但是从来没有就数据库做一个完整的总结,心血来潮立了这么一个网文标题,希望不要虎头蛇尾吧,哈哈。索引其实是一种数据结构,在数据库中,读写的比例是在10:1,所以如果每一次查找都全表查找的话,效率将会变的十分的低下。所以,本文将会按照题目,按部就班地讲解MySql的索引。B树和...
2018-07-16 20:21:39
4663
5
原创 Spring解决循环注入的机制
Spring解决循环注入的机制 Spring是一个大型的IOC容器,管理着应用中对象的依赖关系和生命周期。此时我们设想这么一种情况,若是Spring发生循环注入的状况,应当怎么处理? 所谓循环注入,千万不要曲解成循环调用,循环调用是指对象A中的方法调用对象B中的方法,而对象B调用对象C的方法,最后C调用A的方法,构成了一个死循环,最后肯定栈满溢出,无法解决。而循环注入则指的是对象A拥有...
2018-07-14 12:28:50
9299
1
原创 设计模式之代理模式:三种代理模式的实现方式
设计模式之代理模式:三种代理模式的实现方式 前言:代理模式和另外一种设计模式--装饰者模式十分相像,他们都是在不修改目标对象源代码的基础上,对源代码的一次重构。只是,代理模式,关注的是目标对象的使用,他有目标的控制权,而装饰者模式,只是对目标对象功能的增强,仅此而已,不拥有目标对象的控制权。 代理模式有三种实现方式:继承目标对象的同一个接口,引入目标对象,重写方法;使用JDK动态代理的...
2018-07-10 19:17:51
6061
1
原创 Java实现二叉树(二):平衡二叉树的实现之AVL树
Java实现二叉树(二):平衡二叉树的实现之AVL树 前文中,我们实现了二叉查找树,同时,我们也提到了这么一个隐患:如果二叉树无法控制自己的深度,那么,二叉树的查找效率很可能会发生极端的转化--如,顺序的将一堆数据插入查找二叉树,此时,二叉树会成为一个近似链表的数据结构。所以,为了解决这个问题,我们必须要找到问题的根源所在--二叉树深度,由此,推出本文的主角--平衡二叉树。 一、平衡二...
2018-07-08 13:27:57
1297
5
原创 Java实现二叉树(一):二叉查找树的实现
Java实现二叉树(一):二叉查找树的实现 数据结构+算法=程序,这是共识,是真理,还是学生时代卷子中的考点。但大多数程序员往往缺乏数据结构和算法的知识,或是根本没有学过,或是学过,但在工作时频繁地与业务逻辑打交道,也就逐渐忘记了有这么一回事。 话不多说,直接开始吧,本文将介绍二叉树的基本概念,以及平衡二叉树增删改查节点的实现,由于网上关于数据结构的资料,C++相对居多,而本身作为一个...
2018-07-07 11:49:06
6976
原创 zookeeper(三):Java原生API的使用以及Watch机制
zookeeper(三):Java原生API的使用以及Watch机制 zookeeper提供了Java调用的API,但是实现的并不是特别强大,本文做一个概念性的了解。 一、简单说明 导入相应的jar包后,通过zookeeper的实例就可以完成相应的zookeeper操作了。 zookeeper的构造方法有很多,但是必须的有三个参数:连接zookeeper的地址;sessio...
2018-07-04 20:01:01
2693
1
原创 zookeeper(二):zookeeper概念 初步介绍
zookeeper(二):zookeeper概念 初步介绍 前文简单介绍了zookeeper的安装细节,本文对zookeeper的概念进行一个简单的了解。 一、什么是zookeeper? zookeeper是一个高性能的分布式协调工具。 他有着以下的优点:一致性和可靠性:一个客户端发起的事务,会被作用到每一个服务器,成功或者失败都是一致的;单一视图:从任何服务器查看数据得到...
2018-07-03 18:10:00
233
原创 JDK1.7和JDK1.8的新特性Mark
JDK1.7和JDK1.8的新特性Mark JDK的版本层出不穷,连续不断,每一个版本都凝结了Java源码开发人员的智慧结晶。而对于每一个程序员来说,每年最神秘的两件事情,莫过于女朋友和JDK的新特性,相较前者而言,我还是说点我知道的吧。此文动态添加,为个人总结,欢迎补充。 JDK1.7JDK1.7的byte、short、int、long支持二进制的表达,只需要添加0b在前面就行了,如...
2018-07-01 21:59:20
1330
原创 zookeeper(一):搭建zookeeper环境
zookeeper(一):搭建zookeeper环境 zookeeper的概念以及使用我们暂且搁置,本文我们仅仅讲述在linux环境下的zookeeper环境搭建 第一步: 创建三台linux服务器 第二步: 在usr/local下拷贝进zookeeper压缩包,并使用tar -zxvf解压压缩包,完成安装 第三步: 修改解压文件的文件名,...
2018-07-01 11:32:31
270
原创 GC:深入理解GC--细数GC回收器
GC:深入理解GC--细数GC回收器 前言:本文将深入解释GC的运行原理--什么对象会被GC回收;以及GC回收器的区别 GCROOT 大家都知道,GC会对不可达对象进行内存回收,那么如何标记不可达对象呢? 这里引出一个GCROOT的概念,一个对象如果和GCROOT对象没有链接,就说明这个对象不可达,便可以被回收。 通常来说,以下的对象会被作为GCROOT对象:Java...
2018-06-29 19:40:13
3802
原创 类加载详述以及双亲委派模型
类加载详述以及双亲委派模型 一、简介类加载过程 在上一文中,已经简单的讲解过类加载的步骤,此处稍做复习一下,不经意一看,已经是三月份的文章了...(文章链接) 类加载机制大方向分为三个步骤: 1、加载:用于查找和导入Class文件。 2、链接(链接又分为如下三个步骤):校验:用于校验二进制文件的合法性;准备:给类的静态变量分配内存,被赋上默认值;解析:将符号引用转化为...
2018-06-20 22:36:12
155
原创 RocketMQ:入门篇
RocketMQ:入门篇 一、简介 RocketMQ是大名鼎鼎的阿里开发的开源消息中间件,由于其高性能和可靠性,常被使用于企业的分布式架构中。 他有着如下优点:RocketMQ原生地支持分布式,不像ActiveMQ需要zookeeper才能完成主从的搭建;RocketMQ能够承载海量的消息,并且不会导致明显的写入延迟;RocketMQ提供丰富的API,支持消息失败重试机制;Roc...
2018-06-19 21:57:57
325
原创 进一步了解ActiveMQ
进一步了解ActiveMQ 一、JMS选择器 在生产端发送消息的时候,可以对每一个消息设置属性,大概有以下的方法,可以设置int类型、boolean类型、byte类型等的key-value对应的属性: 设置完成后,可以在消费时,加入类似于“age>25”的条件,在创建消费者时进行筛选。 大致过程如下:生产端代码段:消费端代码段: 二、消息的接受方式 我们在...
2018-06-18 20:51:52
188
原创 初识ActiveMQ
初识ActiveMQ 要了解ActiveMQ,先得了解JMS的概念,JMS(JavaMessageService)是Java提供的消息中间件的一组规范接口,ActiveMQ则是Apache遵循JMS规范实现的消息中间件。 一、JMS的优点 早在没有JMS的时候,应用系统通信存在如下缺陷:应用系统通信具有同步性,发送方需要等待接收方处理才能继续进行;发送方接收方的生命周期相互依赖,...
2018-06-18 18:44:11
163
原创 redis集群搭建
redis集群搭建 这是redis“三部曲”的终章了,附上前两个博客的“传送门”:redis的特性,redis入门篇。 在今天手动搭了一个集群,并不算太难,按部就班的就完事了,在此文记录一下步骤及思考。 步骤:学会安装一个redis这个并不算太难,网上一搜一大堆,就此略过。接下来,我们就可以创建集群了,由于本机跑多个虚拟机较为吃力,故,在一个虚拟机上用多个端口跑redis服务搭建...
2018-06-13 19:44:46
148
原创 redis的特性
redis的特性 承接上文redis入门篇,本文具体介绍一下redis的特性,以及与另外一个nosql数据库memcached的对比。 一、redis的优点 根据上文,我们知道redis的如下特性成为了他的竞争力:key-value对应的内存数据库,高效。value支持着五种丰富的数据类型,更加强大,memcache只是简单地key-value存储,但value的数据类型单一。操...
2018-06-13 17:19:04
4258
1
原创 redis入门篇
redis入门篇 一、redis简介 redis是key-value数据结构的内存数据库。 至于具体特点,会在本系列最后一一列出,先看redis的入门。 二、redis的五种数据类型和指令 1、对key的操作指令 判断key是否存在->exists key,代码及结果如下:127.0.0.1:6379> exists name(integer) 1...
2018-06-12 20:39:27
262
原创 CopyOnWrite容器解决的并发问题
CopyOnWrite容器解决的并发问题 先看这么一段代码: public static void main(String[] args) throws InterruptedException { List<String> a = new ArrayList<String>(); a.add("a"); a.ad...
2018-06-06 17:35:42
487
原创 CAS和ABA问题
CAS和ABA问题 引言:乐观锁和悲观锁的概念 悲观锁:悲观锁悲观地认为,自己执行操作的过程中一定有人修改过自己操作的值,所以在自己操作之前会加上一把锁,synchronized就是一个悲观锁。 乐观锁:乐观锁则乐观地认为,当自己执行操作时不会有人修改自己操作的值,所以采用不加锁的机制,只是在操作完成的那一刻发现产生冲突,则会重新执行操作,直到成功为止。CAS算法就是乐观锁的一种...
2018-06-05 22:30:55
3135
原创 Java常量池总结
Java常量池总结 一、基本概念介绍 什么是常量 用final修饰的变量即为常量(成员变量、局部变量、静态变量,只要被final给修饰过的)。 什么是常量池 先说静态常量池,来看看class文件中都包含了哪些内容。 其中前四个字节为魔数(确定一个class文件能否被JVM解析),后四个字节为存储版本号,其中前两个字节为次版本号,后两个为主版本号,最后就是...
2018-06-02 18:09:49
242
原创 Servlet/JSP、Struts1、Struts2以及SpringMVC的线程安全性
Servlet/JSP、Struts1、Struts2以及SpringMVC的线程安全性 一、Servlet/JSP Servlet/JSP一直都是MVC界的老大哥,我们来回顾一下Servlet的生命周期。 当客户端第一次请求Servlet时,Web容器会根据web.xml中的配置文件创建一个Servlet实例,而后调用init()方法,仅一次(注意);之后每一次请求都会执行Se...
2018-05-29 19:44:06
681
原创 C++中的指针,引用和Java中的对象
C++中的指针,引用和Java中的对象引用 一、C++中指针和引用的区别 相同点:在c++中,指针和引用都可以让人间接地操作一个对象。 不同点:首先说两者在定义上的区别,指针是存放对象的地址的一块内存,而引用是对象的别名。再看看以下的几行代码:int a,b,*p,&r=a;//正确r=3;//正确:等价于a=3int &rr;//出错:引用必须初始化...
2018-05-26 22:17:14
1098
原创 算法:冒泡算法及优化
算法:冒泡算法及优化 代码如下:public class MaoPao { public static int a[] ={1,2,3,4,5,6,7,8,9}; public static void main(String args[]) { sort(); for (int k: a) { ...
2018-05-08 11:40:17
136
原创 TCP连接的三次握手和连接关闭的四次挥手
TCP连接的三次握手和连接关闭的四次挥手 一、文章大纲图 二、建立TCP连接三次握手过程第一次握手,由客户端发送syn报文给服务器端。第二次握手,服务器端返回ack(确认)+syn报文给客户端。第三次握手,客户端发送ack(确认)报文确认。 三、TCP连接关闭四次挥手过程第一次挥手,由客户端发送FIN报文(Finish)给服务器端。第二次挥手,由服务器端发送ack确认,表示收到报...
2018-05-07 16:50:12
179
原创 BIO、NIO、AIO的区别
BIO、NIO、AIO的区别 一、BIO(同步阻塞IO) 网络编程的模型其实就是C/S模型,即两个进程间的通信。BIO编程则提供最传统的一种IO网络编程方式,优点是API使用简单,易于理解。 BIO的模型是让服务器端提供一个端口号,新建一个ServerSocket套接字对象,客户端可以通过URL和端口号与服务器建立TCP连接,服务器端和客户端通过套接字来通信,在该模型中需要服务器...
2018-05-06 19:45:35
168
原创 ThreadLocal深入浅出
ThreadLocal深入浅出 一、分析ThreadLocal源码 ThreadLocal的核心方法一共就几个,get(),set()等等,我们由get()开始,一边分析其源码,一边揭开ThreadLocal的面纱。 先看看JDK7中的get()源码: public T get() { Thread t = Thread.currentThread(); ...
2018-05-03 18:31:18
155
原创 Java的Lock锁和synchronized关键字的区别及其使用
Java的Lock锁和synchronized关键字的区别及其使用 一、synchronized关键字和Lock的区别以及优缺点 我们可以回顾一下synchronized的使用,synchronized释放锁的时机有以下几种:当执行完代码块中的代码,释放锁;当代码抛出异常,释放锁;当调用锁的wait方法,释放锁; 以上三种情况便可以完全的帮我们解决线程同步的问题,为什么还要引入L...
2018-05-02 18:21:50
1747
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人