自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(73)
  • 收藏
  • 关注

原创 从bitmap到布隆过滤器,再到高并发缓存设计策略

从bitmap到布隆过滤器,再到高并发缓存设计策略前言:怎么能把风马牛不相及的概念串在一块,就得看笔者的本事了。bitmap和布隆过滤器海量整数中是否存在某个值--bitmap在一个程序中,经常有让我们判断一个集合中是否存在某个数的case;大多数情况下,只需要用map或是list这样简单的数据结构,如果使用的是高级语言,还能乘上快车调用几个封装好的api,加几个if els...

2019-06-08 19:35:53 1767 3

原创 事务隔离级别二三事

                                       事务隔离级别二三事如果你是一个数据库设计者,你会如何考虑数据库的事务设计呢?首先,我们要明确事务的四个基本特性:ACID,在此处就不多作介绍,这已经是大部分程序员烂在嘴巴里的四个字母。我们需要考虑的是,打破这个四个特性的情况和行为,以及如何防范和取舍。三种问题脏读,不可重复读,幻读。先说说脏读,取名为...

2018-08-21 19:21:42 267

原创 Hash一致性算法与分布式缓存服务器

                         Hash一致性算法与分布式缓存服务器在大型的分布式项目中,解决性能问题是重中之重,在前端搭建缓存服务器是常见的一种解决后台资源访问的一种方案。就以图片缓存服务器为例,用户近期访问的图片,将会被从后台读取到客户端,并缓存到前端缓存服务器中,当再次访问该资源时,就可以直接在前端缓存中读取,不必访问后台,这对后台服务器性能是一个很好的提升。这样的...

2018-08-15 19:54:27 707

原创 nginx

                                               nginxnginx是个比较大的命题了,似乎写这么一篇文章不是几句科普就能圆回来的。首先,引发这么一些思考,nginx是什么?---反向代理服务器?路由网关???,作用是什么?---负载均衡?入口网关?,负载均衡算法呢?没错,以上都是自卖自夸的内容,这一篇文章,统统告诉你们。科普nginx...

2018-08-07 19:25:20 184

原创 Dubbo和SpringCloud的区别和优劣

                              Dubbo和SpringCloud的区别和优劣前言:Dubbo和SpringCloud是目前最常见的两个分布式服务治理框架,一个来自国内大名鼎鼎的阿里团队,一个则来自Spring的团队,两者之间有着怎么样的区别和异同呢?首先,说说两者的模块组成:1、Dubbo主要分为服务注册中心,服务提供者,服务消费者,还有管控中心;2、...

2018-08-04 16:04:32 8559 2

原创 SpringCloud的架构总结(一):注册服务中心,Eureka

            SpringCloud的架构总结(一):注册服务中心,EurekaSpringCloud是一个分布式服务框架,提供了分布式开发中所需要的重要模块,如服务注册中心,服务提供者和消费者等等,基于SpringBoot开发也使得开发分布式服务时更加的便捷。SpringCloud有诸多的模块,笔者将会循序渐进,推出相关的介绍,首先说说SpringCloud注册服务中心--Eu...

2018-08-04 14:32:35 274

原创 希尔排序:打破直接插入排序得2^n

                          希尔排序:打破直接插入排序得2^n八大排序中分为如下的几类,选择排序类,插入排序类,交换排序类。选择排序,直接插入排序,冒泡排序分别是这三类排序中时间复杂度为O(2^n)的简单实现,不愿服输的数学家们自然不会满足如此低性能的算法,所以对应地都写每一种算法的优化。其中,冒泡排序的优化是快速排序,同样是不停的进行交换,快速排序使用递归的方式,...

2018-08-02 19:16:15 148

原创 Tomcat类加载机制以及线程上下文类加载器

Tomcat类加载机制以及线程上下文类加载器  tomcat类加载需要解决的问题tomcat是一个很经典的web服务器,一个服务器就相当于一个Java应用,而在这个Java应用中又有着多个被部署的Web应用,因此,有着如下的几个问题等着被解决:1、多个web应用之间不能相互影响;2、jsp能够热部署;3、web服务器本身使用的类库,不被干扰;4、多个web应用能够共享l...

2018-07-26 20:05:43 2127

原创 Dubbo:这可能是最菜的一篇Dubbo总结

Dubbo:这可能是最菜的一篇Dubbo总结 相对来说,对Dubbo的了解还是比较少的,标题也不敢取的太过嚣张,抛砖引玉吧,还望指正。(本文无源码分析,只是使用层面的总结)Dubbo是什么?Dubbo是一个成熟的分布式服务治理框架,在国内有许许多多的公司用它,一个Dubbo模型中有提供者,消费者,监控者,注册中心这四个主要的角色。Dubbo引发的问题默认使用的是什么通信框架...

