自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(124)
  • 收藏
  • 关注

原创 leetcode 背包类问题

目录1. 分类2. 01背包2.1 二维dp数组01背包2.1.1 确定dp数组以及下标的含义2.1.2 确定递推公式2.1.3 dp数组如何初始化2.1.4 确定遍历顺序2.1.5 举例推导dp数组2.1.6 完整代码2.2 一维dp滚动数组(状态压缩)2.2.1 确定dp数组以及下标的含义2.2.2 确定递推公式2.2.3 dp数组如何初始化2.2.4 确定遍历顺序2.2.5 举例推导dp数组2.2.6 完整代码1. 分类对于面

2021-03-07 14:44:36 352

原创 LinkedList

1. 简介LinkedList是一个实现了List接口和Deque接口的双端链表。 LinkedList底层的链表结构使它支持高效的插入和删除操作,另外它实现了Deque接口,使得LinkedList类也具有队列的特性; LinkedList不是线程安全的,如果想使LinkedList变成线程安全的,可以调用静态类Collections类中的synchronizedList方法:List list=Collections.synchronizedList(new LinkedList(...));

2021-02-25 23:08:30 170

原创 ArrayList源码分析

目录1. 简介1.1 ArrayList 和 Vector 的区别1.2 ArrayList 和 LinkedList区别2. ArrayList 源码解读2.1 初始化2.2 新增和扩容2.3 扩容的本质2.4 删除2.5 迭代器1. 简介ArrayList的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增长。在添加大量元素前,应用程序可以使用ensureCapacity操作来增加ArrayList实例的容量。这可以减少递增式再...

2021-02-25 00:04:37 167 2

原创 认证和授权

1. 概念Authentication(认证)是验证您的身份的凭据(例如用户名/用户ID和密码),通过这个凭据,系统得以知道你就是你,也就是说系统存在你这个用户。所以,Authentication 被称为身份/用户验证。 Authorization(授权)发生在Authentication(认证)之后。授权嘛,光看意思大家应该就明白,它主要掌管我们访问系统的权限。比如有些特定资源只能具有特定权限的人才能访问比如admin,有些对系统资源操作比如删除、添加、更新只能特定人才具有。2. cook...

2021-02-24 22:36:11 231

原创 ZooKeeper

目录1. Zookeeper 介绍1.1 简介1.2 特点1.3 典型的应用场景1.4 哪些开源项目应用了zookeeper2. Zookeeper 重要概念2.1 Data model(数据模型)2.2 znode(数据节点)2.2.1 znode 4种类型2.2.2 znode 数据结构2.3 版本(version)2.4 ACL权限控制2.5 Watcher(事件监听器)2.6 会话(Session)3. ZooKeeper 集群3.1.

2021-02-22 23:28:21 192

原创 计算机网络

目录1. 网络体系1.1 应用层1.1.1 域名系统1.1.2 HTTP协议1.2 运输层1.3 网络层1.4 数据链路层1.5 物理层2. TCP2.1 三次握手图解2.2 为什么要三次握手2.3 第二次握手中回传了ACK,为什么还要回传SYN2.4 为什么要四次挥手3. TCP和UDP的区别4. TCP 如何保证可靠传输4.1 ARQ协议4.1.1 停止等待ARQ协议4.1.2 连续ARQ协议4.2 滑动窗口和流量控制4.3

2021-02-21 15:25:27 224

原创 redis

目录1. 简介2. 缓存数据的处理的流程3. 为什么要用redis缓存4. redis常见的数据结构4.1 String4.2 list4.3 hash4.4 set4.5 sorted set5. redis 单线程模型6. redis为什么使用单线程7. redis6.0 为何引进多线程8. 多线程的实现机制9. redis 设置过期时间9.1 作用9.2 原理9.3 过期删除策略9.4 内存淘汰机制10. 持久化机制11.

2021-02-20 17:09:36 97

原创 N皇后问题

