自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

小范的博客

冰冻三尺非一日之寒

  • 博客(43)
  • 收藏
  • 关注

原创 手动方式搭建redis集群

redis集群环境手动搭建流程1)配置6份redis.conf文件。2)启动这6个redis实例。3)登录到其中一个redis实例和另外5个实例手动建立连接。4)登录到三个主节点将16384个槽点分配到这三个主节点。5)登录到三个从节点设置其对应的主节点。6)检查集群搭建是否正常。1.1 复制6个redis.conf文件,内容只需要按照下面的配置文件修改端口即可假定主从关系如下:主:cluster...

2018-04-08 16:38:25 952 1

原创 redis哨兵机制

一、为什么要使用哨兵机制redis主从复制存在缺陷,如果主节点出现问题不能提供服务,需要人工重新把从节点设置为主节点,还需要通知应用程序更新了主节点的地址。这样处理是非常不科学的。redis2.8正式提供哨兵架构。二、哨兵机制原理当sentinel监控的主节点出现故障时,redis sentinel自动完成故障发现和转移,并通知应用方,实现高可用性。故障转移和通知应用方只需要一个sentinel来...

2018-04-08 16:12:38 947 2

原创 redis主从复制

一、主从复制原理    redis主从复制分为全量复制和增量复制,redis2.8以后增加了增量复制操作,这样提高了同步效率以及节省了带宽资源。全量复制步骤以及时序图       1)从服务器连接主服务器,发送SYNC命令;   2)主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;   3)主服务器BGSAVE执行完后,向所有从服务器发送快...

2018-04-08 16:05:26 286

原创 redis持久化方案

一、什么是redis的持久化redis持久化的机制如下图二、redis持久化的两种方式方式一:RDB将当前数据快照到.rdb格式文件。方式二:AOF将写操作追加到缓冲区,再将缓冲区的操作同步到磁盘。三、两种持久化方式的对比1)RDB不能实时持久化数据,如果redis服务器断电可能存在丢失数据的风险。而AOF方式持久化做到实时实时持久化数据。2)加载RDB恢复数据远快于AOF方式。因为RDB是二进制...

2018-03-30 17:33:54 2442

原创 java通过NIO实现时间服务器

NIO客户端以及服务端通信流程图解读流程图1、客户端和服务端通信是通过SocketChannel(包含ByteBuffer),且客户端和服务分别一个SocketChannel对象。2、客户端与服务端都是从ByteBuffer读取/写入数据。NIO开发时间服务器大致流程服务端1、新开一个线程,打开ServerSocketChannel并设置为非阻塞模式,监听一个端口,新建一个多路复用器Selecto...

2018-03-26 15:27:01 1635

转载 五种IO模型详解

在《Unix网络编程》一书中提到了五种IO模型,分别是:阻塞IO、非阻塞IO、多路复用IO、信号驱动IO以及异步IO。下面就分别来介绍一下这5种IO模型的异同。1.阻塞IO模型  最传统的一种IO模型,即在读写数据过程中会发生阻塞现象。  当用户线程发出IO请求之后,内核会去查看数据是否就绪,如果没有就绪就会等待数据就绪,而用户线程就会处于阻塞状态,用户线程交出CPU。当数据就绪之后,内核会将数据...

2018-03-20 11:26:52 45591 3

原创 JVM内存模型详解

笔记大纲1、jvm内存结构图2、jvm按照线程共享和私有内存区域划分结构图3、堆和栈在功能、内存大小、线程共享私有进行比较4、JVM运行结构图5、线程安全本质时序图6、jdk6、7、8三个版本内存模型比较7、jdk1.8为什么将方法区移除到本地内存8、jvm内存启动参数详解JVM内存结构图(JDK1.6)多线程共享内存区域:方法区、堆。每一个线程独享内存:java栈、本地方法栈、程序计数器。程序计...

2018-02-09 14:24:27 40229 4

原创 服务器推送消息SSE以及springmvc后台实现例子

什么是SSE?SSE ( Server-sent Events )是 WebSocket 的一种轻量代替方案,使用 HTTP 协议,严格地说,HTTP 协议是没有办法做服务器推送的,但是当服务器向客户端声明接下来要发送流信息时,客户端就会保持连接打开,SSE 使用的就是这种原理。SSE和WebSocket比较SSE是单向的只能从服务器端向客户端推送消息,而Web

2018-02-01 10:45:13 7404 11

原创 https之SSL证书

内容大纲1、SSL证书是由受信任的数据证书颁发机构颁发的证书,主要是帮助用户识别服务器身份以及数据传输过程加密防止数据被篡改,防劫持、防篡改、防监听。2、一份SSL证书包含一个公钥和一个私钥。公钥用于数据加密私钥用于数据解密。3、SSL连接产生会话服务器会将它的证书传到客户端,客户端再根据传回的证书生成会话密钥,这个会话密钥会对传输数据进行加密。4、理解三个协议,握