2018-07-23 16:57:38 193

原创 一个Java程序员眼中的Http协议

一个Java程序员眼中的Http协议从业也有一年之久了,谢希仁老师的那本计算机网络估计已经承灰了,此文就Http协议做一个总结,如果有问题还望指出。大致介绍一下HTTP协议Http协议是在应用层的一个超文本传输协议,底层依赖于Tcp/IP进行实现,这也就意味着它是一个面向连接的过程。Http有这么一个显著的特点,它是无状态的,什么是无状态呢?服务器端接收到一个Http请求它只管处理...

2018-07-21 14:36:49 577

原创 堆排序:原理解析及Java实现

堆排序:原理解析及Java实现在排序算法中,堆排序的出现频率相当高,相比其他排序算法如快排,他可能依赖一丢丢的数据结构基础,接下来我们详细地解释堆排的原理。什么是堆?堆其实是一种特殊的完全二叉树,在笔者之前的文章中,曾经讲解过二叉查找树,但是对于完全二叉树和满二叉树却一笔带过了,出来混总是要还的,接下来我们先把堆的概念普及一下。完全二叉树的概念,就是自上而下,自左而右,依次的将每一...

2018-07-21 10:37:43 1261 1

原创 MySQL:从B树到B+树到索引再到存储引擎

                   MySQL:从B树到B+树到索引再到存储引擎 学习Java也有一年多了,但是从来没有就数据库做一个完整的总结,心血来潮立了这么一个网文标题,希望不要虎头蛇尾吧,哈哈。索引其实是一种数据结构,在数据库中,读写的比例是在10:1,所以如果每一次查找都全表查找的话,效率将会变的十分的低下。所以,本文将会按照题目,按部就班地讲解MySql的索引。B树和...

2018-07-16 20:21:39 4579 5

原创 Spring解决循环注入的机制

Spring解决循环注入的机制    Spring是一个大型的IOC容器,管理着应用中对象的依赖关系和生命周期。此时我们设想这么一种情况,若是Spring发生循环注入的状况,应当怎么处理?    所谓循环注入,千万不要曲解成循环调用,循环调用是指对象A中的方法调用对象B中的方法,而对象B调用对象C的方法,最后C调用A的方法,构成了一个死循环,最后肯定栈满溢出,无法解决。而循环注入则指的是对象A拥有...

2018-07-14 12:28:50 9220 1

原创 设计模式之代理模式:三种代理模式的实现方式

设计模式之代理模式:三种代理模式的实现方式    前言:代理模式和另外一种设计模式--装饰者模式十分相像,他们都是在不修改目标对象源代码的基础上,对源代码的一次重构。只是,代理模式,关注的是目标对象的使用,他有目标的控制权,而装饰者模式,只是对目标对象功能的增强,仅此而已,不拥有目标对象的控制权。    代理模式有三种实现方式:继承目标对象的同一个接口,引入目标对象,重写方法;使用JDK动态代理的...

2018-07-10 19:17:51 5934 1

原创 Java实现二叉树(二):平衡二叉树的实现之AVL树

Java实现二叉树(二):平衡二叉树的实现之AVL树    前文中,我们实现了二叉查找树,同时,我们也提到了这么一个隐患:如果二叉树无法控制自己的深度,那么,二叉树的查找效率很可能会发生极端的转化--如,顺序的将一堆数据插入查找二叉树,此时,二叉树会成为一个近似链表的数据结构。所以,为了解决这个问题,我们必须要找到问题的根源所在--二叉树深度,由此,推出本文的主角--平衡二叉树。    一、平衡二...

2018-07-08 13:27:57 1252 5

原创 Java实现二叉树(一):二叉查找树的实现

Java实现二叉树(一):二叉查找树的实现    数据结构+算法=程序,这是共识,是真理,还是学生时代卷子中的考点。但大多数程序员往往缺乏数据结构和算法的知识,或是根本没有学过,或是学过,但在工作时频繁地与业务逻辑打交道,也就逐渐忘记了有这么一回事。    话不多说,直接开始吧,本文将介绍二叉树的基本概念,以及平衡二叉树增删改查节点的实现,由于网上关于数据结构的资料,C++相对居多,而本身作为一个...

2018-07-07 11:49:06 6909

原创 zookeeper(三):Java原生API的使用以及Watch机制

