自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

春水上行的博客

我想让事情是它本来该有的样子

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

原创 Docker学习教程(一)

Docker基础知识什么是Docker ?Docker是基于Go语言实现的开源应用容器引擎,它可以让开发者打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。Docker诞生于2013年。Docker的理念是实现应用组件的一次封装,到处运行。这里的应用组件,可以是web应用,可以是数据库服务,甚至是一个操作系统和集群。基于Linux平台上的多项开源技术,Docker提供了高效、敏捷和轻量级的容器方案,并支持部署到本地环境和多种主流云

2021-08-16 18:38:36 514

原创 深入JAVA并发编程(十):线程池(三)

ScheduledThreadPoolExecutorScheduledThreadPoolExecutor是可对任务进行延迟/周期性调度的执行器(Executor),这类Executor一般实现了ScheduledExecutorService这个接口。ScheduledExecutorService在普通执行器接口(ExecutorService)的基础上引入了Future模式,使得可以限时...

2020-01-15 17:14:58 565

原创 深入JAVA并发编程(九):线程池(二)

ThreadPoolExecutor在上一篇中我们讲过通过Executors工厂,用户可以创建自己需要的线程池对象,并且好几个线程池底层都是使用了ThreadPoolExecutor实现,只是传入的参数不同ThreadPoolExecutor,它是J.U.C在JDK1.5时提供的一种实现了ExecutorService接口的执行器,或者说叫线程池。ThreadPoolExecutor并没有自己直...

2020-01-08 18:00:07 587

原创 深入JAVA并发编程(八):线程池(一)

线程池合理的使用线程池能够为我们带来如下好处降低资源消耗:如果我们每次执行异步任务都去new一个线程来运行,那么线程的创建和销毁的开销则是难于预估的,而使用线程池就可以直接对线程复用来降低资源消耗。提高线程的可管理性:使用线程池可以进行统一分配、调优和监控。JDK已经为我们提供好了一套Executor框架,帮助我们来有效地进行线程控制。首先我们来看一下类图,这些类和接口均在JUC包中...

2020-01-03 15:59:16 481

原创 深入JAVA并发编程(七):并发容器(三)

并发容器ConcurrentSkipListMap我们知道HashMap是一种键值对形式的数据存储容器,它内部的元素是无序的。但是JDK提供了TreeMap,TreeMap使用红黑树按照key的顺序(自然顺序、自定义顺序)来使得键值对有序存储,但是和HashMap同样是线程不安全的,因此在JAVA并发包中提供了ConcurrentSkipListMap容器,它能够保证在多线程环境下使键值对按照...

2019-12-19 14:20:29 330

原创 深入JAVA并发编程(六):并发容器(二)

