- 博客(241)
- 资源 (7)
- 收藏
- 关注
原创 23种设计模式详解
设计模式关系图UML与设计原则UML类图快速入门 : https://blog.csdn.net/love905661433/article/details/84334960设计原则简介 : https://blog.csdn.net/love905661433/article/details/84335013设计模式创建型设计模式(Creational)简单工厂模式(Simp...
2018-11-25 12:27:34 836
原创 设计模式-状态模式(State)
概述定义 : 允许一个对象在其内部状态改变时, 改变它的行为类型 : 行为型适用场景一个对象存在多个状态(不同状态下行为不同), 且状态可相互转换优点将不同的状态隔离把各种状态的转换逻辑分布到State子类中, 减少相互间依赖增加新的状态很简单缺点状态多的业务场景导致类数目增加, 系统变复杂模式角色Context(环境) :定义客户感兴趣的接口维护一...
2018-11-25 11:04:55 418
原创 设计模式-访问者模式(Visitor)
概述定义 : 封装作用于某数据结构(如List/Set/Map等)中的各元素的操作可以在不改变各元素的类的前提下, 定义左用于这些元素的操作类型 : 行为型适用场景一个数据结构(如List/Set/Map等)包含很多类型对象数据结构与数据操作分离优点增加新的操作很容易, 即增加一个新的访问者缺点增加新的数据结构困难具体元素变更比较麻烦模式角色Visit...
2018-11-25 08:14:24 223
原创 设计模式-单例模式(Singleton)详解
概述定义 : 保证一个类仅有一个实例, 并提供一个全局访问点又称单件模式类型 : 创建型适用场景想确保任何情况下都绝对只有一个实例优点在内存里只有一个实例, 减少了内存开销可以避免对资源的多重占用设置了全局访问点, 严格控制访问缺点没有接口, 扩展困难重点私有构造器线程安全问题延迟加载序列化和反序列化安全问题反射安全问题分类单例模式分为懒汉...
2018-11-23 09:56:00 2234 2
原创 MySQL高级-索引优化
索引优化的前提知识要理解MySQL的索引相关知识, 需要能看懂MySQL的执行计划explain, 关于explain的详解可以参考博文 : https://blog.csdn.net/love905661433/article/details/82905060索引定义在数据之外, 数据库系统还维护着满足特定查找算法的数据结构, 这些数据结构以某种方式引用(指向)数据, 这样就可以在这...
2018-10-02 10:30:26 509 1
原创 MySQL优化-explain执行计划详解
MySQL Query Optimizer简介MySQL中有专门负责优化SELECT语句的优化器模块, 主要功能 : 通过计算分析系统中收集到的统计信息, 为客户端请求的Query提供它认为最优的执行计划当客户端向MySQL请求一条Query, 命令解析器模块完成请求分类, 区别出事SELECT并转发给MySQL Query Optimizer时, MySQL Query Optimizer...
2018-09-30 09:12:45 2332 1
原创 Java并发-synchronized, 偏向锁, 轻量级锁详解
synchronized概述synchronized就是所谓的重量级锁, 但是自从jdk1.6引入了偏向锁, 轻量级锁之后, synchronized就没有那么重了。synchronized用法对于普通同步方法,锁是当前实例对象对于静态同步方法,锁是当前类的Class对象对于同步方法块,锁是Synchonized括号里配置的对象synchronized实现原理任何对象都有一...
2018-09-27 18:43:03 1576 1
原创 JVM工具-jstack
jstack打印线程堆栈信息, 支持支持本地java进程,core文件以及远程java进程命令格式jstack [ options ] pidjstack [ options ] executable corejstack [ options ] [ server-id@ ] remote-hostname-or-IPoptions : 功能选项pid : 要打印堆栈信息的Ja...
2019-02-20 08:02:37 1507
原创 JVM Troubleshooting命令-jinfo
概述用来查看正在运行的Java应用程序的扩展参数,支持在运行时,修改部分参数。命令格式jinfo [ option ] pidjinfo [ option ] executable corejinfo [ option ] [ servier-id ] remote-hostname-or-IPoption : 命令行功能选项pid : 进程idexecutable...
2019-02-18 20:59:36 656
原创 JVM监控工具-jstat详解
概述监控JVM统计信息, 如gc信息, 类加载信息, JIT信息命令格式: jstat [ generalOption | outputOptions vmid [ interval[s|ms] [ count ] ]generalOption : jstat命令选项,如 -help或-optionsoutputOptions : 包含一个statOption的输出选项v...
2019-02-18 19:16:32 1289
原创 JVM监控工具-jps
概述用于查看操作系统上有哪些java进程, 类似于Linux系统下的ps命令, jps也支持查看远程主机上的java进程, 这个用处不大, 本文基于JDK8参数不加任何参数 : 显示进程id,以及main方法所在类名-q : 只显示进程id-m : 显示进程id,main方法所在类名, 以及传递给main方法的参数(如果有的话)-l : 展示类的完整路径或ja...
2019-02-17 15:05:35 618
原创 leetcode337. 打家劫舍 III
题目在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。示例 1:输入: [3,2,...
2019-01-21 09:40:03 831
原创 leetcode213. 打家劫舍 II
题目你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。示例 1:输入: [2,3,2]输出: 3解释: ...
2019-01-21 09:35:50 476
原创 leetcode198. 打家劫舍
题目你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。示例 1:输入: [1,2,3,1]输出: 4解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 ...
2019-01-21 09:31:22 484
原创 JDK8新特性-Optional类
概述JDK8 新增, 主要用于解决 NullPointException异常私有构造方法, 不允许通过new 获得一个Optional实例提供一系列静态工厂方法获得Optional对象value为空的Optional可以认为是一个空的OptionalAPI 简介empty 方法 private static final Optional<?> EMPTY =...
2019-01-13 22:48:19 2573
原创 JDK8新特性-Predicate 接口
概述JDK8 提供的函数式接口提供一个抽象方法test, 接受一个参数, 根据这个参数进行一些判断, 返回判断结果 true / false提供几个默认的default方法, and, or, negate 用于进行组合判断在流中被广泛使用test 方法 /** * 接收一个参数, 判断这个参数是否匹配某种规则, 匹配成功返回true, 匹配失败则返回false ...
2019-01-13 17:15:37 8224
原创 JDK8新特性-Function接口与BiFunction接口
Function 接口JDK8新增的函数式接口接口只有一个抽象方法apply, 接受一个T类型参数, 返回一个R类型参数, T, R表示泛型, 可以相同除了一个抽象的apply方法之外, Function存在两个默认的default方法, compose和andThen, 这两个方法都是用来组合不同的Function的这个函数式接口被大量应用于集合以及Stream(流)中apply ...
2019-01-13 16:02:11 3411 1
原创 leetcode63. 不同路径 II
题目一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?例如,上图是一个7 x 3 的网格。有多少可能的路径?说明:m 和 n 的值均不超过 100。示例 1:输入: m = 3, n = 2输出: 3解释:从左上角开...
2019-01-10 21:53:12 584
原创 leetcode62. 不同路径
题目一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?例如,上图是一个7 x 3 的网格。有多少可能的路径?说明:m 和 n 的值均不超过 100。示例 1:输入: m = 3, n = 2输出: 3解释:从左上角开...
2019-01-10 21:49:40 699
原创 leetcode91. 解码方法
题目一条包含字母 A-Z 的消息通过以下方式进行了编码:'A' -> 1'B' -> 2...'Z' -> 26给定一个只包含数字的非空字符串,请计算解码方法的总数。示例 1:输入: "12"输出: 2解释: 它可以解码为 "AB"(1 2)或者 "L"(12)。示例 2:输入: "226"输出: 3解释: 它可以解码为 "BZ" (2
2019-01-10 21:44:24 833
原创 JDK8新特性-接口默认方法
在JDK8之前, 接口中都只能有抽象方法, 而不能有实现方法, 但是在JDK8之后, 接口中也可以添加非抽象方法了, 在接口中添加非抽象方法, 使用特殊的关键字default进行修饰, 所以实现了该接口的类都可以调用接口的default的方法, 这样可以保证在不改变接口特性的情况下, 对接口增加一些行为, 有需要时可以使用接口的默认方法, 同时又不会影响现有已实现了该接口的方法, 代码示例如下:...
2019-01-10 06:45:13 993
原创 leetcode64. 最小路径和
题目给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。示例:输入:[ [1,3,1], [1,5,1], [4,2,1]]输出: 7解释: 因为路径 1→3→1→1→1 的总和最小。解题记忆化 搜索class Solution { int[][] memo; ...
2019-01-05 16:16:59 421
原创 leetcode120. 三角形最小路径和
题目给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。例如,给定三角形:[ [2], [3,4], [6,5,7], [4,1,8,3]]自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。说明:如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分。解题...
2019-01-03 22:39:57 525
原创 leetcode70. 爬楼梯
题目假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例 1:输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶示例 2:输入: 3输出: 3解释: 有三种方法可以爬到楼顶。1. 1 阶 + 1 阶 + 1 阶2. 1 阶 ...
2019-01-03 22:27:37 624
原创 RabbitMQ-基础组件封装
基础组件封装思路和架构设计方案支持高性能的序列化转换, 异步化发送消息支持消息生产实例与消费实例的链接池化缓存化, 提升性能支持可靠性投递消息, 保障消息100%不丢失支持消费端的幂等操作, 避免消费端重复消费的问题支持迅速消息发送模式, 在一些日志收集/统计分析等需求下可以保证高性能, 高吞吐量支持延迟消息模式, 消息可以延迟发送, 指定延迟时间, 用于某些延迟检查, 服务限流场...
2018-12-31 10:54:00 5423
原创 RabbitMQ集群恢复与故障转移
前提 : A, B两个节点组成一个镜像队列, B是Master节点场景一A先停, B后停解决方案 : 该场景下B是Master, 只要先启动B, 在启动A即可。或者先启动A, 30秒之内启动B即可恢复镜像队列场景二A, B同时停机解决方案 : 只需要在30秒内连续启动A和B即可恢复镜像场景三A先停, B后停, 且A无法恢复解决场景 : 因为B是Master, 所以等B启...
2018-12-31 10:48:22 2135
原创 从零开始搭建高可用RabbitMQ镜像模式集群
RabbitMQ集群模式搭建集群架构图:准备工作准备三台安装了RabbitMQ的节点, 我本地三台虚拟机地址如下 :IPhostname192.168.72.138:5672rabbit138192.168.72.139:5672rabbit139192.168.72.140:5672rabbit140选取任意一个节点作为master节点, 进...
2018-12-31 10:45:52 3560 1
原创 RabbitMQ集群架构模式介绍
主备模式实现RabbitMQ的高可用集群, 一般在并发和数据量不高的情况下, 这种模型简单好用。主备模式也从称之为Warren模式主节点如果挂了, 从节点提供服务远程模式远程模式可以实现双活的一种模式, 简称Shovel模式, 所谓Shovel就是我们可以把消息进行不同数据中心的复制工作, 可以跨地域的让两个MQ集群互联Shovel模式拓扑图:Shovel集群的配...
2018-12-31 10:20:01 2401
原创 SpringBoot整合RabbitMQ
Producer配置publisher-confirms, 实现一个监听器用于监听Broker端给我们返回的确认请求 : RabbitTemplate.ConfirmCallbackpublisher-returns, 保证消息对Broker端是可达的, 如果出现路由键不可达的情况, 则使用监听器对不可达的消息进行后续的处理, 保证消息的路由成功 : RabbitTemplate.Retur...
2018-12-31 10:14:18 1260 1
原创 Spring AMQP整合RabbitMQ
RabbitAdminRabbitAdmin类可以很好的操作RabbitMQ, 在Spring中直接进行注入即可@Beanpublic RabbitAdmin rabbitAdmin(ConnectionFactory ConnectionFactory) { RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory)...
2018-12-31 10:11:45 1727
原创 RabbitMQ高级特性-死信队列(DLX)
死信队列(DLX)Dead-Letter-Exchange利用DLX, 当消息在一个队列中变成死信(dead message)之后, 它能被重新publish到另一个Exchange, 这个Exchange就是DLXDLX也是一个正常的Exchange, 和一般的Exchange没有区别, 它能在任何队列上被指定, 实际上就是设置某个队列的属性为死信队列当这个队列中有死信时, Rabbi...
2018-12-31 10:02:56 4927
原创 RabbitMQ高级特性-TTL队列/消息
TTL队列/消息TTL是Time To Live的缩写, 也就是生存时间RabbitMQ支持消息的过期时间, 在消息发送时可以进行指定RabbitMQ支持队列的过期时间, 从消息入队列开始计算, 只要超过了队列的超时时间配置, 那么消息会自动清除代码演示消费者中设置队列超时时间为10秒, 启动之后关闭消费者生产者发送两条消息, 一条消息不设置超时时间, 一条消息设置5秒后超时启...
2018-12-31 09:59:16 9997 3
原创 leetcode401. 二进制手表
题目二进制手表顶部有 4 个 LED 代表小时(0-11),底部的 6 个 LED 代表分钟(0-59)。每个 LED 代表一个 0 或 1,最低位在右侧。例如,上面的二进制手表读取 “3:25”。给定一个非负整数 n 代表当前 LED 亮着的数量,返回所有可能的时间。案例:输入: n = 1返回: ["1:00", "2:00", "4:00", "8:00", "0:01", ...
2018-12-27 19:11:31 643
原创 leetcode200. 岛屿的个数
题目给定一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。示例 1:输入:11110110101100000000输出: 1示例 2:输入:11000110000010000011输出: 3解题遍历二维数组, 每找到一个1就表示有...
2018-12-27 19:04:34 370
原创 leetcode90. 子集 II
题目给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。示例:输入: [1,2,2]输出:[ [2], [1], [1,2,2], [2,2], [1,2], []]解题递归 + 回溯先排序注意重复元素剔除空集也是一个子集class Solution { List<Lis...
2018-12-27 18:55:05 324
原创 leetcode79. 单词搜索
题目给定一个二维网格和一个单词,找出该单词是否存在于网格中。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。示例:board =[ ['A','B','C','E'], ['S','F','C','S'], ['A','D','E','E']]给定 word = "ABCCED...
2018-12-27 18:52:30 500
原创 leetcode78. 子集
题目给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。示例:输入: nums = [1,2,3]输出:[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], []]解题递归 + 回溯不包含重复元素空集也是一个子集class Solution {...
2018-12-27 18:48:22 405
原创 RabbitMQ高级特性-消费端ACK与重回队列
消费端ACK与重回队列消费端ACK消费端的手工ACK和NACK, ACK是确认成功消费, NACK表示消息处理失败, 会重发消息消费端进行消费的时候, 如果由于业务异常我们可以进行日志的记录, 然后进行补偿如果由于服务器宕机等严重问题, 就需要手工进行ACK保障消费端消费成功重回队列消费端重回队列是为了对没有处理成功的消息, 把消息重新回递给Broker一般在实际应用中, 都会...
2018-12-26 07:02:27 2156 1
原创 RabbitMQ高级特性-消费端限流
消费端限流消息队列中囤积了大量的消息, 或者某些时刻生产的消息远远大于消费者处理能力的时候, 这个时候如果消费者一次取出大量的消息, 但是客户端又无法处理, 就会出现问题, 甚至可能导致服务崩溃, 所以需要对消费端进行限流RabbitMQ提供了一种qos(服务质量保证)功能, 即在非自动确认消息的前提下, 如果一定数目的消息(通过consumer或者channel设置qos的值)未被确...
2018-12-26 06:58:54 3312
原创 RabbitMQ高级特性-消费端自定义监听
消费端自定义监听在之前的代码演示中, consumer进行消费时 ,都是使用while循环进行消息消费, 然后使用consumer.nextDelivery()方法获取下一条消息但是在实际工作中, 使用自定义的Consumer更加的方便, 解耦性也更加的强, 实现自定义的Consumer可以实现Consumer接口, 或者更常用的是继承默认的DefaultConsumer代码演示自定义...
2018-12-26 06:55:31 3102
阿里巴巴Java开发手册
2017-10-23
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人