- 博客(214)
- 资源 (1)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 Spring+SpringMVC+MyBatis+SSM项目+SpringBoot-目录(还在更新)
Spring了解Spring IOC实验 XML配置文件(IOC实验总结) 基于注解的依赖注入(IOC实验总结) AOP实验 AOP详解 JDBCTemplate 声明式事务实验 Spring与JavaWeb整合SpringMVCSpringMVC概述及HelloWorld 细节一(HelloWorld运行流程,url-pattern,@RequestMapping,R...
2020-02-20 23:22:57
597
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 容器-目录
容器解析集合框架 HashMap源码解析 ArrayList源码分析 Comparable和Comparator LinkedList源码分析 TreeMap源码解析
2020-02-12 18:32:55
267
原创 设计模式——简介
设计模式遵循的原则开闭原则:扩展开放,修改关闭立氏原则:子类能扩展父类的功能,但是不能修改父类的功能单一职责原则接口隔离原则依赖倒置原则合成复用原则:尽量减少继承对象,使用组合迪米特原则:两个软件不需要发生直接调用,而是通过第三方调用创建型模式单例模式:一个类只有一个实例 ,饿汉式,懒汉式(双锁),静态内部类,枚举类原型模式:一个创建好的实例作为原型,通过复制该原型对象创建一个和原型相同或相似的简单工厂:创建一个产品对象的工厂接口,将实际对象的创建工作放在子类工厂中工厂方法:用户
2021-06-26 20:43:00
227
原创 Kafka——消息队列堆积
如何解决消息队列堆积几百万消息怎么办?这个造成的原因就是消费端出现了问题,不消费了或者消费速度变慢了。消息堆积几小时在队列先修复consumer的问题,确保其恢复消费速度,然后将现在的comsumer停掉 新建一个topic,partition是原来的10倍,临时建好原先10倍的queue数量 然后写一个临时的分发数据的consumer程序,这个程序部署消费积压的消息,消费之后不做耗时处理,直接均匀轮询写入临时建立好的10倍的queue中 接着临时征用10倍机器来部署consumer,每一
2021-06-11 11:10:36
692
1
原创 SQL——书写高质量SQL
查询SQL的时候尽量不要使用select *,而是select 具体字段 如果知道查询结果只有一条或者只要最大/最小的一条记录,建议用limit 1(如果name是唯一索引的话,就不用加了,因为limit的存在就是为了防止全表扫描) 应尽量避免在where子句中使用or来连接条件(or可能会使索引失效,从而全表扫描) 优化Like语句,将%放在后面 使用where条件限定要查询的数据,避免返回多余的行 避免在索引列上使用mysql的内置函数,会使索引失效 应尽量避免在where子句中对字段进行表
2021-06-07 11:03:54
296
2
原创 Java集合——遍历Map对象
//第一种Map<Integer,Integer> map=new Hash<>();for(Map.Entry<Integer,Integer> entry:map.entrySet()){ System.out.println(entry.getKey()); System.out.println(entry.getValue());}//第二种for(Integer key:map.keySet()){}for(I.
2021-06-04 20:14:12
155
原创 Kafka——如何保证消息不丢失?
一.消费端丢失消息我们知道消息在被追加到Partition的时候会被分配一个offset。offset表示当前消费的Partition的所在位置,Kafka通过offset可以保证消息在分区内的顺序性。当消费者拉取到分区的某个消息之后,消费者会自动提交offset。但是会出现一个问题:当消费者刚拿到这个消息准备的时候,突然挂掉了,消息实际上没有被消费,但是offset已经被自动提交了。解决方法:关闭自动提交offset,每次在真正消费完消息之后再自己手动提交offset,每次在真正消费完消息后再自己
2021-06-03 17:07:50
230
原创 Kafka——如何保证消息不被重复消费(幂等性)
一.Exactly OnceAt Least Once:将服务器的ACK级别设置为-1,可以保证Producer到Server之间不会丢失数据At Most Once:将服务器的ACK级别设置为0,可以保证生产者每条消息zh
2021-05-31 16:24:42
2063
原创 Kafka——高可用
一.高可用的由来1.1 为什么需要Replication在Kafka在0.8之前的版本中,是没有Replication,一旦某个broker宕机,则其上的所有Partition数据都不可被消费,这与Kafka的数据持久化和Delivery Guarantee设计原则相违背。如果Producer使用同步模式则Producer则会在尝试重新发送message.send.max.retries(默认值是3)次后抛出异常,用户可以选择停止发送后续数据或者继续发送。而前者会造成数据的阻塞,后者会造成发送.
2021-05-31 15:51:15
194
原创 Kafka——入门
一.概述1.1 Kafka简介Kafka是一个分布式,分区,多副本,多订阅者,基于Zookeeper协调的分布式日志系统,也可以是消息系统。常见可以用于web/nginx日志,访问日志,消息服务等。主要设计目标有: 以时间复杂度为o(1)的方式提供消息持久化能力,即使对TB级以上的数据也能保证常数时间的访问性能 高吞吐率。即使在廉价的机器上也能做到支持每秒100K消息的传输 只是Kafka Server间的消息分区,及分布式消费,同时保证每个partition 内消息顺
2021-05-27 16:12:09
162
1
原创 高并发——提高锁的性能和锁优化
一.提高锁的性能减少锁持有时间 减少锁粒度 读写分离锁来替换独占锁 锁分离(LinkedBlocking中的takeLock和putLock) 锁粗化(虚拟机在遇到一连串地对同一锁不断进行请求和释放操作时,便会把所有锁操作整合成对锁的一次请求,从而减少对锁的请求同步次数)二.锁优化2.1 偏向锁如果一个线程获得了锁,那么锁就进入偏向模式。当这个线程再次请求锁的时候,无需在做任何同步操作。这样就节省大量有关锁的操作,从而提高了程序的性能。因此,对于几乎没有锁竞争的场合,偏向锁有很好的优化
2021-05-18 19:13:40
684
原创 分布式——CAP原理
一.概述在理论计算机科学中,CAP原理指出对于一个分布式系统来说,当设计读写操作时,只能同时满足一下三点中两个:一致性(Consistence):所有节点访问同一份最新的数据副本 可用性(Avaliability):非故障的节点在合理时间内返回合理的响应(不是错误或者超时的响应) 分区容错性(Partition tolerance):分布式系统出现网络分区(分布式系统中,多个节点之前的网络本来是连通的,但是由于某些故障,比如部分节点网络出了问题。某些节点之间不连通,整个网络就分为几个区域,这就叫
2021-05-18 17:08:11
985
原创 高可用——限流
一.概述由于 API 接口无法控制调用方的行为,因此当遇到瞬时请求量激增时,会导致接口占用过多服务器资源,使得其他请求响应速度降低或是超时,更有甚者可能导致服务器宕机。限流(Ratelimiting)指对应用服务的请求进行限制,例如某一接口的请求限制为 100 个每秒,对超过限制的请求则进行快速失败或丢弃。限流可以应对: 热点业务带来的突发请求; 调用方 bug 导致的突发请求; 恶意攻击请求。 二.限流的算法2.1固定窗口计算器算法概念如下:将时间划分
2021-05-07 14:28:41
212
原创 Nginx——入门学习
一.什么是Nginx?Nginx是一个轻量级Web服务器,不仅是一个高性能HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。Nginx以事件驱动的方式编写,所以有很好的性能,同时也是一个非常高效的反向代理,负载均衡的服务器。在性能上,Nginx占用很少的系统资源,能支持更多的并发连接,达到更高的访问效率。在安装上,Nginx安装简单,配置灵活。Nginx支持热部署,启动速度非常快,还可以在不间断服务的情况下对软件版本或者配置进行升级,即使运行数月也无需启动。在微服务的体系下,
2021-05-07 09:31:22
182
原创 Spring Cloud——配置中心(Apollo)
一.概述1.1 什么是配置应用程序在启动和运行的时候需要读取一些配置信息,配置信息基本上伴随着应用程序的整个生命周期,例如:数据库连接参数,启动参数等。有以下几个特点:配置是独立于程序的只读变量配置伴随应用的整个生命周期,应用在启动时通过读取配置来初始化,在运行时根据配置调整行为配置可以有多种加载方式,常见的有程序内部硬编码,配置文件,环境变量等配置需要治理,配置的修改需要有完善的权限控制,不同环境和集群配置管理1.2 什么是配置中心配置中心将配置从应用中剥离出来,统一管理,
2021-04-22 14:56:17
1401
1
原创 Spring Cloud——Gateway源码分析
1.入口:初始自动配置类查看gateway core包的Spring.factoires# Auto Configureorg.springframework.boot.autoconfigure.EnableAutoConfiguration=\#用来验证项目中是否存在DispatcherServlet(SpringMvc使用,webFlux中不能存在) 是否不存在DispatcherHandler(WebFlux使用)org.springframework.cloud.gateway.c
2021-04-18 17:16:10
575
原创 Spring Cloud——Gateway
一.概述1.1 简介Spring Cloud Gateway是Spring Cloud的一个全新项目,该项目是基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的网关,它旨在微服务架构提供一种简单有效的统一的API路由管理方式。Spring Cloud Gateway作为Spring Cloud生态系统的网关,目标是替代Zuul,在Spring Cloud 2.0以上版本中,没有对新版本的Zuul 2.0以上最高性能版本进行集成,仍然还是会使用Zu
2021-04-18 16:17:59
580
2
原创 Spring Cloud——Hystrix源码分析(工作流程)
@EnableHystrix@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@EnableCircuitBreakerpublic @interface EnableHystrix {}@EnbaleHystrix引入了@EableCircuitBreaker。继续查看源码@Target(ElementType.TYPE)@Retention(Retentio
2021-04-17 15:50:15
538
原创 SpringCloud——Hystrix
一.简介1.1 什么是HystrixHystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。"断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用
2021-04-16 18:48:23
212
原创 Spring Cloud——OpenFeign
一.简介Java项目中接口调用:HttpClient: Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持 Http 协议的客户端编程工具包,并且它支持 HTTP 协议最新版本和建议。 Okhttp:一个处理网络请求的开源项目,是安卓端最火的轻量级框架,由 Square 公司贡献,用于替代 HttpUrlConnection 和 Apache HttpClient。OkHttp 拥有简洁的 API、高效的性能,并支持多种协议(HTTP/2 和 SPDY)。
2021-04-16 14:42:08
367
原创 Spring Cloud——Ribbon以及源码分析
一.RestTemplate简介RestTemplate是Spring Resources中一个访问第三方RestFul API接口的网络请求框架。RestTemplate的设计原则和其他的Srping Template类似。都是为执行复杂任务提供一个具有默认行为的简单方法。RestTemplate是用来消费Rest服务的,所以RestTemplate的主要方法都与Rest的Http协议的一些方法紧密相连。例如HEAD,GET,POST,DELETE等方法。这些方法在RestTemplate类对应的
2021-04-14 17:43:31
200
原创 SpringCloud——Eureka源码分析
1.Eureka Client如何实现服务注册?基于Spring Cloud的eureka的client端在启动类上加上@EnableDiscovertClient注解,就可以用NetFilx提供Eureka Client。下面以@EnableDiscoveryClient为入口,进行源码分析。@EnableDiscoveryClient,通过源码发现这是一个标记注解/** * Annotation to enable a DiscoveryClient implementation. *
2021-04-11 19:22:57
630
原创 Spring Cloud——Eureka
一.简介1.1 什么是服务的注册与发现?服务注册是指向服务注册中心注册一个服务实例,服务提供者将自己的服务信息(如服务名,IP地址等)告知服务注册中心。服务发现是指当服务消费者需要消费另外一个服务时,服务注册中心能够告知服务消费者它需要消费服务的实例信息(如服务名,IP地址等)。通常情况下,一个服务既是服务提供者,也是服务消费者。服务消费者一般使用HTTP协议或者消费组件这种轻量级的通信机制来进行服务消费。服务注册中心会提供服务的健康检查方案,检查被注册的服务是否可用。通常一个服务实例注册后,会
2021-04-10 17:13:43
348
1
原创 Spring Cloud——微服务以及Spring Cloud简介
一.微服务1.1 什么是微服务?微服务是一种架构风格 一个应用拆分为一组小型服务 每个服务运行在自己的进程内,也就是可独立部署和升级 服务之间使用轻量级HTTP交互(也可以通过轻量级的消息总线来通信,例如RabbitMQ和kafaka) 服务围绕业务功能拆分(数据库也是独立的) 可以由全自动部署机制独立部署 去中心化,服务自治。服务可以使用不同的语言,不同的存储技术 微服务是一个分布式系统1.2 微服务的优势按照业务拆分,服务的边界明确,将复杂的问题简单化。编码也是按照业务拆分,
2021-04-09 18:43:54
178
原创 @Transactional(propagation)
事务的七种的传播行为,默认是REQUIRED1.REQUIRED,如果当前没有事务,则新建一个事务,存在这个事务,就加入这个事务2.SUPPORTS,当前方法不需要事务上下文,如果当前存在这个事务,则这个方法会在事务中执行3.MANDATORY,必须在方法中运行,如果当前不存在事务,则抛出一个事务4.REQUIRES_NEW,必须运行在自己的事务中。如果存在当前事务,当前事务会被挂起,一个新的事务将被启动5.NOT_SUPPORTED,不应该运行在事务中,如果存在当前事务,当前事务被挂起6.NE
2021-01-27 16:34:32
481
原创 多并发——总结
1.进程,线程1.1 区别进程:程序的一次执行过程,是系统运行程序的基本单位线程:是进程划分的更小的运行单位,一个进程可以产生多个线程。多个线程共享进程的堆和方法区资源,但是每个线程都有自己的程序计数器,虚拟机栈和本地方法栈区别:进程之间是独立的,线程不一定。线程执行开销小,不利于资源的管理和保护1.2 线程的状态及转换线程的六种状态:初始,就绪,运行,阻塞,等待,终止线程创建后就处于初始状态,调用了start方法后,线程处于就绪状态,当获得CPU时间片后,就处于运行状态。线
2020-11-21 13:06:52
1925
1
原创 leetcode——LRU缓存
题目:设计LRU缓存结构,该结构在构造时确定大小,假设大小为K,并有如下两个功能set(key, value):将记录(key, value)插入该结构 get(key):返回key对应的value值[要求]set和get方法的时间复杂度为O(1) 某个key的set或get操作一旦发生,认为这个key的记录成了最常使用的。 当缓存的大小超过K时,移除最不经常使用的记录,即set或get最久远的。若opt=1,接下来两个整数x, y,表示set(x, y) 若opt=2,...
2020-11-08 22:06:59
194
原创 容器——ConcurrentHashMap
1.底层数据结构和属性在之前学习容器的时候,学习的都是线程不安全的容器。现在来学习一个线程安全的容器:ConcurrentHashMap。JDK1.8之后,这个底层的数据结构就改变成了:数组+链表+红黑树(JDK1.7之前是由Segement组成的,Segment相当于一个HashMap。还要重要的属性://最大的容量private static final int MAXIMUM_CAPACITY = 1 << 30;//默认容量private static fina.
2020-11-08 17:09:44
266
原创 容器——LinkedHashMap
1.LinkedHashMap在之前学习的时候,迭代HashMap的顺序并不是放置的顺序,也就是无序的。为了有顺序的访问LinkedHashMap在底层为了双向链表,保证了元素迭代的顺序。该顺序可以是插入顺序和访问顺序。1.2 基本数据结构和属性 //双向链表的头指针 transient LinkedHashMap.Entry<K,V> head; //双向链表的尾指针 transient LinkedHashMap.Entry<K,V>
2020-11-04 19:09:51
167
原创 计算机网络——总结
1.tcp/ip五层模型 物理层:实现相邻计算机节点之间比特流的透明传输,尽量屏蔽掉具体传输介质和物理设备的差异。 数据链路层:两台主机的数据传输,总是一段一段链路的传输。两个相邻节点的数据传输,数据链路层将网络层交下来的IP数据包划分成帧,在两个相邻节点传输帧。 网络层:数据的传输需要经过不同的路由节点,不同的子网。网络层的任务就是选择合适的网间路由和交换节点,确保数据及时传输。在发送的时候,将传输层产生的报文段和用户数据段进行分组或包进行传输。 传...
2020-11-01 20:41:16
358
2
原创 String,StringBuilder,StringBuffer
(1)String:不可变的序列,每次创建就创建一个新的String对象。操作少量字符的。(2)StringBuffer:线程安全的,可变的,性能高的,多线程操作字符串缓冲区下操作大量数据。(3)StringBuilder:线程不安全的,可变的,性能最高的,单线程操作字符串缓冲区操作大量数据。如果要对字符串进行拼接,选择StringBuilder,String每次都会创建一个新的对象,性能不好,然后会选择StringBuilder,性能高。String常用的方法: equals():比
2020-10-28 20:36:05
115
原创 容器——扩容总结
ArrayList的扩容 (1)调用add方法为ArrayList添加一个元素,然后数组中的元素个数加一(size+1)。 (2) 调用方法需要得到最小扩容量,这个最小扩容量就是数组需要的最小的数组长度。如果ArrayList是使用无参构造的,没有确定长度。最小扩容量就是10和刚才元素个数中的最大值。如果是初始化过的,这个最小扩容量就是就是元素个数。 (3)得到最小扩容量后判断是否需要扩容,如果最小扩容量大于数组长度,就是说明数组长度是不够的,需要扩容。新容量为原...
2020-10-28 16:45:06
402
原创 LeetCode——最近公共祖先
题目一:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if(root==null) { return null; } if(root==p || root==q) { return root; }
2020-10-11 20:18:42
156
原创 LeetCode——二叉树的遍历
1.前序遍历递归: public List<Integer> preorderTraversal(TreeNode root) { List<Integer> list=new ArrayList<>(); preL(root,list); return list; } public void preL(TreeNode node,List<Integer> list) {
2020-09-25 17:38:54
229
原创 排序——总结
一.插入排序1.直接插入排序空间效率:使用常数个辅助单元,空间复杂度为o(1)时间效率:在排序过程中,向有序子表逐个插入元素的操作进行了n-1躺,每趟都比较和移动元素,而比较和移动元素的次数取决于待排序表的初始状态。在最好的情况下,元素已经有序,此时插入一个元素,都只需要比较一次不需要移动元素,时间复杂度为o(1)。在最坏的情况下,表中的元素是逆序的,总的比较次数和总的移动次数达到最大。平均情况为o(n^2)稳定性:每次插入元素总是从后向前进行比较,所以不会出现相同元素的相对位置发生变化,所
2020-09-16 22:01:14
479
原创 剑指Offer——连续子数组的最大和
题目:HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)方法一:找出规律public class Solutio
2020-09-08 18:06:54
113
原创 剑指Offer——整数1出现的次数
求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。方法一:...
2020-09-08 18:03:33
133
原创 剑指Offer——数字序列中某一个位数
题目:数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。方法一:从0开始进行枚举。每枚举一个数字的时候,求出该数字是几位数,然后把该数字的位数与前面所有数字的位数进行累加。如果位数之和小于或等于n,继续枚举下一个。当大于n的时候,那么n位数字就一定在这个数字里,然后在这个数字中找出对应的一位。方法二:找出规律,跳过某些数字。例如序列的第1001位是什么
2020-09-08 17:42:37
184
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人