个人github地址 https://github.com/reedfan/leetcode
私信 关注
茴香豆的茴有六种写法
码龄4年
  • 578,759
    被访问量
  • 136
    原创文章
  • 8,800
    作者排名
  • 121
    粉丝数量
  • 于 2016-09-15 加入CSDN
获得成就
  • 获得94次点赞
  • 内容获得18次评论
  • 获得144次收藏
荣誉勋章
兴趣领域
  • #后端
    #Java
TA的专栏
  • spring cloud
    4篇
  • 设计模式
    10篇
  • java基础
    52篇
  • 多线程与并发编程
    9篇
  • 计算机网络
    7篇
  • 数据库
    23篇
  • spring
    15篇
  • 综合
    6篇
  • springmvc/mybatis
    8篇
  • 大数据
    10篇
  • linux
    3篇
  • 数据结构与算法
    29篇
  • UML
    2篇
  • 一些小工具
    5篇
  • 环境及一些报错问题
    14篇
  • 计算机基础
    4篇
  • 前端
    3篇
  • 分布式中间件
    22篇
  • springboot
    9篇
  • Tomcat/Jmeter
    5篇
  • 最近
  • 文章
  • 资源
  • 问答
  • 课程
  • 帖子
  • 收藏
  • 关注/订阅

微服务注册中心如何承载大型系统的千万级访问?

一、问题起源Spring Cloud微服务架构体系中,Eureka是一个至关重要的组件,它扮演着微服务注册中心的角色,所有的服务注册与服务发现,都是依赖Eureka的。不少初学Spring Cloud的朋友在落地公司生产环境部署时,经常会问:Eureka Server到底要部署几台机器?我们的系统那么多服务,到底会对Eureka Server产生多大的访问压力?Eureka Server能不能抗住一个大型系统的访问压力?如果你也有这些疑问,别着急!咱们这就一起去看看,Eureka作为微服务注册中心的核心原
转载
77阅读
0评论
0点赞
发布博客于 8 月前

Java 8对CAS机制的优化

但是这个CAS有没有问题呢?肯定是有的。比如说大量的线程同时并发修改一个AtomicInteger,可能有很多线程会不停的自旋,进入一个无限重复的循环中。这些线程不停地获取值,然后发起CAS操作,但是发现这个值被别人改过了,于是再次进入下一个循环,获取值,发起CAS操作又失败了,再次进入下一个循环。在大量线程高并发更新AtomicInteger的时候,这种问题可能会比较明显,导致大量线程空循环,自旋转,性能和效率都不是特别好。于是,当当当当,Java 8推出了一个新的类,LongAdder,他就是尝试使用分
转载
128阅读
0评论
0点赞
发布博客于 9 月前

案例实战:每日上亿请求量的电商系统,JVM年轻代垃圾回收参数如何优化?

1、案例背景引入按照惯例,我们接下来会用案例驱动来带着大家分析到底该如何在特定场景下,预估系统的内存使用模型。然后合理优化新生代、老年代、Eden和Survivor各个区域的内存大小。接着再尽量优化参数避免新生代的对象进入老年代,尽量让对象留在新生代里被回收掉。我们这里的背景是电商系统,电商系统其实一般会拆分为很多的子系统独立部署比如商品系统、订单系统、促销系统、库存系统、仓储系统、会员系统,等等我们这里就以比较核心的订单系统作为例子来说明。(提示:食用本案例之前,请务必充分理解专栏之前两周的文章!)我们
转载
168阅读
0评论
0点赞
发布博客于 9 月前

spring事务的传播机制新解

以下是事物的传播机制:@Transactional(propagation=Propagation.REQUIRED)如果有事务, 那么加入事务, 没有的话新建一个(默认情况下)@Transactional(propagation=Propagation.NOT_SUPPORTED)容器不为这个方法开启事务@Transactional(propagation=Propagation.REQUIRES_NEW)不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务@Tr
转载
72阅读
0评论
0点赞
发布博客于 9 月前

RocketMQ专题

1、安装RocketMQ环境要求Linux 64位操作系统64bit JDK 1.8+1.1下载http://rocketmq.apache.org/release_notes/release-notes-4.4.0/1.2 安装RocketMQ解压完以后可以移动到/usr/local/mv rocketmq-all-4.4.0-bin-release /usr/local/rocketmq1.3 启动RocketMQ由于个人阿里云内存不大,编辑bin/runbroker.sh 和
原创
100阅读
0评论
0点赞
发布博客于 9 月前

mysql中tinyint、smallint、int、bigint的区别

tinyint从 -2^7 (-128) 到 2^7 - 1 (123) 的整型数据。存储大小为 1 个字节。unsigned 是从 0 到 255 的整型数据。所以建表的时候 只能是tinyint(3),哪怕你建tinyint(100),他最大还是3位这么多。smallint从 -2^15 (-32,768) 到 2^15 - 1 (32,767) 的整型数据。存储大小为 2 个字节。unsigned 是从 0 到 65535 的整型数据。所以建表的时候 只能是smallint(5),哪怕你
转载
96阅读
0评论
0点赞
发布博客于 9 月前

MySQL全文索引-fulltext