1. 概述「N 皇后问题」研究的是如何将 N个皇后放置在 N × N 的棋盘上,并且使皇后彼此之间不能相互攻击。皇后的走法是:可以横直斜走,格数不限。因此要求皇后彼此之间不能相互攻击,等价于要求任何两个皇后都不能在同一行、同一列以及同一条斜线上。以 leetcode51 为例讲解N皇后问题 https://leetcode-cn.com/problems/n-queens/1.1 图解简单来说,就是保证横向,纵向以及对角线不存在重复的皇后即可。那为了快速判断该点是否可以放置皇后,我们用.

2021-02-20 13:54:09 249

原创 岛屿类问题(DFS、BFS、DSU)

目录1. 深度优先搜索(DFS)1.1 模板1.2 避免重复1.3 图解1.4 实现2. 广度优先搜索(BFS)2.1 实现3. 并查集(DSU)3.1 思路3.1.1 图解3.1.2 初始化数组 QuickUnion()3.1.3 查找所属集合 find()3.1.4 合并 union()3.2 实现在 leetCode 中,「岛屿问题」是一个系列系列问题。我们首先明确一下岛屿问题中的网格结构是如何定义的,以方便我们后面的讨论。网格问题是

2021-02-19 23:20:36 669

原创 RocketMQ

目录1. 消息队列1.1 优点1.1.1 异步1.1.2 解耦1.1.3 削峰1.2 缺点1.2.1 降低了系统的可用性1.2.2 增加系统的复杂度1.2.3 重复消费问题1.2.4 消息的顺序消费问题1.2.5 分布式事务1.2.6 消息堆积问题2. RocketMQ2.1 队列模型和主题模型2.1.1 队列模型2.1.2 主题模型2.1.3 RocketMQ中的消息模型2.2 架构图2.2.1 Broker2.2.2 Nam

2021-02-19 12:51:53 692 2

原创 MySQL

目录1. MySQL的基本架构1.1 概览2. 存储引擎2.1 MyISAM 对比 InnoDB3. 索引3.1 索引的设计规范3.1.1 限制每张表上的索引数量,建议单张表索引不超过 5 个3.1.2 禁止给表中的每一列都建立单独的索引3.1.3 每个 Innodb 表必须有个主键3.1.4 索引列的顺序3.1.5 避免建立冗余索引和重复索引(增加了查询优化器生成执行计划的时间)3.1.6 对于频繁的查询优先考虑使用覆盖索引3.1.7 索引 SE..

2021-02-16 18:05:56 489 2

原创 TopK问题(快排变形/堆/二叉搜索树/计数排序)leetcode347

1. TopK问题描述TopK问题,不管是求前K大/前K小/第K大/第K小等,都有4种不错的方法喔:1. O(N):用快排变形最最最高效解决TopK问题2. O(NlogK):大根堆(前K小)/小根堆(前K大)3. O(NlogK):二叉搜索树4. O(N): 对于数据范围有限的情况例如本题,可以直接计数排序O(N)高效解决1. 快排变形用快排变形最最最高效解决TopK问题 O(N)先通过快排切分排好第K小的数,根据快排切分的性质,它左边的K - 1个数都小于等于它,因此它以

2021-02-16 15:11:55 563

原创 二叉树的遍历(BFS和DFS)

目录1. 前序遍历1.1 概念1.2 建立TreeNode模型1.3 递归实现1.4 迭代实现2. 中序遍历2.1 概念2.2 递归实现2.3 迭代实现3. 后序遍历3.1 概念3.2 递归实现3.3 迭代实现1. 前序遍历对应leetcode 144 题 https://leetcode-cn.com/problems/binary-tree-preorder-traversal/1.1 概念DLR--前序遍历(按照访问根节点——左子树—

2021-02-15 16:19:22 584

原创 JVM