2018-01-30 09:33:09 559

原创 mongodb高可用方案(三)可复制集内部机制

笔记大纲1、主从架构图和副本集架构图2、主节点选举算法(bully算法)、触发选举条件、如何人工干预主节点。3、副本集个数为什么是奇数个,防止无法选举出主节点,参与选举的节点最多只能有7个节点参与,在未选举出主节点时则整个集群只提供只读服务,当集群中所有的secondary节点都挂了这时主节点会自动降级为secondary节点对外提供只读服务,不提供写服务。4、集群中所有节点必须每

2018-01-29 09:44:58 327

原创 mongodb高可用方案(一)主从复制

一、mongodb为什么要做主从1、数据的备份,有利于故障的恢复2、读写分离,主节点负责写操作,从节点负责读操作,这样就把读写压力分开,保证系统的稳定性.二、mongodb主从复制的原理主节点会记录写有关的操作,读操作不记录。这些操作记录在local数据库中的oplog.$admin这个集合,这个是一个固定大小的集合,可以修改oplogSize大小,单位MB,一般为磁盘

2018-01-29 09:35:46 3337

原创 mongodb高可用方案(二)可复制集

一、mongodb高可用方案实现1)主从复制(不建议使用,会有单点故障的问题)2)复制集(mongodb官方推荐)主从复制会有如下问题1、主节点挂了能否自动切换连接(目前需要手工切换)。2、主节点的读写压力过大如何解决3、从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大4、数据压力大到机器支撑不了的时候能否做到自动扩展二、高

2018-01-29 09:33:03 1058

原创 java手动实现双向链表LinkedList

一、LinkedList原理介绍LinkedList是java中重要的List集合,其内部是一个双向链的数据结构。插入和删除的效率比ArrayList高,之前手动实现的ArrayList,因为插入和删除没有数组的复制工作,如果想在下标为index位置插入元素则通过从头部或者尾部开始查找,找到index原始位置的元素,则修改原始位置index元素的Node中的上一个元素,以及元素index元素前

2018-01-12 15:22:29 803

原创 java实现分布式环境Hash一致性

一、hash一致性解决的问题如果一个缓存系统,出现某一个节点宕机,如果采用的是hash(key)%N的方式来操作具体某一台缓存机器,这时候N变成了N-1这样会导致大部分缓存失效(缓存雪崩),这个是很致命的。如果缓存失效会导致压力转移到数据库DB层,这时DB压力陡增可能导致整个服务不可用。二、hash一致性的实现原理大致是将缓存系统的机器(ip端口)通过hash算法[0,2^32)将

2018-01-08 17:42:01 474

原创 linux清除tomcat日志文件Shell脚本

生产环境中tomcat每天都会产生很多日志,如果不清理磁盘容量会不够,手动清理又太麻烦。因此写个脚本每天定时去删除5天前(根据实际情况而定)的日志文件。1.写一个/usr/local/script/cleanTomcatlog.sh脚本#!/bin/bashexport LANG=zh_CN#tomcat1日志文件路径export WEB_TOMCAT1=/usr/local/tom

2017-12-26 14:25:04 4768

原创 JSP页面头部page标签详解

理解这个page标签必须搞懂jsp文件从请求到响应经历的三个阶段。1)将jsp文件编译成servlet java文件(pageEncoding)2)服务器将java文件编译成class文件(不受外界参数控制)3)服务器将数据返回到浏览器(charset)<%@ page language="java" contentType="text/html;chars

2017-12-25 19:06:59 5914

原创 单机redis环境java实现分布式锁

分布式锁一般有三种实现方式:1. 数据库乐观锁;2. 基于Redis的分布式锁;3. 基于ZooKeeper的分布式锁。为了确保分布式锁可用,我们至少要确保锁的实现同时满足以下四个条件:1)互斥性。在任意时刻,只有一个客户端能持有锁。 2)不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。 3)具有容错性。只要大部分的Redis节点正

2017-12-24 21:57:33 379

原创 简单实现java中ArrayList