zookeeper(三):Java原生API的使用以及Watch机制    zookeeper提供了Java调用的API,但是实现的并不是特别强大,本文做一个概念性的了解。    一、简单说明    导入相应的jar包后,通过zookeeper的实例就可以完成相应的zookeeper操作了。    zookeeper的构造方法有很多,但是必须的有三个参数:连接zookeeper的地址;sessio...

2018-07-04 20:01:01 2617 1

原创 zookeeper(二):zookeeper概念 初步介绍

zookeeper(二):zookeeper概念 初步介绍    前文简单介绍了zookeeper的安装细节,本文对zookeeper的概念进行一个简单的了解。    一、什么是zookeeper?    zookeeper是一个高性能的分布式协调工具。    他有着以下的优点:一致性和可靠性:一个客户端发起的事务,会被作用到每一个服务器,成功或者失败都是一致的;单一视图:从任何服务器查看数据得到...

2018-07-03 18:10:00 198

原创 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 1284

原创 zookeeper(一):搭建zookeeper环境

zookeeper(一):搭建zookeeper环境        zookeeper的概念以及使用我们暂且搁置,本文我们仅仅讲述在linux环境下的zookeeper环境搭建    第一步:    创建三台linux服务器        第二步:    在usr/local下拷贝进zookeeper压缩包,并使用tar -zxvf解压压缩包,完成安装    第三步:    修改解压文件的文件名,...

2018-07-01 11:32:31 219

原创 GC:深入理解GC--细数GC回收器

GC:深入理解GC--细数GC回收器    前言:本文将深入解释GC的运行原理--什么对象会被GC回收;以及GC回收器的区别    GCROOT    大家都知道,GC会对不可达对象进行内存回收,那么如何标记不可达对象呢?    这里引出一个GCROOT的概念,一个对象如果和GCROOT对象没有链接,就说明这个对象不可达,便可以被回收。    通常来说,以下的对象会被作为GCROOT对象:Java...

2018-06-29 19:40:13 3725 1

原创 类加载详述以及双亲委派模型

类加载详述以及双亲委派模型    一、简介类加载过程    在上一文中,已经简单的讲解过类加载的步骤,此处稍做复习一下,不经意一看,已经是三月份的文章了...(文章链接)    类加载机制大方向分为三个步骤:    1、加载:用于查找和导入Class文件。    2、链接(链接又分为如下三个步骤):校验:用于校验二进制文件的合法性;准备:给类的静态变量分配内存,被赋上默认值;解析:将符号引用转化为...

2018-06-20 22:36:12 124

原创 RocketMQ:入门篇

RocketMQ:入门篇    一、简介    RocketMQ是大名鼎鼎的阿里开发的开源消息中间件,由于其高性能和可靠性,常被使用于企业的分布式架构中。    他有着如下优点:RocketMQ原生地支持分布式,不像ActiveMQ需要zookeeper才能完成主从的搭建;RocketMQ能够承载海量的消息,并且不会导致明显的写入延迟;RocketMQ提供丰富的API,支持消息失败重试机制;Roc...

2018-06-19 21:57:57 288

原创 进一步了解ActiveMQ

进一步了解ActiveMQ    一、JMS选择器    在生产端发送消息的时候,可以对每一个消息设置属性,大概有以下的方法,可以设置int类型、boolean类型、byte类型等的key-value对应的属性:    设置完成后,可以在消费时,加入类似于“age>25”的条件,在创建消费者时进行筛选。    大致过程如下:生产端代码段:消费端代码段:    二、消息的接受方式    我们在...

2018-06-18 20:51:52 139

原创 初识ActiveMQ

初识ActiveMQ    要了解ActiveMQ,先得了解JMS的概念,JMS(JavaMessageService)是Java提供的消息中间件的一组规范接口,ActiveMQ则是Apache遵循JMS规范实现的消息中间件。    一、JMS的优点    早在没有JMS的时候,应用系统通信存在如下缺陷:应用系统通信具有同步性,发送方需要等待接收方处理才能继续进行;发送方接收方的生命周期相互依赖,...

2018-06-18 18:44:11 138

原创 redis集群搭建

redis集群搭建    这是redis“三部曲”的终章了,附上前两个博客的“传送门”:redis的特性,redis入门篇。    在今天手动搭了一个集群,并不算太难,按部就班的就完事了,在此文记录一下步骤及思考。    步骤:学会安装一个redis这个并不算太难,网上一搜一大堆,就此略过。接下来,我们就可以创建集群了,由于本机跑多个虚拟机较为吃力,故,在一个虚拟机上用多个端口跑redis服务搭建...