目录1. 概述2. 运行时的数据区域2.1 程序计数器2.2 Java虚拟机栈2.3 本地方法栈2.4 堆2.5 方法区2.5.1 方法区和永久代的关系2.5.2 常用参数2.5.3 永久代 (PermGen) 替换为元空间 (MetaSpace)2.6 运行时常量池2.7 直接内存3. HotSpot 虚拟机对象探秘3.1 对象的创建3.1.1 类加载检查3.1.2 分配内存3.1.3 初始化零值3.1.4 设置对象头3.1.5

2021-02-14 21:13:05 430

原创 JAVA8

目录1. 接口的默认方法(Default Methods for Interfaces)2. Lambda表达式(Lambda expressions)3. Lamda 表达式作用域(Lambda Scopes)3.1 访问局部变量3.2 访问字段和静态变量4. 函数式接口(Functional Interfaces)4.1 概念4.2 示例5. 方法和构造函数引用(Method and Constructor References)5.1 引用静态方法5.2 引

2021-02-14 19:44:54 142 2

原创 并发基础

1. 线程、程序和进程1、进程进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如 CPU 时间,内存空间,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 线程是进程划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有

2021-02-13 11:22:28 130

原创 Java集合

目录1、集合概述1.1 集合概览2、List、Set和Map2.1 List数据结构Arraylist 和 Vector 的区别Arraylist 与 LinkedList 区别2.2 Set数据结构2.3 Map数据结构HashMap 和 Hashtable 的区别HashMap 和 HashSet 区别HashMap 和 TreeMap 区别HashSet 如何检查重复HashMap 的底层实现2.4 三者的区别Collect.

2021-02-13 06:08:45 314 1

原创 代理模式

目录代理模式静态代理动态代理JDK动态代理介绍使用步骤CGLIB动态代理介绍使用步骤JDK 动态代理和 CGLIB 动态代理对比静态代理和动态代理的对比代理模式代理模式是一种比较好的理解的设计模式。简单来说就是我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。代理模式的主要作用是扩展目标对象的功能,比如说在目标对象的某个方法执行前后你可以增加一些自定义..

2021-02-11 22:29:37 73

原创 java基础

1、 关于 JVM JDK 和 JRE1.1 JVMJava 虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。什么是字节码?采用字节码的好处是什么?在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为.class的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保..

2021-02-07 23:16:46 586 2

原创 2020-12-28

基础1、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?对于short s1 = 1; s1 = s1 + 1;由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。对于short s1 = 1; s1 += 1;由于 +=是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。2、char型变量中能不能存贮一个中文汉字?为什

2020-12-28 19:04:17 118

原创 【牛客网-剑指offer】二维数组中的查找

题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。第一种思路: 把每一行看成有序递增的数组,利用二分查找,遍历每一行找到答案。public boolean Find(int target, int [][] array) ...

2019-05-07 19:20:41 187

原创 基于LCN框架解决分布式事务

事务控制原理TX-LCN由两大模块组成, TxClient、TxManager,TxClient作为模块的依赖框架,提供TX-LCN的标准支持,TxManager作为分布式事务的控制放。事务发起方或者参与反都由TxClient端来控制。原理图核心步骤 创建事务组 是指在事务发起方开始执行业务代码之前先调用TxManager创建事务组对象,然后拿到事务标示GroupI...

2019-04-27 09:23:01 312

原创 RabbitMQ