并发容器ConcurrentLinkedQueueConcurrentLinkedQueue是线程安全的无界非阻塞队列,其底层数据结构使用单向链表实现,出队和入队操作使用CAS来实现线程安全。源码分析我们先来看一下链表的节点类 private static class Node<E> { //存储的数据 volatile E item; /...

2019-12-10 14:37:52 384

原创 深入JAVA并发编程(五):并发容器(一)

原子操作类我们知道,当多线程同时对一个变量进行更新操作时,可能会出现线程安全性问题,通常我们可以使用synchronized、Lock来进行同步操作解决这个问题,但是这样程序性能会有所影响。JAVA1.5之后,JUC包中提供了一系列的原子操作类,提供了一种用法简单、性能高效、线程安全地更新变量的方式。原子更新基本类型类使用原子的方式更新基本类型,Atomic包提供了以下三个类Atomic...

2019-11-22 17:02:28 412

原创 深入JAVA并发编程(四):原子操作类

JAVA中的锁CAS算法我们知道在使用锁的时候对性能会有影响,CAS(Compare And Swap 比较并交换)是一种有名的无锁算法,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,所以也叫非阻塞同步(Non-blocking Synchronization)。实现思想是这样的,CAS(V, A, B),V为需要读写内存地址的值、A为预期原值,B...

2019-11-06 17:21:03 296

原创 深入JAVA并发编程(三):JAVA中的锁

JAVA中的锁Lock接口锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源。在Lock接口出现之前,JAVA是靠synchronized关键字实现锁功能的,JDK5之后,并发包中新增了Lock接口及相关实现类用来实现锁功能,它提供了与synchronized关键字类似的同步功能,只是在使用时需要显式的获取和释放锁,它拥有了锁获取和释放的可操作性,可中断的...

2019-10-24 17:33:36 356

原创 深入JAVA并发编程(二):JAVA内存模型

多线程并发编程线程安全性问题共享资源是指该资源被多个线程持有或者说多个线程都可以去访问该资源。线程安全问题是指当多个线程同时读写一个共享资源时并且没有任何同步措施时,导致出现脏数据获取其他不可预见结果的问题。当多个线程只是读取共享资源而不去修改的时候,是不会出现线程安全问题的。只有当至少一个线程修改共享资源时才会存在线程安全问题。举个例子例如计数器。有一个共享变量count,在t1时刻时A...

2019-09-18 14:09:10 272

原创 NIO.2遍历目录删除指定日期前的文件

public class DeleteFileJob { public void deleteFile() { Path path= Paths.get("C://"); SimpleFileVisitor<Path> simpleFileVisitor = new SimpleFileVisitor<Path>() { ...

2019-09-03 11:07:05 222

原创 深入JAVA并发编程(一):JAVA线程基础

并发编程持久化持久化可以提高RabbitMQ的可靠性,以防在异常情况(重启、宕机)下的数据丢失,RabbitMQ的持久化分为三个部分:交换器的持久化、队列的持久化和消息的持久化。交换器的持久化...

2019-08-30 14:42:35 503

原创 消息中间件RabbitMQ(四):高级特性

RabbitMQ高级持久化持久化可以提高RabbitMQ的可靠性,以防在异常情况(重启、宕机)下的数据丢失,mandatory

2019-07-31 17:46:00 489

原创 消息中间件RabbitMQ(三):进阶特性

RabbitMQ进阶mandatory和immediate我们在学习basicPublish方法中提到过这两个参数,但是没有讲解。这两个参数的功能是当消息传递过程中不可到达目的地时将消息返回给生产者的功能。mandatory当mandatory参数设为true时,交换器无法根据自身的类型和路由键找到一个符合条件的队列,那么RabbitMQ会调用Basic.Return命令将消息返回给生产者...

2019-07-11 20:09:14 318

原创 消息中间件RabbitMQ(二):API使用详解

RabbitMQRabbitMQ详解RabbitMQ连接创建连接时需要给定IP地址、端口号、账号密码等参数。 ConnectionFactory connectionFactory=new ConnectionFactory(); connectionFactory.setHost("192.168.1.1"); //RabbitMQ服务端默认端口号为5672 co...

2019-07-09 19:24:55 2065

原创 消息中间件RabbitMQ(一):基础概念与入门

RabbitMQRabbitMQ简介什么是消息中间件消息是指在应用间传递的数据,可以是字符串、JSON、对象等等。看一下百度百科的定义:消息队列中间件(Message Queue Middleware)是指利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。目前开源的消息中间件比较主...

2019-07-02 22:02:50 553

原创 Spring Cloud从入门到精通(七):配置中心 Spring Cloud Config

Spring Cloud Config分布式系统中,每个服务都有许多的配置文件,当服务越来越多的时候,配置文件的管理就是让人头疼的一件事,所以我们需要有统一管理配置文件的组件。而Spring Cloud Config是就为分布式系统提供集中化的外部配置支持,它分为服务端和客户端两个部分,服务端也被称为分布式配置中心,它是一个独立的微服务应用,用来连接配置仓库并为客户端提供获取配置信息等访问接口,...

2019-05-07 15:13:39 320

原创 Spring Cloud从入门到精通(六):网关服务 Zuul

Zuul

2019-04-29 14:17:59 519

原创 Spring Cloud从入门到精通(五):声明式服务调用 Feign

Feign我们前面的文章都是使用RestTemplate对依赖服务进行调用,而Feign采用了声明式API接口的风格,将服务调用过程变得更为简单。并且Feign还整合了Ribbon和Hystrix来简化我们的开发。入门案例我们的服务注册中心和服务提供者还使用前面的例子,我们先将其启动。服务注册中心:8001服务提供者开启两个实例:9998和9999.(1)先创建一个服务消费者的项目fe...

2019-04-23 16:37:02 283

原创 Spring Cloud从入门到精通(四):熔断器 Hystrix

Hystrix在分布式系统中,各个服务之间会进行依赖调用,因为网络原因或者是服务本身出现故障,可能会导致调用失败或延迟,这就有可能造成调用方出现延迟的情况,造成线程阻塞。若此时调用方的请求不断增加,就会因为等待故障方响应形成任务积压,使得线程资源消耗殆尽,最后造成自身服务的瘫痪,并且有可能造成整个系统瘫痪,即雪崩效应。举个例子:例如在电商网站中,可能存在用户、订单、库存等很多服务。当用户创建订...

2019-04-19 10:08:48 541

原创 Spring Cloud从入门到精通(三):负载均衡 Ribbon

RibbonSpring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,封装了Netflix Ribbon实现。Spring Cloud Ribbon(1) 服务的注册与发现

2019-04-03 17:21:12 543

原创 Spring Cloud从入门到精通(二):服务治理 Eureka

Eureka什么是服务治理?为什么要使用?服务治理是微服务架构中最核心和基础的模块,主要用来实现微服务实例的自动注册和发现。在最初开始构建微服务架构时,我们的服务可能并不多,我们可以通过静态配置来完成服务A对服务B的调用。比如,服务A需要调用服务B来完成一个操作,为了实现服务B的高可用,我们必须手工的维护服务B的实例清单。为了但是随着业务的发展,系统的功能越来越复杂,服务也越来越多,我们的集...

2019-03-29 15:38:47 668 1

原创 Spring Cloud从入门到精通(一):初识微服务

微服务随着互联网技术的飞速发展,用户量大量增高,业务场景越来越复杂,传统的单体架构已经很难满足我们的需求。这时微服务的概念就应运而生,微服务英文名称Microservice,微服务架构的系统是一个分布式系统,按业务领域划分为独立的服务单元,有自动化运维、容错、快速演进的特点它能够解决传统单体架构系统的痛点,同时也能满足越来越复杂的业务需求。微服务按照业务来划分,例如支付和商品等业务模块分为...

2019-03-27 11:25:52 939

原创 Redis从入门到精通(5):复制、哨兵和集群

复制通过持久化的功能,Redis保证了即使在服务器重启的情况下也不会丢失(或少量丢失)数据。但是当数据存储在一台服务器时,当服务器的硬盘出现了故障,就会导致所有数据丢失。为了避免这种情况,我们通常的做法是将数据库复制多个副本部署在不同的服务器上,这样即使某一台出了故障,其他的还可以提供服务。Redis为我们提供了复制(replication)功能,当一台数据库的数据更新之后,自动将更新的数据同步...

2019-03-03 20:57:16 472

原创 Redis从入门到精通(4):Jedis

管道客户端和Redis使用TCP协议连接。不论是客户端向Redis发送命令还是Redis向客户端返回命令的执行结果,都需要经过网络传输。这两个部分的总耗时称为往返时延。根据网络性能不同,往返时延也不同,大致来说本地回环地址的往返时延在数量级上相当于处理一条简单命令的时间。如果执行较多的命令,每个命令的往返时延累加起来对性能还是有一定影响的。在执行多个命令时每条命令都需要等待上一条命令执行完...

2019-02-26 21:30:06 278

原创 Redis从入门到精通(3):Lua脚本与持久化

Lua语言lua是一种轻量级的脚本语言,Redis从2.6版本引入对lua脚本的支持。Redis会将整个脚本作为一个整体执行,与事务类似。接下来我们将简单的学习Lua。数据类型lua是一个动态类型语言,一个变量可以存储任何类型的值。编写Redis脚本常用的几种数据类型如下:变量Lua的变量分为全局变量和局部变量。全局变量无需声明就可以直接使用,默认值是nil。例如: a=1...

2019-02-24 22:23:37 914

原创 Redis从入门到精通(2):事务、过期时间、sort以及队列

Redis事务Redis中的事务是一组命令的集合,事务最基本的特性就是原子性。一个事务中的命令要么全都执行,要么全部不执行。银行转账是理解事务最常见的一个例子,我已经在以前的文章中讲过很多次事务,这里就不再细讲,我们直接来看Redis的事务怎样来使用。Redis事务的原理是先将属于一个事务的命令发送给Redis,然后再让Redis依次执行这些命令。例如: MULTI SADD te...

2019-02-21 22:36:10 772

原创 Redis从入门到精通(1):数据类型

Redis简介Redis由C语言编写,Redis是一个开源的、高性能的、基于内存的轻量级键值数据库。Redis支持丰富的数据类型,例如string,list,set,sorted set,hash等。Redis的功能丰富,内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能等等,可用作数据库,高速缓存和消息队列代理。Redis数据库中的所有数据都存储在内存中,因此性能非常强大。...

2019-02-19 23:22:07 1460 1

原创 JAVA数据结构和算法:第八章(排序)

#排序排序是我们程序中经常面对的问题,那么排序的严格定义是什么呢?假设含有n个记录的序列为{r1,r2,r3…..,rn},其对应的关键字分别为{k1,k2,k3…..,kn},需确定1,2,…..,n的一种排列p1,p2,……..,pn,使其相应的关键字满足Kp1<=Kp2…….<=Kp2(非递减或非递增)关系,即使得序列成为一个按关键字有序的序列{rp1,rp2……rpn},这样的操作就称为排序

2017-09-12 16:40:39 1162

原创 JAVA数据结构和算法:第七章(树)

哈夫曼树哈夫曼树是一种应用广泛的二叉树,可用来构造最优编码,用于信息传输、数据压缩等方面。 我们先来了解一些基本概念 路径:路径是指从一个结点到另一个结点之间的分支序列。 路径长度:是指从一个结点到另一个结点经过的分支数目。 结点的权:实际应用中,人们常常给树的某个结点赋予一个具有某种实际意义的实数,称该实数为这个结点的权。 树路径长度:从树根到每一结点的路径长度之和 带权路径长度:从树

2017-09-10 16:00:40 837 2

原创 JAVA数据结构和算法:第六章(树)

树树是n个结点的有限集。n=0时称为空树。在任意一颗非空树中:(1)有且仅有一个特定的称为根的结点;(2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2…..Tm,其中每一个集合本身又是一棵树,并且称为根的子树。如下图 结点: 树的结点包含一个数据元素及若干指向其子树的分支。 结点的度:结点拥有的子树数称为结点的度。 叶结点:度为0的结点称为叶结点或终端结点。 分支

2017-09-02 13:12:25 1248 1

原创 JAVA数据结构和算法:第五章(串和KMP算法)

串串是由零个或多个字符组成的有限序列,经常被称为字符串。一般记为s=”a1a2a3a4..an”. 零个字符的串被称为空串,长度为0.串中任意个数的连续字符组成的序列被称为子串,包含子串的串被称为主串。例如lover是love的主串,love是lover的空串。串的比较字符串的比较是通过字符之间的ASCII编码值来确定大小的。比较两个字符串是否相等,必须是它们的长度以及对应位置的字符都相等才认定相

2017-08-30 19:48:34 883 1

原创 JAVA数据结构和算法:第四章(HashMap和HashSet底层原理及实现)

HashMap内部原理及实现什么是哈希表?哈希表(hash table)也叫散列表,是一种非常重要的数据结构,我们先来看一下其他数据结构的特点。 数组:采用一段连续的存储单元来存储数据。对于指定下标的查找,时间复杂度为O(1);通过给定值进行查找,需要遍历数组,逐一比对给定关键字和数组元素,时间复杂度为O(n),对于一般的插入删除操作,涉及到数组元素的移动,其平均复杂度也为O(n) 链表:对于

2017-08-27 18:35:10 8346

原创 JAVA数据结构和算法:第三章(栈和队列)

栈栈是限制仅在一个位置上进行插入和删除的线性表。允许插入和删除的一端为末端,称为栈顶。另一端称为栈底。不含任何数据元素的栈称为空栈。栈又成为后进先出(LIFO)表,后进入的元素最先出来。 首先,栈是一个线性表,元素之间具有线性关系,即前驱后继关系,其次,它是一种特殊的线性表,只能在表尾进行插入和删除操作。栈的插入操作,叫作进栈(push),删除操作,叫作出栈(pop). 由于栈是一个线性表,所以我们

2017-08-25 16:58:25 988

原创 JAVA数据结构和算法:第二章(表)

表线性表的定义线性表,从名字上来看,像线连起来的表。每个元素都是连起来的,比如在体育课按照老师定好的队列排队的时候,有一个打头,一个收尾,中间的每个人都知道前面是谁,后面是谁,就像一根线将他们联系在一起,就可以称之为线性表。这时候我们来看几个关键点,首先元素之间是有顺序的,并且第一个元素无前驱,最后一个元素无后继,其他的元素都有且只有一个前驱和后继,这样才能形成线性表。我们用数学语言来进行定义,若有

2017-08-23 16:57:26 1546 1

原创 JAVA数据结构和算法:第一章(时间复杂度和空间复杂度)

数据结构数据结构基础概念不论是哪所大学,数据结构和算法这门课都被贯上无趣、犯困、困难的标签,我们从最基础最通俗的语言去说起,保证通俗易懂。 数据结构到底是什么呢?我们先来谈谈什么叫数据。 数据:数据是描述客观事物的数值、字符以及能输入给计算机且能被计算机处理的各种符号集合。 简单的来说,数据就是计算机化的信息。 数据元素:是组成数据的基本单位,在计算机中通常被作为一个整体进行考虑和处理。也被称为记

2017-08-20 15:49:03 22002 19

原创 SpringMVC从入门到精通(二)

Spring MVCSpring MVC数据类型转换Spring3引入了更加通用的类型转换系统,其定义了SPI接口(Converter等)和相应的运行时执行类型转换的API(ConversionService等)。该类型转换系统是Spring通用的,其定义在org.springframework.core.convert包中,提供无状态、强类型且可以在任意类型之间转换的类型转换系统,可以用于任何需要

2017-08-16 20:59:28 869

原创 SpringMVC从入门到精通(一)

Spring MVCSpring MVC简介Spring web mvc和Struts2都属于表现层的框架,它是Spring框架的一部分。Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring MVC大大

2017-08-15 20:58:49 1436

原创 Mybatis从入门到精通 (二)

MybatisMybatis映射文件MyBatis 的真正强大在于它的映射语句,映射器的 XML 文件相对简单。如果拿它跟JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 就是针对 SQL 构建的,并且比普通的方法做的更好。 SQL 映射文件有很少的几个顶级元素(按照它们应该被定义的顺序):cache – 给定命名空间的缓存配置。cache-ref – 其他命名空间

2017-08-14 13:50:02 1561 1

原创 Mybatis从入门到精通 (一)

MybatisMybatis简介MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。 MyBatis 是支持普通SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数

2017-08-12 17:55:55 1825 1

空空如也

空空如也

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

TA关注的人

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