ArrayList实现了一个可变长度数组,ArrayList这个对象包含一个数组,以及当前数组添加的元素个数,以及添加元素个数和数组长度一样的时候将原数组复制到新数组。代码如下。package test;import java.util.Iterator;import java.util.NoSuchElementException;/** * 实现自己的ArrayList *

2017-12-09 21:39:32 555

转载 linux环境定时重启tomcat

1.写一个shell脚本test.sh,重新启动tomcat[java] view plain copy   #!/bin/sh    . /etc/profile    pid=`ps aux | grep tomcat | grep -v grep | grep -v retomcat | awk '{print 

2017-11-28 15:20:30 360

原创 java实现单例模式的几种方式

我们知道实现单例模式的方式有很多种,如:懒汉式加载、饿汉式、双检锁的方式实现单例,今天主要介绍一下静态内部类、枚举、cas方式实现单例静态内部类的方式实现单例package test;/** * 静态内部类实现单例 * @author lenovo * */public class InnerClassSingle { private InnerClassSin

2017-11-26 10:04:06 288

原创 volatile和synchronized比较以及线程安全中的应用

一、线程安全的执行控制和内存可见的理解线程安全的两个方面:执行控制和内存可见。执行控制的目的是控制代码执行(顺序)及是否可以并发执行。内存可见控制的是线程执行结果在内存中对其它线程的可见性。根据Java内存模型的实现,线程在具体执行时,会先拷贝主存数据到线程本地(CPU缓存),操作完成后再把结果从线程本地刷到主存。二、synchronized和volatile基本原理

2017-11-21 11:47:19 252

转载 Java内存模型

Java内存模型即Java Memory Model,简称JMM。JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式。JVM是整个计算机虚拟模型,所以JMM是隶属于JVM的。如果我们要想深入了解Java并发编程,就要先理解好Java内存模型。Java内存模型定义了多线程之间共享变量的可见性以及如何在需要的时候对共享变量进行同步。原始的Java内存模型效率并不是很理想,

2017-11-21 09:36:15 1585

转载 Java中HashMap底层实现原理(JDK1.8)源码分析

这几天学习了HashMap的底层实现,但是发现好几个版本的,代码不一,而且看了Android包的HashMap和JDK中的HashMap的也不是一样,原来他们没有指定JDK版本,很多文章都是旧版本JDK1.6.JDK1.7的。现在我来分析一哈最新的JDK1.8的HashMap及性能优化。在JDK1.6,JDK1.7中,HashMap采用位桶+链表实现,即使用链表处理冲突,同一h

2017-11-19 17:19:18 1031 1

原创 hashmap底层实现原理以及常见的面试问题

hashmap算法优劣标准1.分布均匀2.尽量避免冲突关于hashMap的几个问题1、hashing的概念这个是一个hash算法,将Key对象通过hashing的到需要存储值对象的位置bucket。2、HashMap中解决碰撞的方法根据key的hashcode得到存储位置bucket,有可能不同的key得到的位置一样这样就出现了hash碰撞。这样就引入了每一个bucke

2017-11-19 10:53:54 2601

原创 一个看似简单的数字交换问题

package test;import java.lang.reflect.Field;/** * 交换两个数字的相关知识点 * 1、Integer a = 1;编译后可以看到装箱操作Integer.valueOf(1); * 2、Integer.valueOf(1) 从缓存数组[-128,127]里取出下标为129的值1; * 3、如果调field.setAccessible(t

2017-11-13 23:25:47 267

原创 java蛇形矩阵输出方法(顺时针、逆时针)

package myTest.test;public class TestMatrix { /** * 蛇形矩阵输出方法(顺时针、逆时针输出仅仅在开始的方向不同,顺时针向右,逆时针向下) * * @param N * @param circleDir * @return */ private static int[][] getMatrix(int N, Circ

2017-10-31 14:21:36 3113

原创 缓存击穿之布隆过滤器bloom Filter实现方式

一、什么是缓存击穿查询一个在缓存内必然不存在的数据,导致每次请求都要去存储层去查询,这样缓存就失去了意义。如果在大流量下数据库可能挂掉。缓存击穿是黑客攻击系统的常用手段。二、怎么解决缓存击穿问题?采用布隆过滤器来实现。什么是布隆过滤器?它是一种空间效率极高的概率型算法和数据结构,用于判断一个元素是否在集合中(类似Hashset)。它的核心是一个很长的二进制向量和一系列的hash

2017-10-26 10:28:35 9978 11

原创 Java线程(二):Lock

一、为什么出现Lock?我们知道java中有synchronized可以有效的解决并发引起的共享资源线程安全问题,但是synchronized存在一些缺陷。1)当使用synchronized时线程获取的锁已经被占用只能等待其他线程释放锁资源。而Lock可以只等待一定的时间或者能够响应中断。     2)当多个线程进行读写操作时,读写操作会冲突,写写操作会冲突,但是读读操作不会冲突,如果

2017-10-22 22:26:13 170

原创 Java线程(一):synchronized

