- 博客(79)
- 收藏
- 关注
原创 TCP的运输连接管理——三次握手,四次挥手
TCP是面向连接的协议,基于运输连接来传送TCP报文段。TCP运输连接的建立和释放是每一次面向连接的通信中必不可少的过程。
2022-12-30 14:35:12
256
1
转载 Spring框架Assert工具类的使用
当 object 不为 null 时抛出异常,notNull(Object object, String message) 方法允许您通过 message 定制异常信息。notEmpty(Map map) / notEmpty(Map map, String message) 和 notEmpty(Object[] array, String message) / notEmpty(Object[] array, String message) 分别对 Map 和 Object[] 类型的入参进行判断;
2022-08-25 15:41:54
558
原创 SpringSecurity实现自动登录
在日常的上网中,各种网站需要登陆之后才能使用,而频繁的输入用户名和密码也是够令人烦恼的。那么自动登录就解决了这一痛点,就比如登录qq邮箱时就有这一选项。今天正好学到使用spring security可以实现这一功能,因此前来记录一下。简而言之,当用户在第一次登陆之后spring security会生成一个加密的字符串存放在cookie中,同时在数据库中也会存放加密字符串和用户的信息加密字符串。等下一次访问时就会比较cookie与数据库之间的数据,如果一致那么就能免去登录了。
2022-08-21 16:40:40
770
原创 SpringSecurity常见注解的使用
方法级别的权限认证,只有被该注解指定的角色才能访问该方法使用该注解需要开启注解功能,在配置类或者启动类上添加在controller方法上添加@Secured注解此时如果不是这两个角色其中之一访问请求将被拒绝。
2022-08-21 11:38:42
1631
原创 Java8 StreamAPI的使用
1.Stream关注的是对数据的运算,与CPU打交道。集合关注的是数据的存储,与内存打交道。2. Stream自己不会存储元素,不会改变元素。相反,他们会返回一个持有结果的新Stream。Stream的操作是延迟执行的,这意味着他们会等到需要结果的时候才能执行。3.Stream执行流程。...
2022-08-07 20:18:25
140
原创 Java枚举类的使用
****自定义枚举类**47*///使用枚举类实例化一个对象}}//定义属性//私有化构造器并给属性赋值}//提供多个枚举类对象publicstaticfinalSeasonSPRING=newSeason("春天","春暖花开");publicstaticfinalSeasonSUMMER=newSeason("夏天","夏日炎炎");运行结果如下/****使用enum定义枚举类。...
2022-07-24 13:48:17
801
原创 MyBatis逆向工程生成bean与mapper
Mybatis的逆向工程是通过mybatis generator来实现的,可以帮我们生成bean,mapper接口和mapper映射文件。想要使用mybatis generator需要先引入对应的依赖,如下需要一个配置文件来设置生成代码的参数然后使用Java代码配合xml文件运行,直接生成文件将xml文件改成正确的名字直接运行便可 可见,直接自动生成了这些文件,当数据库表和字段很多的时候使用逆向工程生成文件能为我们剩下不少的精力...
2022-07-07 20:22:09
564
原创 解析代理模式(Proxy)
前言代理模式其实在生活中非常常见,就比如你想买火车票不一定要去火车站买。而是可以去附近的代售点或者是在手机上的12306App上买,这里的代售点和12306App就是代理类。亦或是在外面租房子,当我们无法方便的找到房东直租时,可以直接委托租房中介帮助我们找房子。这里的租房中介便是代理类。什么是代理模式使用一个代理对象将原始对象包装起来,然后用该代理对象取代原始的对象。任何对原始对象的调用都需要经过代理对象。代理对象决定时候以及何时将方法调用转到原始对象上。代理模式的结构代理模式的结构
2022-05-23 15:10:09
373
原创 Java算法——验证回文串(LeetCode第125题)
问题描述给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。说明:本题中,我们将空字符串定义为有效的回文串。示例分析先判断原字符串中每个字符是否是字母或者是数字,使用 Character类中的静态方法isLetterOrDigit(char ch)来判断如果是的则添加到StringBuilder中 然后再使用双指针判断是否为回文串其实可以使用String类中的replaceAll(String regex, String replacement)方
2022-05-21 10:13:44
589
原创 Java算法——移动零(LeetCode第283题)
问题描述给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。请注意,必须在不复制数组的情况下原地对数组进行操作。示例分析解法一:遍历数组直接将非零元素全部移动到前面来,然后将数组后面补上零解法二:使用快慢指针,慢指针指向已经处理好的非零元素的尾部,快指针指向未处理好的元素的头部。当快指针不断前移并且指向的元素不为0时,将其与慢指针指向的元素交换。然后慢指针前移一位。注意到以下性质:慢指针左边均为非零数 快指针...
2022-05-09 20:24:01
452
原创 Java算法——数组中重复的数据(LeetCode第442题)
问题描述给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数,并以数组形式返回。你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此问题。示例分析因为题目中规定了nums 的所有整数都在范围 [1, n] 内,因此 nums 的取值范围正好与 nums 的下标[0, n - 1]能相互映射。利用正负号来标识数组元素是否重复,那么每次判断 nums[
2022-05-08 16:56:48
1864
原创 Java算法——反转链表(LeetCode第206题)
问题描述给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。示例分析解法一:使用头插法返回一个新的结果链表,因为头插法产生的链表就是逆序的。因此刚好就是反转过来的链表。解法二:使用双指针,直接将链表中的指针全部改变方向,最终产生的链表就是反转过来的链表。如图:定义一个preNode初始化为null,一个nextNode指向头节点。定义一个tempNode临时节点保存nextNode.next。首先用tempNode保存当前节点的下一个节点,然后将
2022-05-07 17:18:30
1089
原创 Java算法——翻转二叉树(LeetCode第226题)
问题描述给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。示例分析自顶向下递归交换每个结点的左右子树,便可将整棵树交换。代码实现class Solution { public TreeNode invertTree(TreeNode root) { //递归终止条件 if (root == null) return null; //交换当前节点的左右子树 TreeNode tempRoot
2022-05-07 15:38:01
807
原创 Java算法——多数元素(LeetCode第169题)
问题描述给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例分析解法一:利用HashMap,遍历输入数组将数组元素作为key,出现次数作为value。遍历完数组之后,将value最大的map的key返回便是最终答案。代码:class Solution { public int majorityElement(int[] nums)
2022-05-03 20:00:18
833
原创 Java算法——按奇偶排序数组(LeetCode第905题)
问题描述:给你一个整数数组 nums,将 nums 中的的所有偶数元素移动到数组的前面,后跟所有奇数元素。返回满足此条件的 任一数组 作为答案。示例:分析:使用一个长度与nums相等的新数组存储排好序的整数。遍历nums,遇到偶数便将其存放进新数组的前面(从0下标开始),遇到奇数便将其存储至新数组后面(从下标nums.length - 1 开始)。判断是偶数还是奇数的方法这里不用除二取余,可以使用位运算。因为偶数的二进制最后一位数字一定是0,而奇数的二进制最后一位数字一定是1。
2022-04-28 22:52:15
1990
原创 Java算法——二进制间距(LeetCode第868题)
问题描述给定一个正整数 n,找到并返回 n 的二进制表示中两个 相邻 1 之间的 最长距离 。如果不存在两个相邻的 1,返回 0 。如果只有 0 将两个 1 分隔开(可能不存在 0 ),则认为这两个 1 彼此 相邻 。两个 1 之间的距离是它们的二进制表示中位置的绝对差。例如,"1001" 中的两个 1 的距离为 3 。示例分析根据题意进行模拟,用last记录下前一个遇到1的位置,当后面再遇到1时计算二者之间的距离并更新last。可使用 位与(&) 来比较二进制最后一位是
2022-04-25 10:11:35
244
原创 Java算法——爬楼梯(LeetCode第70题)
问题描述假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?示例分析题目中给出,上台阶的方式只有两种,一种为一步跨一阶,一种为一步跨两阶。这里先列出上前4阶台阶的方式:第1阶:只能一步跨一阶(1种方式)第2阶:(1)1阶 + 1阶 (2) 2阶 (2种方式)第3阶:(1)1阶 + 1阶 (2)1阶 + 2阶 (3)2阶 + 1阶 (3种方式)第4阶:(1)1阶 + 1阶 + 1阶 + 1阶 (2)1阶
2022-04-19 14:44:13
2822
原创 Java算法——斐波那契数(LeetCode第509题)
问题描述斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。示例分析根据题目要求可以发现从0,1之后,每个数字都可以由前面两项数字之和计算出来。因此这就是一个最简单的动态规划问题,动态规划的递推公式就是Fn=(Fn - 1) + (Fn - 2)。那么可以创建一个动态规划数组,前两项为0和1。从下标2开始每个数组元素的值都是数组前两个元素的和,最后输出数组最大下标的值就是解。代码实现packag
2022-04-19 14:19:55
480
原创 Spring Cloud——GateWay网关Filter的使用
是什么路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应,路由过滤器只能指定路由进行使用。Spring Cloud Gateway 内置了多种路由过滤器,他们都由GatewayFilter的工厂类来产生Gateway自带的Filter种类繁多,具体可以参见官网Spring Cloud Gatewayhttps://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/#th
2022-04-16 15:52:43
1067
原创 SpringCloud——Gateway网关Predicate(断言)的使用
是什么Route Predicate Factories这个是什么? Spring Cloud Gateway将路由匹配作为Spring WebFlux HandlerMapping基础架构的一部分。Spring Cloud Gateway包括许多内置的Route Predicate工厂。所有这些Predicate都与HTTP请求的不同属性匹配。多个Route Predicate工厂可以进行组合Spring Cloud Gateway 创建 Route 对象时, 使用 RoutePr.
2022-04-16 15:25:50
1136
原创 SpringCloud——Gateway新一代网关
概述简介是什么Cloud全家桶中有个很重要的组件就是网关,在1.x版本中都是采用的Zuul网关;但在2.x版本中,zuul的升级一直跳票,SpringCloud最后自己研发了一个网关替代Zuul,那就是SpringCloud Gateway一句话:gateway是原zuul1.x版的替代概述Gateway是在Spring生态系统之上构建的API网关服务,基于Spring 5,Spring Boot 2和 Project Reactor等技术。Gateway旨在提供一种简单而有效的方
2022-04-16 15:09:25
259
原创 Java算法——二进制求和(LeetCode第67题)
问题描述给你两个二进制字符串,返回它们的和(用二进制表示)。输入为 非空 字符串且只包含数字 1 和 0。示例分析这里可以直接模拟竖式相加的过程,从两个字符串最后开始遍历。每次相加都是 进位 + 上面的数字 + 下面的数字,因为二进制加法是逢二进一的。因此相加之后当前位的结果应该为:(进位 + 上面的数字 + 下面的数字)% 2。而每次相加产生的进位则可以用(进位 + 上面的数字 + 下面的数字)/ 2 来表示。代码实现 /* 循环遍历两个字符串,循环一直到遍
2022-04-16 10:14:20
1194
原创 Java算法——加一(LeetCode第66题)
问题描述给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。示例分析题目意为给你一个数,你需要将这个数加一然后返回。只不过这个数是以数组的形式给你的,即该数的最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。那么自然就能想到加一操作是从数字的最后一位开始加的,所以从数组的最后一位开始遍历。这里需要考虑几种情况。首先,如果数组最后一位的
2022-04-14 16:36:36
958
原创 Java算法——写字符串需要的行数(LeetCode第806题)
问题描述分析该题输入的字符串长度范围是[1,1000],因此该字符串至少会占一行。所以这里可以定一个变量来记录放置字符串的行数,变量初始值设置位1。定义一个静态变量来表示每行的最大宽度即100。遍历出字符串的每个字符将其减去'a'的ASCLL码便是其对应的widths数组的下标,在遍历中将每个字符的width相加起来表示当前行的宽度,如果结果大于100则意味着要换行了。此时记录行数的变量应该加一。换行之后,当前行的宽度也应该重置。代码实现class Solution { pub
2022-04-13 20:41:20
543
原创 Java算法——最后一个单词的长度(LeetCode第58题)
问题描述分析题目要求是返回最后一个单词的长度,那么这里这里可以直接从输入字符串的最后一个下标开始遍历。定义一个int变量记录最后一个单词的长度用来返回结果,因为字符串可能是以空格结尾的,所以遍历时只有遇到不是空格的字符时才开始计数。判断字符串中的字符是否是空格可以用Character类提供的静态方法isWhitespace(char c)来判断,当字符是空格时会返回true。当开始计数之后,如果当前遍历到的字符的下一个为空格时应该break退出循环,说明已经遍历完最后一个单词了。另外应当注意,如
2022-04-11 16:32:18
1102
原创 Java算法——唯一摩尔斯密码词(LeetCode第804题)
问题描述分析本题的字母都为小写字母组成,要求是要我们返回不同翻译的数量,所以自然而然就想到了使用HashSet。将26的字母对应的莫尔斯电码存储到数组中,然后遍历输入的单词数组依次找出每个单词的每个字母。根据ASCLL码计算出其对应的莫尔斯电码在数组中的下标,将每个单词的各个字母对应的莫尔斯电码拼接在一起就是每个单词的莫尔斯电了。然后将各个单词对应的莫尔斯电码添加到HashSet中,因为HashSet是不能包含重复元素的,所以我们直接返回HashSet的size()就行,非常的方便。代.
2022-04-10 10:49:26
699
原创 超详细SpringCloud Hystrix断路器(服务降级,服务熔断,服务限流,服务监控)
概述分布式系统面临的问题复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败。服务雪崩多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务,这就是所谓的“扇出”。如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,所谓的“雪崩效应”.对于高流量的应用来说,单一的后端依赖可能会导致所有服务器上的所有资源都在几秒钟内饱和。比失败更糟糕的是,.
2022-04-09 22:25:43
918
原创 超详细OpenFeign服务接口调用(使用步骤,超时控制,日志打印功能)
概述OpenFeign是什么Feign是一个声明式WebService客户端。使用Feign能让编写Web Service客户端更加简单。它的使用方法是定义一个服务接口然后在上面添加注解。Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡Feign能干什么Feign旨在使编写Java Http客户端变得更
2022-04-09 16:04:24
10408
2
原创 简单手写一个本地负载均衡器
先把配置类中注入RestTemplate方法上的@LoadBalancer注解注释掉,保证等下是自己写的负载算法生效。新建一个LoadBalancer接口package com.atguigu.springcloud.lb;import org.springframework.cloud.client.ServiceInstance;import java.util.List;/** * <p> * 获取当前服务实例 * </P> * * @autho
2022-04-08 21:28:03
614
原创 Spring Cloud Ribbon 负载均衡服务调用
概述是什么Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们很容易使用Ribbon实现自定义的负载均衡算法。.
2022-04-08 19:42:18
105
原创 CAP理论
C:Consistency(强一致性)A:Availability(可用性)P:Partition tolerance(分区容错性)CAP理论关注粒度是数据,而不是整体系统设计的策略经典CAP图最多只能同时较好的满足两个。CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,因此,根据 CAP 原理将 NoSQL 数据库分成了满足 CA 原则、满足 CP 原则和满足 AP 原则三 大类:CA - 单点集群,满足一致性,可用性的系统,通常在可扩.
2022-04-08 15:02:37
2553
原创 Java算法——搜索插入位置(LeedCode第35题)
问题描述分析题目要求我们必须使用O(logn)的算法,其实这不就是给我们提示么。看到这个时间复杂度我们自然而然地想到二分查找,若查找到对应的元素则返回对应下标,若没查找到对应的元素应该返回target应该插入的位置。后者我们可以分成两种情况来讨论,第一种:如果target小于最后一趟二分查找nums[mid]的值则返回mid;第二种:如果target大于最后一趟二分查找nums[mid]的值则返回mid + 1。代码实现public int searchInsert(int[] num
2022-04-08 10:55:41
301
原创 Java算法——实现strStr()函数(LeetCode第28题)
问题描述:分析:将子串与主串比较,从第一个字符开始逐个比较,如果全部匹配成功则直接返回子串在主串中出现的位置(假设子串的最后一个字符在主串的位置为i,那么主串从第一个字符的下标 0 到 i 的长度length =i+1;而子串在主串出现的位置就为 length - needle.length())。如果出现不匹配的字符,那么主串的下标则回溯到上一次开始匹配的下一个位置,子串的下标则每次回溯到第一个字符的位置重新开始匹配,以此类推。代码实现:class Solution { ..
2022-04-03 20:45:03
688
原创 Java算法——移除元素(LeetCode第27题)
问题描述分析双指针,first指针为结果指针,next指针为操作元素指针如果nums[next]不等于val的话就说明这是不需要删除的元素,那么将它赋值给nums[first],然后first与next指针同时向后移动如果nums[next]等于val则next向后移动,first原地不动最终next将完整遍历一遍数组,将first返回便是移除指定元素后剩下的元素长度代码实现class Solution { public int removeElement(int
2022-04-03 20:28:10
1041
原创 Java算法——最小的k个数(剑指Offer第40道题)
问题描述分析这题可以先把输入的数组排序称为升序的状态,然后返回数组里面的前k项即可可以直接用Arrays.sort对数组进行排序,但是这样会不会太简单了哈哈哈所以咱们手写快速排序进行排序代码实现 /* 先利用快速排序将输入的数组排成有序数组 然后再前k个元素复制给result数组返回 */ public static int[] getLeastNumbers(int[] arr, int k) { int[] sort
2022-04-02 22:11:26
487
原创 Java算法——删除有序数组中的重复项(LeetCode第26题)
问题描述分析此题可用双指针的方法来解题,定义一个pre指针和next指针,初始时两个指针指向数组下标1的位置。因为无论给出的数组是什么样子的,删除重复元素之后其返回结果第一个元素都是不变的。使用next指针循环遍历nums数组,如果nums[next - 1] != nums[next] 则说明这前后两个元素是不重复的,这时就将nums[next]赋值给nums[pre],然后pre再自增1。最终结束循环之后,所有的不重复元素将集中在数组的前面,pre指向的位置就是所有不重复元素的后一个位置
2022-04-02 12:07:57
1132
原创 详谈Redis分布式锁
问题描述随着业务发展的需要,原单体单机部署的系统被演化成分布式集群系统后,由于分布式系统多线程、多进程并且分布在不同机器上,这将使原单机部署情况下的并发控制锁策略失效,单纯的Java API并不能提供分布式锁的能力。为了解决这个问题就需要一种跨JVM的互斥机制来控制共享资源的访问,这就是分布式锁要解决的问题!分布式锁主流的实现方案:1. 基于数据库实现分布式锁2. 基于缓存(Redis等)3. 基于Zookeeper每一种分布式锁解决方案都有各自的优缺点:1. 性能:redis最
2022-04-01 18:05:22
961
原创 Redis常见问题——缓存穿透,缓存击穿,缓存雪崩
缓存穿透问题描述key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会压到数据源,从而可能压垮数据源。比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。解决方案一个一定不存在缓存及查询不到的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。解决方案:对空值缓存:如果一个查询返回的数据为空(
2022-04-01 17:38:44
159
原创 Java算法——有效的括号(LeetCode第20题)
问题描述:分析:首先可以肯定的是当输入的字符串为null或者是字符串的长度为奇数的时候可以直接返回false。这道题目应当用栈这种数据结构来解答,遍历输入的字符串每当遇到左边的括号就将其进栈,每当遇到右边的括号就将栈顶元素出栈。如果出栈的元素不是对应的左括号则直接返回false。最后当栈中没有括号元素时返回true。此外,为了避免没有任何元素进栈导致的空栈报错,我们可以先push一个字符进去放在栈底,最后遍历完只剩下最开始push进去的那个字符则返true。代码实现:class Solutio
2022-03-31 20:30:28
1132
原创 详谈Redis集群
在实际开发中会遇到一些问题,比如容量不够,redis如何进行扩容?并发写操作, redis如何分摊?另外,主从模式,薪火相传模式,主机宕机,导致ip地址发生变化,应用程序中配置需要修改对应的主机地址、端口等信息。之前通过代理主机来解决,但是redis3.0中提供了解决方案。就是无中心化集群配置。那么什么是集群呢?Redis 集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N。Redis 集群通过.
2022-03-31 19:51:31
1280
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人