MySQL 5.6 之前的版本只有MyISAM存储引擎支持全文索引,5.6 及之后的版本,InnoDB 才开始支持。全文索引相对于like %这种模糊查询效率更高,查询方式更多样,查询结果也更准确。在全文检索领域,全文索引功能非常有用,比如博客类网站,可以对文章标题,文章内容创建全文索引,用户可以根据关键词搜索想要的文章。1、创建全文索引能够创建全文索引的字段类型必须是char,varchar,text等这类字符文本类型。创建一个带有全文索引的表:CREATE TABLE articles (id
转载
74阅读
0评论
0点赞
发布博客于 9 月前

redis基本数据结构之ZSet

介绍:ZSet数据结构类似于Set结构,只是ZSet结构中,每个元素都会有一个分值,然后所有元素按照分值的大小进行排列,相当于是一个进行了排序的链表。如果ZSet是一个链表,而且内部元素是有序的,在进行元素插入和删除,以及查询的时候,就必须要遍历链表才行,时间复杂度就达到了O(n),这个在以单线程处理的Redis中是不能接受的。所以ZSet采用了一种跳跃表的实现。这个实现有点类似于Kafka存...
转载
118阅读
0评论
0点赞
发布博客于 1 年前

Spring IOC 容器源码分析 - 获取单例 bean

public Object getBean(String name) throws BeansException { // getBean 是一个空壳方法,所有的逻辑都封装在 doGetBean 方法中 return doGetBean(name, null, null, false);}protected <T> T doGetBean( fin...
转载
73阅读
0评论
0点赞
发布博客于 1 年前

ZAB协议

zookeeper依赖zab协议来实现分布式数据一致性.基于该协议,zookeeper实现了一种主备模式的系统架构来保持ZooKeeper为高可用的一致性协调框架,自然的ZooKeeper也有着一致性算法的实现,ZooKeeper使用的是ZAB协议作为数据一致性的算法, ZAB(ZooKeeper Atomic Broadcast ) 全称为:原子消息广播协议;ZAB可以说是在Paxos算法基础上...
转载
431阅读
0评论
0点赞
发布博客于 1 年前

几种限流算法

漏桶算法思路很简单,请求先进入到漏桶里,漏桶以固定的速度出水,也就是处理请求,当水加的过快,则会直接溢出,也就是拒绝请求,可以看出漏桶算法能强行限制数据的传输速率。该算法很好的解决了时间边界处理不够平滑的问题,因为在每次请求进桶前都将执行“漏水”的操作,再无边界问题。但是对于很多场景来说,除了要求能够限制数据的平均传输速率外,还要求允许某种程度的突发传输。这时候漏桶算法可能就不合适了,令牌桶...
转载
83阅读
0评论
0点赞
发布博客于 1 年前

分布式事务中间件Seata的设计原理

分布式事务解决的方案有哪些?目前分布式事务解决的方案主要有对业务无入侵和有入侵的方案,无入侵方案主要有基于数据库 XA 协议的两段式提交(2PC)方案,它的优点是对业务代码无入侵,但是它的缺点也是很明显:必须要求数据库对 XA 协议的支持,且由于 XA 协议自身的特点,它会造成事务资源长时间得不到释放,锁定周期长,而且在应用层上面无法干预,因此它性能很差,它的存在相当于七伤拳那样“伤人七分,损己...
转载
79阅读
0评论
0点赞
发布博客于 1 年前

Kafka的零拷贝技术

kafka中的消费者在读取服务端的数据时,需要将服务端的磁盘文件通过网络发送到消费者进程,网络发送需要经过几种网络节点。如下图所示:传统的读取文件数据并发送到网络的步骤如下:(1)操作系统将数据从磁盘文件中读取到内核空间的页面缓存;(2)应用程序将数据从内核空间读入用户空间缓冲区;(3)应用程序将读到数据写回内核空间并放入socket缓冲区;(4)操作系统将数据从socket缓冲区复制到...
转载
91阅读
0评论
0点赞
发布博客于 1 年前

脑裂是什么?Zookeeper是如何解决的?

什么是脑裂脑裂(split-brain)就是“大脑分裂”,也就是本来一个“大脑”被拆分了两个或多个“大脑”,我们都知道,如果一个人有多个大脑,并且相互独立的话,那么会导致人体“手舞足蹈”,“不听使唤”。脑裂通常会出现在集群环境中,比如ElasticSearch、Zookeeper集群,而这些集群环境有一个统一的特点,就是它们有一个大脑,比如ElasticSearch集群中有Master节点,Z...
转载
82阅读
0评论
0点赞
发布博客于 1 年前

SpringBoot项目如何改成https协议

keytool -genkeypair -alias "test2" -keyalg "RSA" -keystore "test.keystore"输入密钥库口令: 再次输入新口令: 您的名字与姓氏是什么? [Unknown]: fan您的组织单位名称是什么? [Unknown]: guosheng您的组织名称是什么? [Unknown]: guosheng您所在的...
原创
861阅读
0评论
0点赞
发布博客于 1 年前

Redis之事务实现

Redis中的事务提供了一种将多个命令请求打包,然后一次性、顺序性执行多个命令的机制,并且在事务指向期间,服务器不会中断事务而改去执行其他客户端的命令请求,它会将事务中的所有命令都执行完毕,然后才去处理其他客户端的请求。Redis通过MULTI,EXEC,WATCH等命令来实现事务功能。事务首先以一个MULTI命令开始,然后将多个命令放入事务中,最后由EXEC命令将这个事务提交给服务器执行:...
转载
83阅读
0评论
0点赞
发布博客于 2 年前

用注解过滤序列化字段

有时候我们在打日志的时候,希望对象中有些字段不显示出来,此时可以考虑自定义一个注解。比如,自定义一个注解GsonIgnoreField如下@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface GsonIgnoreField {}然后定义一个GsonUtil类public clas...
原创
183阅读
0评论
0点赞
发布博客于 2 年前

Raft 协议

分布式一致性协议 Raft,自 2013 年论文发表之后就受到了技术领域的热捧,我认为相对于其他分布式一致性算法,Raft 有效的解决了分布式一致性算法过于复杂及难于实现的问题,这也是 Raft 能异军突起的主要因素。Raft 协议有效的借鉴了美国总统大选的策略,采用精英(Raft 称呼这个精英为 Leader)领导全局的方案,整个集群中只有 Leader 可以处理 client 发送过来的请...
转载
63阅读
0评论
0点赞
发布博客于 2 年前

vue学习(一)

MVVMmodel: 模型,数据对象(data)view: 试图,模板页面viewModel: 试图模型(vue的实例)写一个简单的vue引入Vue.js创建Vue对象el : 指定根element(选择器)data : 初始化数据(页面可以访问)双向数据绑定 : v-model显示数据 : {{xxx}}<div id="test"> <input...
原创
50阅读
0评论
0点赞
发布博客于 2 年前

Redis 线程模型

文件事件处理器(file event handler) Redis 基于 Reactor 模式开发了自己的网络事件处理器: 这个处理器被称为文件事件处理器(file event handler) 文件事件处理器使用 I/O 多路复用(multiplexing)程序来同时监听多个套接字, 并根据套接字目前执行的任务来为套接字关联不同的事件处理器。 当被监听的套接字准...
转载
57阅读
0评论
0点赞
发布博客于 2 年前

彻底搞清楚分布式数据库

首先,“分布式”:是从业务的角度的概念。"分布式”是从业务角度出发的:即当我们想着“注册”模块需要更新或者出问题了,那么我们不希望它影响存量用户的“登陆”和“下单”模块,这个时候,我们多希望他们不在一起多好,那么当我们真的这么做了,将各个业务模块都分开,ok,那这就是“分布式”了。从数据库的发展历程来看,像什么数据库冷备热备、主从、双活、多活、集群等等,都与“分布式”不相关,与业务不相关,都...
原创
265阅读
0评论
0点赞
发布博客于 2 年前

旋转链表

61. 旋转链表public ListNode rotateRight(ListNode head, int k) { if (head == null || k == 0) { return head; } ListNode tmp = head; int len = 0; while (t...
原创
201阅读
0评论
0点赞
发布博客于 2 年前

字符串类

leetcode方法一:将字符串按字符排序好作为keypublic List<List<String>> groupAnagrams(String[] strs) { if (strs == null || strs.length == 0) { return new ArrayList<>(); }...
原创
341阅读
0评论
0点赞
发布博客于 2 年前

递归回溯中的一些套路

从一个题说起leetcode 39. 组合总和class Solution { public List<List<Integer>> combinationSum(int[] candidates, int target) { }}首先题目要求返回的类型为List<List<Integer>>,那么我们...
原创
490阅读
0评论
1点赞
发布博客于 2 年前

数组问题之二分查找专题

leetcode 33. 搜索旋转排序数组假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。你可以假设数组中不存在重复的元素。你的算法时间复杂度必须是 O(log n) 级别。示例 1: 输入: nu...
原创
1093阅读
0评论
2点赞
发布博客于 2 年前

树的递归专题

leetcode 543. 二叉树的直径给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过根结点。示例 :给定二叉树 1 / \ 2 3 / \ 4 5 返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1...
原创
568阅读
0评论
1点赞
发布博客于 2 年前

链表快慢指针

leetcode 19. 删除链表的倒数第N个节点public ListNode removeNthFromEnd(ListNode head, int n) { ListNode res = new ListNode(-1); res.next = head; ListNode fast = res; ListNode slo...
原创
483阅读
0评论
0点赞
发布博客于 2 年前

动态规划之矩阵路径类

leetcode 62. 不同路径一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?示例 1:输入: m = 3, n = 2 输出: 3解释:从左上角开始,总共有 3 条路径可以到达右下角。1. 向右 -> ...
原创
472阅读
0评论
1点赞
发布博客于 2 年前

斐波那锲数问题

leetcode 70 爬楼梯假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例 1:输入: 2 输出: 2解释: 有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶示例 2: 输入: 3 输出: 3解释: 有三种方法可以爬到楼顶。1. 1 阶 + 1 阶...
原创
647阅读
1评论
1点赞
发布博客于 2 年前

01背包类算法题

关于背包问题的概念可以参考此处leetcode 416. 分割等和子集给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。示例 1: 输入: [1, 5, 11, 5],输出: true解释: 数组可以分割成 [1, 5, 5] 和 [11].示例 2:输入: [1, 2, 3, 5],输出: false其实可以看成是一个01背包问题...
原创
1095阅读
0评论
3点赞
发布博客于 2 年前

深入理解mysql四种隔离级别及底层实现原理(MVCC和锁)

1) 锁的分类Shared Locks(共享锁/S锁)若事务T对数据对象A加上S锁,则事务T只能读A;其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这就保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。Exclusive Locks(排它锁/X锁)若事务T对数据对象A加上X锁,则只允许T读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T释放A...
转载
1502阅读
1评论
2点赞
发布博客于 2 年前

深入理解MySQL的四种隔离级别及加锁实现原理

一、首先什么是事务?事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。事务的结束有两种,当事务中的所有步骤全部成功执行时,事务提交。如果其中一个步骤失败,将发生回滚操作,撤消事务开始时的所有操作。二、事务的ACID事务具有四个特征:原子性( Atomicity...
转载
1783阅读
2评论
0点赞
发布博客于 2 年前

轻松理解MYSQL MVCC 实现机制

1. MVCC简介1.1 什么是MVCCMVCC是一种多版本并发控制机制。1.2 MVCC是为了解决什么问题? 大多数的MYSQL事务型存储引擎,如,InnoDB,Falcon以及PBXT都不使用一种简单的行锁机制.事实上,他们都和MVCC–多版本并发控制来一起使用. 大家都应该知道,锁机制可以控制并发操作,但是其系统开销较大,而MVCC可以在大多数情况下代替行级锁,使用...
转载
681阅读
0评论
0点赞
发布博客于 2 年前

Java开发必须掌握的线上问题排查命令

作为一个合格的开发人员,不仅要能写得一手还代码,还有一项很重要的技能就是排查问题。这里提到的排查问题不仅仅是在coding的过程中debug等,还包括的就是线上问题的排查。由于在生产环境中,一般没办法debug(其实有些问题,debug也白扯。。。),所以我们需要借助一些常用命令来查看运行时的具体情况,这些运行时信息包括但不限于运行日志、异常堆栈、堆使用情况、GC情况、JVM参数情况、线程情...
转载
192阅读
0评论
0点赞
发布博客于 2 年前

jvm 性能调优工具之 jmap

概述命令jmap是一个多功能的命令。它可以生成 java 程序的 dump 文件, 也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及 finalizer 队列。jmap 用法参数:option: 选项参数。 pid: 需要打印配置信息的进程ID。 executable: 产生核心dump的Java可执行文件。 core: 需要打印配置信息的核心文...
转载
185阅读
0评论
0点赞
发布博客于 2 年前

栈的应用

leetcode 20. 有效的括号public boolean isValid(String s) { if(s.length() < 1){ return true; } if(s.length()%2!=0){ return false; } Map&l...
原创
1093阅读
0评论
2点赞
发布博客于 2 年前

回文问题

leetcode 9. 回文数判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。示例 1: 输入: 121 输出: true示例 2: 输入: -121 输出: false 解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。对于数字的末位,直接取余就可以了,对于数字的首位,我们可以这么算。首先...
原创
1028阅读
0评论
0点赞
发布博客于 2 年前

链表相关

leetcode 2. 两数相加给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输...
原创
402阅读
0评论
1点赞
发布博客于 2 年前

滑动窗口问题

leetcode 3. 无重复字符的最长子串给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1: 输入: "abcabcbb" 输出: 3解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2: 输入: "bbbbb" 输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3: 输入: "pwwkew"...
原创
1247阅读
0评论
1点赞
发布博客于 2 年前

static关键字主要有两种作用:

static关键字主要有两种作用:第一,为特定数据类型或对象分配单一的存贮空间,而与创建对象的个数无关。第二,希望某个方法或属性与类而不是对象关联在一起,也就是说,在不创建对象的情况下就可以通过类来直接调用方法或使用类的属性。具体而言,static在java中主要有四种使用情况:成员变量、成员方法、代码块及内部类。(1)static成员变量虽然java语言中没有全局的概念,但可以通过s...
转载
929阅读
0评论
0点赞
发布博客于 2 年前

mitmproxy安装

1.下载mitmproxywget https://snapshots.mitmproxy.org/4.0.4/mitmproxy-4.0.4-linux.tar.gz./mitmweb -p 9000 --web-iface=0.0.0.0 --web-port 9001 --insecure -b 127.0.0.1tmp目录下没有创建remount的权限运行命令sud...
原创
976阅读
0评论
0点赞
发布博客于 2 年前

netty

Netty简介Netty是 一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。JDK原生NIO程序的问题JDK原生也有一套网络应用程序API,但是存在一系列问题,主要如下: NIO的类库和API繁杂,使用麻烦,你需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等 需要具...
转载
1015阅读
0评论
0点赞
发布博客于 2 年前

如何查看服务器配置的远程debug端口

因为远程服务配置启动脚本一般需要加上如下指令:JAVA_OPTS="$JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000"如果是启动jar包,指令:java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,a...
原创
1744阅读
0评论
0点赞
发布博客于 2 年前

01背包与完全背包问题

1.递归解法public static int knapsack(int capacity, int[] weights, int[] values) { int n = weights.length; //递归的套路,加一个index索引,控制递归到了哪一层 return bestValue(capacity,n-1,weights,valu...
原创
6040阅读
0评论
5点赞
发布博客于 2 年前

Java并发之AQS详解

转载!原文链接:https://www.cnblogs.com/waterystone/p/4920797.html 原作者:水岩一、概述  谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)!  类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步...
转载
1279阅读
0评论
1点赞
发布博客于 2 年前

搜索

给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。示例 1:输入:11110110101100000000输出: 1示例 2:输入:11000110000010000011输出: 3链接:https://leetcode-cn....
原创
1292阅读
0评论
1点赞
发布博客于 2 年前

Java中的Switch对整型、字符型、字符串型的具体实现细节

Java 7中,switch的参数可以是String类型了,这对我们来说是一个很方便的改进。到目前为止switch支持这样几种数据类型:byte short int char String 。但是,作为一个程序员我们不仅要知道他有多么好用,还要知道它是如何实现的,witch对整型的支持是怎么实现的呢?对字符型是怎么实现的呢?String类型呢?有一点Java开发经验的人这个时候都会猜测switch...
转载
1374阅读
0评论
0点赞
发布博客于 2 年前

Java Web应用的代码分层最佳实践。

代码分层,对于任何一个Java Web开发来说应该都不陌生。一个好的层次划分不仅可以能使代码结构更加清楚,还可以使项目分工更加明确,可读性大大提升,更加有利于后期的维护和升级。从另外一个角度来看,好的代码分层架构,应该是可以很好的匹配上单一职责原则的。这样就可以降低层与层之间的依赖,还能最大程度的复用各层的逻辑。本文就来介绍下Java Web项目的代码到底应该如何分层。三层架构在软件体...
转载
1423阅读
0评论
1点赞
发布博客于 2 年前

《Effective Java》中关于异常处理的几条建议

概要本章是从《Effective Java》摘录整理出来的关于异常处理的几条建议。内容包括:第1条: 只针对不正常的情况才使用异常第2条: 对于可恢复的条件使用被检查的异常,对于程序错误使用运行时异常第3条: 避免不必要的使用被检查的异常第4条: 尽量使用标准的异常第5条: 抛出的异常要适合于相应的抽象第6条: 每个方法抛出的异常都要有文档第7条: 在细节消息中包含失败 -- 捕获消息第8条:...
转载
1359阅读
0评论
1点赞
发布博客于 2 年前

【Linux】服务器响应变慢的排查步骤

第一步:登录后台服务器/监控平台,查看系统资源是否达到上限,例如:CPU、内存、磁盘、I/O、网络带宽等,如果是这些问题,先将这些问题逐一解决: 如果是CPU的问题,则需要查看一下CPU占比比较高的进程,然后使用jstack命令生成进程的堆栈信息,看是否发生频繁Full GC,如果是的话,还需要看一下内存快照,分析一下内存情况(可以使用java自带的或第三方工具);如果是磁盘空间满了...
原创
1374阅读
0评论
0点赞
发布博客于 2 年前

数学类

不均匀硬币等概率问题一 利用不均匀硬币产生等概率问题描述:有一枚不均匀的硬币,抛出此硬币后,可用foo()表示其结果。已知foo()能返回0和1两个值,其概率分别为0.6和0.4。问怎么利用foo()得到另一个函数,使得返回0和1的概率均为0.5。问题分析:分析连续抛出两次硬币的情况,正反面的出现有四种情况,概率依次为:(1) 两次均为正面:0.6*0.6=0.36(2)第一...
原创
1482阅读
0评论
1点赞
发布博客于 2 年前

Serializable接口与Externalizable接口区别

被Serializable接口声明的类的对象的内容都将被序列化,如果现在用户希望自己指定序列化的内容,则可以让一个类实现Externalizable接口,此接口定义如下:public interface Externalizable extends Serializable { public void writeExternal(ObjectOutput out) throws I...
转载
1517阅读
0评论
1点赞
发布博客于 2 年前

一个页面从输入URL到页面加载显示完成,这个过程都发生什么?

一般会经历以下几个过程:1、首先,在浏览器地址栏中输入url2、浏览器先查看浏览器缓存-系统缓存-路由器缓存,如果缓存中有,会直接在屏幕中显示页面内容。若没有,则跳到第三步操作。3、在发送http请求前,需要域名解析(DNS解析),解析获取相应的IP地址。4、浏览器向服务器发起tcp连接,与浏览器建立tcp三次握手。5、握手成功后,浏览器向服务器发送http请求,请求数据包。...
转载
1545阅读
0评论
1点赞
发布博客于 2 年前

双指针

leetcode209】长度最小的子数组public class MinSubArrayLen { public int minSubArrayLen(int s, int[] nums) { if (nums == null || nums.length == 0) { return 0; } int minl...
原创
2287阅读
0评论
2点赞
发布博客于 2 年前

小笑话

老公心情不好,一个劲的喝闷酒,老婆问:你在干嘛?老公说:别跟我说话,我想静静!老婆转过身就一个大嘴巴子。问:他妈的静静是谁?人生有时候想静一静都难。第二天,老公回到家,又不说话,老婆问他怎么回事,他说没事,老婆转身又一个大嘴巴,你tmd是不是又想静静了!第三天,老公回到家还是不说话,老婆问他什么事,他说:“我真的没想静静。”老婆回身又一个大嘴巴,“你没事儿又提静静干嘛?真的,人生有时...
转载
62阅读
0评论
1点赞
发布博客于 2 年前

贪心算法

LeetCode455. 分发饼干-------------------------leetcode 45. 跳跃游戏 IIpublic int jump(int[] nums) { int cnt = 0; if (nums == null || nums.length == 0) { return cnt; ...
原创
641阅读
0评论
1点赞
发布博客于 2 年前

Java并行任务框架Fork/Join

Fork/Join是什么?Fork意思是分叉,Join为合并。Fork/Join是一个将任务分割并行运行,然后将最终结果合并成为大任务的结果的框架,父任务可以分割成若干个子任务,子任务可以继续分割,提供我们一种方便的并行任务功能,满足实际场景的业务需求,思想类似于MapReduce。任务的分割必须保证子任务独立,不会相互依赖结果。从哪里开始?Fork/Join框架主要有...
转载
1726阅读
0评论
0点赞
发布博客于 2 年前

SpringBoot整合Kafka

springboot整合kafka
转载
549阅读
0评论
0点赞
发布博客于 2 年前

threadlocal原理及常用应用场景

threadlocal原理及常用应用场景
转载
1752阅读
0评论
0点赞
发布博客于 2 年前

理解OAuth 2.0

理解OAuth 2.0关于 refrentoken和accesstoken, 当用户登录时返回accesstoken和refreshtoken.当access_token失效时,APP使用refresh_token来请求刷新token。如果refresh_token过期,需要用户重新登录,。也就是说,用户每一次登陆的时候refresh_token都会重新更改,问题: refr...
转载
668阅读
0评论
0点赞
发布博客于 2 年前

Java并发编程-阻塞队列(BlockingQueue)的实现原理

原文地址
转载
688阅读
0评论
0点赞
发布博客于 2 年前

线程池实现的原理

线程池的优点是可总结为以下三点:线程复用 控制最大并发数 管理线程1.线程复用过程理解线程复用原理首先应了解线程生命周期。在线程的生命周期中,它要经过新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)5种状态。Thread通过new来新建一个线程,这个过程是是初始化一些线程信息,如线程名,id,线程所属group等,...
转载
3285阅读
0评论
1点赞
发布博客于 2 年前

多次start一个线程会怎么样

答案是:java.lang.IllegalThreadStateException源码如下/** * Causes this thread to begin execution; the Java Virtual Machine * calls the <code>run</code> method of this thread. ...
原创
3548阅读
0评论
0点赞
发布博客于 2 年前

如何处理redis集群中的hot Key

一般对于单实例的redis或者一主一备的redis来说,不需要考虑hot key的问题。但是随着业务量的上升,redis集群也自然而然的会成为一个选择。hot key的概念当使用redis集群来作为缓存的时候,如果在业务上碰到大促,或者正好有一个非常热的帖子的时候,对应的缓存会被频繁访问。而这个缓存会落在redis集群的同一台集群上,导致数据频繁的访问同一台机器,造成集群性能的不均衡。这个就...
原创
3180阅读
0评论
1点赞
发布博客于 2 年前

反射中Class.forName()和ClassLoader.loadClass()的区别

一 Java类装载过程装载:通过累的全限定名获取二进制字节流,将二进制字节流转换成方法区中的运行时数据结构,在内存中生成Java.lang.class对象;链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;校验:检查导入类或接口的二进制数据的正确性;(文件格式验证,元数据验证,字节码验证,符号引用验证)准备:给类的静态变量分配并初始化存储空间;解析:将常量池中...
转载
3188阅读
0评论
0点赞
发布博客于 2 年前

JVM 1.8 永久代---元空间 的变动

JDK8 HotSpot JVM 将移除永久区,使用本地内存来存储类元数据信息并称之为:元空间(Metaspace)以下是JVM内存模型中方法区的变动1.新生代:Eden+From Survivor+To Survivor2.老年代:OldGen3.永久代(方法区的实现) : PermGen----->替换为Metaspace(本地内存中)方法区和“PermGe...
转载
3162阅读
0评论
0点赞
发布博客于 2 年前

Java -- 偏向锁、轻量级锁、自旋锁、重量级锁

理解锁的基础知识如果想要透彻的理解Java锁的来龙去脉,需要先了解以下基础知识。基础知识之一:锁的类型锁从宏观上分类,分为悲观锁与乐观锁。乐观锁乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,采取在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,...
转载
3186阅读
0评论
0点赞
发布博客于 2 年前

分布式事物的几种解决方案

分布式事务之两阶段提交协议(2PC)两阶段提交协议(Two-phase Commit,2PC)经常被用来实现分布式事务。一般分为协调器C和若干事务执行者Si两种角色,这里的事务执行者就是具体的数据库,协调器可以和事务执行器在一台机器上。我们的应用程序(client)发起一个开始请求到TC; TC先将<prepare>消息写到本地日志,之后向所有的Si发起<prepa...
转载
3191阅读
0评论
0点赞
发布博客于 2 年前

spring boot容器启动详解

一、容器启动spring boot一般是指定容器启动main方法,然后以命令行方式启动Jar包,如下图:@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.cla...
转载
3211阅读
1评论
1点赞
发布博客于 2 年前

Spring Boot @EnableAutoConfiguration解析

讲原理前先说下使用姿势。在project A中定义一个bean。package com.reed;import org.springframework.stereotype.Service;@Servicepublic class Dog {}并在该project的resources/META-INF/下创建一个叫spring.factories的文件,该文件内容如下...
转载
3207阅读
0评论
0点赞
发布博客于 2 年前

内存泄露排查工具MAT的使用

MAT下载链接在程序运行时加上+HeapDumpOnOutOfMemoryError在OOM时会导出堆信息到hprof文件。本次测试用的代码如下public class Test02 { byte[] bytes = new byte[1*1024*1024]; public static void main(String[] args) { List...
原创
3209阅读
0评论
0点赞
发布博客于 2 年前

(MemoryAnalyzer)MAT.txt

内存泄露分心工具MemoryAnalyzer 内存泄露分心工具MAT 亲测好用
txt
发布资源于 2 年前

select、poll、epoll之间的区别

(1)select==>时间复杂度O(n)它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。所以select具有O(n)的无差别轮询复杂度,同时处理的流越多,无差别轮询时间就越长。(2)poll==>时间复杂度O(n)poll本质上和select没有区别,它将用...
转载
3184阅读
0评论
0点赞
发布博客于 2 年前

CMS收集器和G1收集器的区别

对于CMS收集器和G1收集器的不同,目前简单写了一下4点,有不足的地方后面再不断的更新修改。CMS收集器和G1收集器的区别区别一: 使用范围不一样 CMS收集器是老年代的收集器,可以配合新生代的Serial和ParNew收集器一起使用 G1收集器收集范围是老年代和新生代。不需要结合其他收集器使用区别二: STW的时间CMS收集器以最小的停顿时间为目标的收集器。...
转载
3214阅读
0评论
0点赞
发布博客于 2 年前

深入理解wait/notify/notifyAll的作用

notify: 唤醒在监视器对象上等待的单个线程,此时调用该方法的代码继续执行。notifyAll: 唤醒在监视器对象上等待的所有线程,此时调用该方法的代码继续执行。第一、为什么会有wait/notify/notifyAll这几个方法?(1) wait/notify/notifyAll是为了避免轮询(尝试执行)带来的性能损失,这句话是什么意思?看下面的讲解:为了说清道理,我们用“图书馆借书...
转载
3287阅读
0评论
0点赞
发布博客于 2 年前

阻塞和非阻塞,同步和异步

故事:老王烧开水。出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。老王想了想,有好几种等待方式1.老王用水壶煮水,并且站在那里,不管水开没开,每隔一定时间看看水开了没。-同步阻塞老王想了想,这种方法不够聪明。2.老王还是用水壶煮水,不再傻傻的站在那里看水开,跑去寝室上网,但是还是会每隔一段时间过来看看水开了没有,水没有开就走人。-同步非阻塞老王想了想...
转载
3204阅读
0评论
1点赞
发布博客于 2 年前

HTTP与TCP的区别和联系

相信不少初学应用网络程序开发的朋友都想知道Http与Socket连接究竟有什么区别,希望通过自己的浅显理解能对初学者有所帮助。一、基本概念1、TCP连接 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接。TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上。 建立起一个TCP连接需要经过“三次握...
转载
3213阅读
0评论
1点赞
发布博客于 2 年前

leetcode 剑指offer刷题归类之 六 位运算专题

常用的位运算技巧如下[LeetCode-191] Number of 1 Bits(判断一个整数中有多少个1)Write a function that takes an unsigned integer and returns the number of ’1’ bits it has (also known as the Hamming weight).For example...
原创
3223阅读
0评论
1点赞
发布博客于 2 年前

定时任务 quartz

Quartz有四个核心接口Job、JobDetail、Trigger和Scheduler。Trigger主要有CronTrigger(表达式触发)和SimpleTrigger(简单触发)两个接口,表达式触发的功能更强大,在开发时使用比较广泛,Job是一个实现org.quartz.Job接口的java类。将需要完成的任务写在execute()方法中。一个job可以有多个trigger,一个trigg...
原创
3183阅读
0评论
0点赞
发布博客于 2 年前

Git恢复之前版本的两种方法reset、revert(图文详解)

Git恢复之前版本的两种方法reset、revert(图文详解)
转载
3186阅读
0评论
0点赞
发布博客于 2 年前

守护线程和用户线程的区别

如果JVM中所有的线程都是守护线程,那么JVM就会退出,进而守护线程也会退出。如果JVM中还存在用户线程,那么JVM就会一直存活,不会退出。由此可以得到:守护线程是依赖于用户线程,用户线程退出了,守护线程也就会退出,典型的守护线程如垃圾回收线程。用户线程是独立存在的,不会因为其他用户线程退出而退出。默认情况下启动的线程是用户线程,通过setDaemon(true)将线程设置成守...
转载
3185阅读
0评论
0点赞
发布博客于 2 年前

策略模式

写代码时总会出很多的if…else,或者case。如果在一个条件语句中又包含了多个条件语句就会使得代码变得臃肿,维护的成本也会加大,而策略模式就能较好的解决这个问题,本篇博客就带你详细了解策略模式。策略模式的定义和使用场景定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换,让算法独立于使用它的客户而独立变化。分析下定义,策略模式定义和封装了一系列的算法,...
原创
3211阅读
0评论
1点赞
发布博客于 2 年前

GC调优相关

1.如何理解Latency和Throughput: 吞吐量和延迟 延迟一般包括单向延迟(One-way Latency)和往返延迟(Round Trip Latency),实际测量时一般取往返延迟。它的单位一般是ms、s、min、h等。 而吞吐量一般指相当一段时间内测量出来的系统单位时间处理的任务数或事务数(TPS)。注意“相当一段时间”,不是几秒,而可能是十几分钟、...
原创
3197阅读
0评论
0点赞
发布博客于 2 年前

spring监听器的使用

在实际项目中,我们往往需要自定义一些事件和监听器来满足业务场景,比如在微服务中会有这样的场景:微服务 A 在处理完某个逻辑之后,需要通知微服务 B 去处理另一个逻辑,或者微服务 A 处理完某个逻辑之后,需要将数据同步到微服务 B。这种场景非常普遍,这时我们可以自定义事件以及监听器来监听,一旦监听到微服务 A 中的某事件发生,就去通知微服务 B 处理对应的逻辑。1 自定义事件自...
原创
3511阅读
0评论
0点赞
发布博客于 2 年前

Caffeine Cache

1. 前言互联网软件神速发展,用户的体验度是判断一个软件好坏的重要原因,所以缓存就是必不可少的一个神器。在多线程高并发场景中往往是离不开cache的,需要根据不同的应用场景来需要选择不同的cache,比如分布式缓存如redis、memcached,还有本地(进程内)缓存如ehcache、GuavaCache、Caffeine。说起Guava Cache,很多人都不会陌生,它是Google ...
转载
3234阅读
0评论
0点赞
发布博客于 2 年前

强引用,软引用,弱引用

一、软引用和弱引用的用法软引用(SoftReference)的含义是,如果一个对象只具有软引用,而当前虚拟机堆内存空间足够,那么垃圾回收器就不会回收它,反之就会回收这些软引用指向的对象。弱引用(WeakReference)与软引用的区别在于,垃圾回收器一旦发现某块内存上只有弱引用(一定请注意只有弱引用,没强引用),不管当前内存空间是否足够,那么都会回收这块内存。见如下实例 pub...
原创
3208阅读
0评论
0点赞
发布博客于 2 年前

CPU密集型和IO密集型

CPU密集型(CPU-bound)CPU密集型也叫计算密集型,指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU Loading很高。在多重程序系统中,大部份时间用来做计算、逻辑判断等CPU动作的程序称之CPU bound。例如一个计...
转载
3192阅读
0评论
0点赞
发布博客于 2 年前

性能优化

性能优化就是发挥机器本来的性能。性能的几个维度1.cputop命令2.IOiostat命令3.memoryfree命令4.networknicstat
原创
3219阅读
0评论
0点赞
发布博客于 2 年前

注解(Annotation)入门

1.@Target,作用:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)  取值(ElementType)有:    1.CONSTRUCTOR:用于描述构造器    2.FIELD:用于描述域    3.LOCAL_VARIABLE:用于描述局部变量    4.METHOD:用于描述方法    5.PACKAGE:用于描述包    6.PARAMETER:用于描述参...
原创
3456阅读
0评论
0点赞
发布博客于 2 年前

数据库分库分表

一 为什么要分库分表1.单表数据量过大,会极大的影响sql的执行性能2.磁盘容量有限3.单表无法承受高并发。一般一个库最多支撑并发量2000(并发量为1000的时候就要考虑扩容)二 常见的分库分表中间件sharding-jdbc:当当开源的,属于client层方案。确实之前用的还比较多一些,因为SQL语法支持也比较多,没有太多限制,而且目前推出到了2.0版本,支持分库分表...
原创
3255阅读
0评论
0点赞
发布博客于 2 年前

netty源码深入剖析.txt

netty源码深入剖析,深入源码,从入门到调优
txt
发布资源于 2 年前

jvm、tomcat、mysql调优.txt

1 什么是性能优化\ 2 性能测试与优化\ 3 性能优化JVM篇\ 4 性能优化Tomcat篇\ 5 性能优化mysql篇\
txt
发布资源于 2 年前

leetcode 剑指offer刷题归类之 五 大数据专题

1.布隆过滤器
原创
3371阅读
0评论
0点赞
发布博客于 2 年前

shell入门

一直没系统学习过shell脚本。今天正好要修改项目中的shell脚本。将学到的一点东西记录下来。#!/bin/bash #! 标示这是一个可以执行的脚本(最好写上),/bin/bash 标示这个脚本是用该解释器来进行的解释。# this is test 以 # 开头的一般是注释。# 读取文件第一行,并赋值给dd=$(head -n +1 test.txt)# 读取文件第一行...
原创
3270阅读
0评论
0点赞
发布博客于 2 年前

postman专题

postman这个产品不能自动保存。因此使用的时候一定要及时保存及时保存及时保存。postman环境变量保存方法如下
原创
3277阅读
0评论
0点赞
发布博客于 2 年前

leetcode 剑指offer刷题归类之 四 经典算法题

目录约瑟夫环问题寻找第k小的数2sum 3sum问题数组中超过一半或者超过1/3的数约瑟夫环问题/** * https://blog.csdn.net/weixin_38214171/article/details/80352921 */public class JosephCircle { public static...
原创
3300阅读
0评论
0点赞
发布博客于 2 年前

算法面试通关手写代码40讲 .txt

57.理论讲解:布隆过滤器.mp4 56.面试题:设计和实现一个LRU Cache缓存机制.mp4 55.理论讲解: LRU Cache.mp4 54.面试题:岛屿的个数&朋友圈(下).mp4 53.面试题:岛屿的个数&朋友圈(上).mp4 52.理论讲解:并查集.mp4 51.面试题:编辑距离.mp4 50.面试题:零钱兑换.mp4 49.面试题:最长上升子序列.mp4 48.面试题:股票买卖系列.mp4 47.面试题:乘积最大子序列.mp4 46.面试题:三角形的最小路径和.mp4 45.面试题:爬楼梯.mp4 44.理论理解:动态规划(下).mp4 43.理论理解:动态规划(上).mp4 42.面试题:N皇后问题的另一种解法.mp4 41 .面试题:2的幂次方问题&比特位计数问题.mp4 40.面试题:统计位1的个数.mp4 39.理论讲解:位运算.mp4 38.面试题:二维网格中的单词搜索问题.mp4 37.面试题:实现一个字典树.mp4 36.理论讲解:字典树.mp4 35.面试题:实现一个求解平方根的函数.mp4 34.理论讲解:二分查找.mp4 33.面试题:数独问题.mp4 32.面试题:N皇后问题.mp4 31.理论讲解:剪枝.mp4 30.面试题:生成有效括号组合.mp4 29.面试题:二叉树的最大和最小深度.mp4 28.面试题:二叉树层次遍历.mp4 27.理论讲解:深度优先搜索.mp4 26.理论讲解:广度优先搜索.mp4 25.面试题:买卖股票的最佳时机.mp4 24.理论讲解:贪心算法.mp4 23.面试题:求众数.mp4 22.面试题:Pow(x,n).mp4 21.理论讲解:递归&分治.mp4 20.理论讲解:二叉树遍历.mp4 19.面试题:二叉树&二叉搜索树的最近公共祖先.mp4
txt
发布资源于 2 年前

springboot深入四

BeanNameAware,BeanFactoryAware, ApplicationContextAware对于应用程序来说,应该尽量减少对Sping Api的耦合程度,然而有些时候为了运用Spring所提供的一些功能,有必要让Bean了解Spring容器对其进行管理的细节信息,如让Bean知道在容器中是以那个名称被管理的,或者让Bean知道BeanFactory或者Applicati...
原创
3235阅读
0评论
0点赞
发布博客于 2 年前

Gson @JsonAdapter实现对json指定属性进行加密

在项目开发中,对于一些敏感属性,可能需要进行加密处理。比如下面的对象中的name若需要加密。可在name上加上@JsonAdapter注解。/** * JsonAdapter * 用来自定义序列化 和 反序列化 * * 这种形式比较单一 , * 序列化 : 放置在 该类的属性上 * 反序列化时: 实现 JsonDeserializer<该类名> * ...
原创
834阅读
0评论
0点赞
发布博客于 2 年前

springBoot深入三

AOP:【动态代理】指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式; 1、定义一个业务逻辑类(MathCalculator);在业务逻辑运行的时候将日志进行打印(方法之前、方法运行结束、方法出现异常,xxx) 2、定义一个日志切面类(LogAspects):切面类里面的方法需要动态感知MathCalculator.div运行到哪里然后执行;...
原创
3245阅读
0评论
0点赞
发布博客于 2 年前