2018-06-13 19:44:46 126

原创 redis的特性

redis的特性    承接上文redis入门篇,本文具体介绍一下redis的特性,以及与另外一个nosql数据库memcached的对比。    一、redis的优点    根据上文,我们知道redis的如下特性成为了他的竞争力:key-value对应的内存数据库,高效。value支持着五种丰富的数据类型,更加强大,memcache只是简单地key-value存储,但value的数据类型单一。操...

2018-06-13 17:19:04 4173 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 233

原创 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 432

原创 ConCurrentHashMap的实现原理

ConCurrentHashMap的实现原理    

2018-06-06 16:45:17 182

原创 CAS和ABA问题

CAS和ABA问题    引言:乐观锁和悲观锁的概念    悲观锁:悲观锁悲观地认为,自己执行操作的过程中一定有人修改过自己操作的值,所以在自己操作之前会加上一把锁,synchronized就是一个悲观锁。    乐观锁:乐观锁则乐观地认为,当自己执行操作时不会有人修改自己操作的值,所以采用不加锁的机制,只是在操作完成的那一刻发现产生冲突,则会重新执行操作,直到成功为止。CAS算法就是乐观锁的一种...

2018-06-05 22:30:55 3033

原创 Java常量池总结

Java常量池总结    一、基本概念介绍    什么是常量    用final修饰的变量即为常量(成员变量、局部变量、静态变量,只要被final给修饰过的)。        什么是常量池    先说静态常量池,来看看class文件中都包含了哪些内容。    其中前四个字节为魔数(确定一个class文件能否被JVM解析),后四个字节为存储版本号,其中前两个字节为次版本号,后两个为主版本号,最后就是...

2018-06-02 18:09:49 214

原创 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 614

原创 C++中的指针,引用和Java中的对象

    C++中的指针,引用和Java中的对象引用    一、C++中指针和引用的区别    相同点:在c++中,指针和引用都可以让人间接地操作一个对象。    不同点:首先说两者在定义上的区别,指针是存放对象的地址的一块内存,而引用是对象的别名。再看看以下的几行代码:int a,b,*p,&r=a;//正确r=3;//正确:等价于a=3int &rr;//出错:引用必须初始化...

2018-05-26 22:17:14 1037

原创 详解HashMap

详解HashMap    一、数据结构

2018-05-14 15:22:54 123

原创 算法:冒泡算法及优化

算法:冒泡算法及优化    代码如下: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 106

原创 TCP连接的三次握手和连接关闭的四次挥手

TCP连接的三次握手和连接关闭的四次挥手    一、文章大纲图    二、建立TCP连接三次握手过程第一次握手,由客户端发送syn报文给服务器端。第二次握手,服务器端返回ack(确认)+syn报文给客户端。第三次握手,客户端发送ack(确认)报文确认。    三、TCP连接关闭四次挥手过程第一次挥手,由客户端发送FIN报文(Finish)给服务器端。第二次挥手,由服务器端发送ack确认,表示收到报...

2018-05-07 16:50:12 140

原创 BIO、NIO、AIO的区别

BIO、NIO、AIO的区别    一、BIO(同步阻塞IO)    网络编程的模型其实就是C/S模型,即两个进程间的通信。BIO编程则提供最传统的一种IO网络编程方式,优点是API使用简单,易于理解。    BIO的模型是让服务器端提供一个端口号,新建一个ServerSocket套接字对象,客户端可以通过URL和端口号与服务器建立TCP连接,服务器端和客户端通过套接字来通信,在该模型中需要服务器...

2018-05-06 19:45:35 135

原创 ThreadLocal深入浅出

ThreadLocal深入浅出    一、分析ThreadLocal源码    ThreadLocal的核心方法一共就几个,get(),set()等等,我们由get()开始,一边分析其源码,一边揭开ThreadLocal的面纱。    先看看JDK7中的get()源码: public T get() { Thread t = Thread.currentThread(); ...

2018-05-03 18:31:18 113

原创 Java的Lock锁和synchronized关键字的区别及其使用

Java的Lock锁和synchronized关键字的区别及其使用    一、synchronized关键字和Lock的区别以及优缺点    我们可以回顾一下synchronized的使用,synchronized释放锁的时机有以下几种:当执行完代码块中的代码,释放锁;当代码抛出异常,释放锁;当调用锁的wait方法,释放锁;    以上三种情况便可以完全的帮我们解决线程同步的问题,为什么还要引入L...

2018-05-02 18:21:50 1689

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

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