简介 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现。AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有很多公开标准(如 COBAR的 IIOP ,或者是 SOAP 等),但是在异步消息处理中却不是这样,只有大企业有一些商业实现(如微软的 MSMQ ,IBM 的 Websphere MQ 等...

2019-04-20 22:52:10 268

原创 CAP与Base理论、柔性事务与刚性事务、理解最终一致性等思想

CAP(帽子原理) 由于对系统或者数据进行了拆分,我们的系统不再是单机系统,而是分布式系统,针对分布式系统的CAP原理包含如下三个元素: C:Consistency,一致性。在分布式系统中的所有数据 备份,在同一时刻具有同样的值,所有节点在同一时刻读取的数据都是最新的数据副本。 A:Availability,可用性,好的响应性能。完全的可用性指的是在任何故障模型...

2019-04-20 21:05:48 3739

原创 ActiveMQ

概述 是Apache下的一个子项目。 类似于ZeroMQ,它能够以代理人和点对点的技术实现队列。同时类似于RabbitMQ,它少量代码就可以高效地实现高级应用场景。RabbitMQ、ZeroMQ、ActiveMQ均支持常用的多种语言客户端 C++、Java、.Net,、Python、 Php、 Ruby等。ActiveMQ安装1、下载ActiveMQ 去官方...

2019-04-20 20:15:29 150

原创 消息中间件

消息中间件产生背景1.在网络通讯中,Http请求默认采用同步请求方式,基于请求与响应模式2.在客户端与服务器进行通讯时,客户端调用服务端接口后,必须等待服务端完成处理后返回结果给客户端才能继续执行,这种情况属于同步调用方式。3.如果服务器端发生网络延迟、不可达的情况,可能客户端也会受到影响。网络通讯采用同步方式优缺点:优点:及时响应数据给客户端,整个过程同步 缺点:可能会导致...

2019-04-20 16:40:37 201

原创 Api接口管理SrpingCloud之Swagger2

背景 随着微服务架构体系的发展和应用, 为了前后端能够更好的集成与对接,同时为了项目的方便交付,每个项目都需要提供相应的API文档。传统的API文档编写存在以下几个痛点:对API文档进行更新的时候,需要通知前端开发人员,导致文档更新交流不及时 API接口返回信息不明确 缺乏在线接口测试,通常需要使用相应的API测试工具,比如postman、SoapUI等 接口文档太多...

2019-04-20 15:34:01 214

原创 Api网关服务SrpingCloud之Zuul

网关作用网关可以拦截客户端所有请求,对该请求进行权限控制、负载均衡、路由转发、日志、监控等。网关与过滤器区别 网关是拦截所有服务器请求进行控制 过滤器拦截某单个服务器请求进行控制 Nginx与Zuul的区别相同点: Zuul和Nginx都可以实现负载均衡、反向代理、过滤请求、实现网关效果 不同点: Nginx是采用服务器负载均衡进行转发 ...

2019-04-20 14:08:40 168

原创 分布式配置中心SrpingCloud之Config

产生背景 在微服务中,如果使用传统的方式进行管理配置文件,配置文件管理器非常复杂。如果生产环境配置文件,可能需要发生改变的时候,重新打war包,重新读取配置信息,缓存到JVM内存中。什么是分布式配置中心 在微服务中,使用同一个服务器管理所有服务配置文件信息,能够实现后台可管理,当服务器正在运行的时候,如果配置文件需要发生改变,可以实现不需要重启服务器,实时更改配...

2019-04-20 11:35:30 140

原创 服务保护机制SpringCloud之Hystrix

服务降级、熔断、限流概念服务学崩效应 服务雪崩效应产生与服务堆积在同一个线程池中,因为所有的请求都是同一个线程池进行处理,这时候如果在高并发情况下,所有的请求全部访问同一个接口,这时候可能会导致其他服务没有线程进行接受请求,这就是服务雪崩效应效应。服务降级 在高并发情况下,防止用户一直等待,使用服务降级方式(直接返回一个友好的提示给客户端,调用fallBack...

2019-04-19 23:40:51 180

原创 服务调用工具

SpringCloud支持两种客户端服务调用工具Rest RestTemplate Feign客户端Feign客户端简介Feign客户端是一个web声明式http远程调用工具,提供了接口和注解方式进行调用。环境搭建1、pom文件引入<dependency> <groupId>org.springframework.cloud</grou...

2019-04-19 23:08:21 215

原创 客户端负载均衡器

客户端负载均衡器 在SpringCloud中Ribbon负载均衡客户端,会从eureka注册中心服务器端上获取服务注册信息列表,缓存到本地。然后在本地实现轮训负载均衡策略。Ribbon本地负载均衡与Nginx服务器负载均衡区别Ribbon本地负载均衡,原理:在调用接口的时候,会在Eureka注册中心上获取注册中心服务列表,获取到之后,缓存到本地。然后本地实现rpc远程调用技...

2019-04-19 21:08:27 293

原创 分布式注册中心

服务治理SpringCloud Eureka什么是服务治理 在传统rpc远程调用中,服务与服务依赖关系,管理比较复杂,所以需要使用服务治理,管理服务与服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册。服务注册与发现 在服务注册与发现中,有一个注册中心,当服务器启动的时候,会把当前自己服务器的信息 比如 服务地址通讯地址等以别名方式注册...

2019-04-19 16:56:47 1236

原创 互联网网站架构演变过程

传统架构 传统的SSM架构,分为三层架构 web控制层、业务逻辑层、数据库访问层。 传统架构也就是单点应用,就是大家在刚开始初学JavaEE技术的时候SSH架构或者SSM架构,业务没有进行拆分,都写同一个项目工程里面,一般是适合于个人或者是小团队开发。 这种架构模式,一旦有一个模块导致服务不可用,可能会影响整个项目。分布式架构 分布...

2019-04-19 16:04:09 196

原创 Apollo(阿波罗)分布式配置中心

简介 Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。特点 统一管理不同环境、不同集群的配置 所有的配置发布都有版本概念,从而可以方便的支持配置的回滚。 配置修改实时生效(热发布) 用户在Apollo修改完配置...

2019-04-19 15:40:14 1587

原创 网站跨域问题

什么是跨域问题 在当前域名请求网站中,默认不允许通过ajax请求发送其他域名。默认情况下浏览器会有安全机制,可以访问,但是获取不到返回结果。解决方案使用jsonp解决网站跨域 使用HttpClient内部转发 使用设置响应头允许跨域 基于Nginx搭建企业级API接口网关 使用Zuul搭建微服务API接口网关jsonp解决网站跨域$.ajax({ type...

2019-04-15 15:09:40 455

原创 分布式Session一致性问题

Session概念 Session 是客户端与服务器通讯会话技术, 比如浏览器登陆、记录整个浏览会话信息Session实现原理 客户对向服务器端发送请求后,Session 创建在服务器端,返回Sessionid给客户端浏览器保存在本地,当下次发送请求的时候,在请求头中传递sessionId获取对应的从服务器上获取对应的Sesison注意Session是保...

2019-04-15 11:03:18 367

原创 分布式协调工具-Zookeeper

概念Zookeeper是一个分布式开源框架,提供了协调分布式应用的基本服务,它向外部应用暴露一组通用服务——分布式同步(Distributed Synchronization)、命名服务(Naming Service)、集群维护(Group Maintenance)等,简化分布式应用协调及其管理的难度,提供高性能的分布式服务。ZooKeeper本身可以以单机模式安装运行,不过它的长处在于通过...

2019-04-14 19:44:20 336

原创 穿透和雪崩效应的解决方案

缓存穿透概念 缓存穿透是指用户查询数据,在数据库没有,自然在缓存中也不会有。这样就导致用户查询的时候,在缓存中找不到,每次都要发生jdbc请求,去数据库再查询一遍,然后返回空。这样请求就绕过缓存直接查数据库,这也是经常提的缓存命中率问题。解决方案 如果查询数据库也为空,直接在Redis中设置一个为null的结果,这样第二次到缓冲中获取就有值了,而不会继续...

2019-04-14 15:40:51 629

原创 自定义简单实现HashMap(JDK1.7)

底层结构HashMap的底层结构是由数组+链表构成的。数组的元素是每个链表的头结点,每个节点存放key,value和next下一个节点put和get方法put()方法大概过程如下:如果添加的key值为null,那么将该键值对添加到数组索引为0的链表中,不一定是链表的首节点。如果添加的key不为null,则根据key计算数组索引的位置:数组索引处存在链表,则遍历该链表...

2019-04-12 14:00:31 192

空空如也

空空如也

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

TA关注的人

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