一、什么时候会出现线程安全问题?当多个线程同时访问一个资源(共享资源)时会出现线程安全。资源可以是一个变量、一个对象、一个文件、一个数据库表等。需要注意的是如果多个程序同时访问一个方法,定义在方法内部的局部变量并不是临界资源(共享资源),因为方法是在栈中执行的,而栈是线程私有的,因此不会出现线程安全问题。二、如何解决线程安全问题?通常来说在通过对访问共享资源代码加锁,当一个线程来访问时

2017-10-22 11:38:39 143

原创 java多线程之fork/join

1、fork join是什么? Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。fork join流程图2、怎么使用fork/join3、工作窃取算法工作窃取(work-stealing)算法是指某个线程从其他队列里窃取任务来执行。工作窃取的运行流

2017-10-15 20:12:45 789

原创 java之ThreadLocal

1、概述ThreadLocal类用来提供线程内部的局部变量。这些变量在多线程环境下访问(通过get或set方法访问)时能保证各个线程里的变量相对独立于其他线程内的变量,ThreadLocal实例通常来说都是private static类型。 总结:ThreadLocal不是为了解决多线程访问共享变量,而是为每个线程创建一个单独的变量副本,提供了保持对象的方法和避免参数传递的复杂

2017-10-12 14:35:25 177

原创 spring ioc中实例化bean以及依赖注入bean和基本类型属性简单实现方案

Spring两个重要特性IOC和AOP,本文中简单实现bean的创建以及属性依赖注入。实现步骤如下:1、通过dom4j解析bean.xml文件,将bean对象以及依赖属性装入List。2、遍历list,通过反射机制实例化对象。3、遍历list,通过反射调用bean里的set方法注入依赖对象。引入dom4j maven依赖 dom4j dom4j

2017-10-10 11:50:38 836

原创 java动态代理

spring中最重要的两个特性,1)IOC   2)AOP,而AOP最核心的技术就是java动态代理。动态代理原理:JVM在内存中生成字节码文件(如下图),然后通过类加载器加载这个class文件在JVM方法区生成Class对象。其中类加载器加载class文件有两种方式。1)new 对象的时候隐式方式加载 2)通过Class.forName方式。通过持久化动态代理类发现,生成的动态代理类有三

2017-10-08 21:41:45 161

原创 java之静态代理

接口类package proxy;public interface People { public void study();}代理类和被代理类package proxy;/** * 被代理的类 * @author lenovo * */public class Student implements People{ @Override public void

2017-10-08 21:08:12 183

原创 java基于事件驱动之spring事件驱动

事件驱动4个要素:事件、事件源、注册中心(事件通道)、侦听器。事件驱动和观察者模式本质一样,事件驱动是观察者模式的经典实现。事件驱动的好处:1、 无耦合的关联,事件发布者和订阅者不需要预先知道彼此的存在。2、 异步消息传递,业务逻辑和事件可以同步发生。3、 多对多的交互,发布订阅模型。定义事件类:这个类需要继承ApplicationEvent

2017-10-08 17:08:24 7796

原创 POI实现导出Excel数据工具类

项目中很多地方需要导出excel数据,因此需要将导出excel数据封装成工具类。实现思路:      1、将查询结果List以及T作为入参。      2、新建一个注解,在T对象需要生成表格数据的字段加上这个注解。供外部调用的方法:import java.io.IOException;import java.util.List;import javax.servlet.http.HttpSe

2017-09-28 15:50:10 378

原创 同一个tomcat实例下多个应用之间相互调用的实现

项目开发中遇到同一个tomcat下的多个应用之间会相互调用的问题,分享一下实现方法。背景:tomcat有project1,project2两个应用,在project2中需要调用project1中bean里的方法。预置条件:tomcat server.xml文件中两个应用的Context 分别增加 crossContext="true"属性。project1代码实现:

2017-09-28 10:38:46 4044

原创 java枚举实现命名空间层级限定

实现思路:通过递归调用实现枚举限定命名空间枚举类:Typepublic enum Type { China(null, "中国"), Chongqing(China, "重庆"), Yuzhongqu(Chongqing, "渝中区"); private Type parent; private String area; private Type(Type parent, Str

2017-09-27 17:15:22 1350

原创 java web日志记录之spring aop实现方式

实现思路:spring aop切入到bean,在需要写日志的方法加入注解AuditLog,如果没有注解的方法则不记录日志。注解类@Target({ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Audi

2017-09-27 16:25:46 1685

原创 java通过filter实现操作日志入库的实现

java Web工程实现操作日志记录的方式有很多,比如通过spring aop方式实现,也可以通过Filter方式实现。public class StoreLogFilter implements Filter { private static final Logger logger = LoggerFactory.getLogger(StoreLogFilter.class); priv

2017-09-27 15:58:51 5385 2

空空如也

空空如也

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

TA关注的人

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