自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

学而不思则忘

一切都可以。。。

  • 博客(651)
  • 收藏
  • 关注

原创 递归回溯专题

例如:每次递归都将能走过的点位置2,这样每次退出递归时该次递归寻找的岛屿都是2(同时原来矩阵中数值也变成2),所以最后只需要统计原来矩阵有多少个1开始遍历的次数即可。参考答案:https://leetcode.cn/problems/number-of-islands/solutions/211211/dao-yu-lei-wen-ti-de-tong-yong-jie-fa-dfs-bian-li-/,说明该单元格的结果尚未被计算过,则进行搜索,并将计算得到的结果存入缓存中。个位置(下标从 0 开始)。

2023-06-15 12:43:31 1017

原创 二分查找专题

给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target,返回[-1, -1]。你必须设计并实现时间复杂度为O(log n)的算法解决此问题。输入:nums = [5,7,7,8,8,10], target = 8输出:[3,4]输入:nums = [5,7,7,8,8,10], target = 6输出:[-1,-1]

2023-06-15 12:42:22 353

原创 系统技术方案设计

假设A机器在时刻0时成功发送一次视频曝光事件,这次本地缓存是5分钟有效期,redis缓存也是5分钟。B机器在时刻4时,由于本地缓存为空,所以会判断redis缓存,此时。失败不进行消息发送,如果B机器在时刻4时本地缓存不为空,则说明B机器在前5分钟发送过一次曝光事件,就不需要去尝试获取redis锁。所以系统的增加曝光接口中,如果某一条视频有曝光,则对其进行火力值计算,这样量级则大大减少。采用本地缓存+redis分布式缓存限制每条视频每5分钟发送一次曝光事件到MQ进行限流。火力值:根据视频曝光量计算出来。

2023-06-15 12:40:36 419

原创 Spring自定义注解

Target({TYPE:作用在类、接口(包括注解类型),枚举类FIELD:字段声明(包含枚举常量)METHOD:作用于方法PARAMETER:作用于参数CONSTRUCTOR:作用于构造器。

2023-02-26 23:11:59 146 1

原创 LRU缓存算法

我们在使用的时候,可以就把它理解为我们经常接触的数据结构——队列,不过是增加了多线程下的安全性保证罢了。

2023-02-19 13:42:37 486

原创 面试题 08.01. 三步问题

【代码】面试题 08.01. 三步问题。

2023-01-15 17:28:25 106

原创 面试题 05.03. 翻转数位

给定一个32位整数 num,你可以将一个数位从0变为1。请编写一个程序,找出你能够获得的最长的一串1的长度。输入: num = 1775(110111011112)输出: 8输入: num = 7(01112)输出: 4。

2023-01-15 16:56:35 132

原创 LCS 01. 下载插件

小扣打算给自己的 VS code 安装使用插件,初始状态下带宽每分钟可以完成 1 个插件的下载。假定每分钟选择以下两种策略之一:使用当前带宽下载插件将带宽加倍(下载插件数量随之加倍)请返回小扣完成下载 n 个插件最少需要多少分钟。注意:实际的下载的插件数量可以超过 n 个。

2022-12-27 20:39:34 154

原创 1753. 移除石子的最大得分

你正在玩一个单人游戏,面前放置着大小分别为 a​​​​​​、b 和 c​​​​​​ 的 三堆 石子。每回合你都要从两个 不同的非空堆 中取出一颗石子,并在得分上加 1 分。当存在 两个或更多 的空堆时,游戏停止。给你三个整数 a 、b 和 c ,返回可以得到的 最大分数。

2022-12-21 22:17:24 85

原创 1760. 袋子里最少数目的球

给你一个整数数组 nums ,其中 nums[i] 表示第 i 个袋子里球的数目。同时给你一个整数 maxOperations。比方说,一个袋子里有 5 个球,你可以把它们分到两个新袋子里,分别有 1 个和 4 个球,或者分别有 2 个和 3 个球。选择任意一个袋子,并将袋子里的球分到 2 个新的袋子中,每个袋子里都有 正整数 个球。你的开销是单个袋子里球数目的 最大值 ,你想要 最小化 开销。请你返回进行上述操作后的最小开销。

2022-12-20 18:56:59 158

原创 Spring的动态AOP源码解析

1.3 xml方式使用AOP1.4 抛出问题?a. Advice的执行顺序?对比上面两张图片,可以看到**@Around、@After、@Before**这三个执行顺序有变化。在Spring5.x或6.x,省略@Around的时候,执行顺序为:关键在于@EnableAspectJAutoProxy 注解,开启了AspectJ的代理功能,顺着该注解点下去,可以在 AopConfigUtils类中找到下面这一段代码:上面就将AnnotationAwareAspectJAutoProxyCreator类

2022-12-19 22:34:12 465

原创 1971. 寻找图中是否存在路径

有一个具有 n 个顶点的 双向 图,其中每个顶点标记从 0 到 n - 1(包含 0 和 n - 1)。图中的边用一个二维整数数组 edges 表示,其中 edges[i] = [ui, vi] 表示顶点 ui 和顶点 vi 之间的双向边。每个顶点对由 最多一条 边连接,并且没有顶点存在与自身相连的边。请你确定是否存在从顶点 source 开始,到顶点 destination 结束的 有效路径。

2022-12-19 22:19:44 76

原创 Paxos算法

paxos算法

2022-09-12 15:09:28 202

原创 6139. 受限条件下可到达节点的数目

算法

2022-08-07 14:20:34 141

原创 一致性哈希算法

一致性哈希算法浅解

2022-06-19 16:55:52 299

原创 详解Handler业务处理器

整个IO处理操作环节包括:从通道读数据包、数据包解码、业务处理、目标数据解码、把数据包写到通道,然后由通道发送到对端。1. ChannelInboundHandler通道入站处理器channelRegistered:当通道注册完成后,Netty会调用fireChannelRegistered,触发通道注册事件。通道会启动该入站操作的流水线处理,在通道注册过的入站处理器Handler的channelRegistered方法,会被调用到。channelActive:当通道激活完成后,Netty会调用f

2022-05-30 19:09:53 368 1

原创 详解ByteBuf缓冲区

1. ByteBuf优点与Java NIO的Byte Buffer相比,ByteBuf的优势如下:Pooling池化,减少了内存复制和GC,提升了效率复合缓冲区类型,支持零复制不需要调用flip()方法去切换读/写模式扩展性良好可以自定义缓冲区类型读取和写入索引分开方法的链式调用可以进行引用计数,方便重复使用2. ByteBuf的逻辑部分ByteBuf是一个字节容器,内部是一个字节数组。从逻辑上来分,字节容器内部可以分为四个部分。第一个部分是已用字节,表示已经使用完的废弃的无

2022-05-30 19:09:39 3354

原创 详解Pipeline流水线

1. Pipeline入站处理流程先看下面程序,建立了三个入站处理器,按照A—>B—>C的顺序添加:public class InPipeline { public static class SimpleInHandlerA extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) thr

2022-05-30 19:09:27 1337

原创 粘包和拆包

概念Netty接收端可能会遇到一下几种情况:读取到一个完整的客户端输入ByteBuf,称为全包读到多个输入ByteBuf,称为粘包读到部分ByteBuf内容,并且有乱码,称为半包粘包和半包可统称为半包问题半包的原理底层网络是以二进制字节报文形式传输数据的。读数据过程:Netty先将二进制数据读取到ByteBuf缓冲区中,然后再转换为POJO对象。写数据过程:将Java类型的数据转化为底层能够传输的二进制ByteBuf数据。在发送端,Netty以ByteBuf为单位来发送数据,但是到

2022-05-30 19:09:16 180

原创 Decoder原理和浅解

1. ByteToMessageDecoder解码器是一个抽象类,仅提供了一个框架,继承关系如下:解码流程:实现一个自己的ByteBuf解码器:继承ByteToMessageDecoder抽象类实现基类的decode抽象方法。将ByteBuf到POJO解码的逻辑写入此方法。将ByteBuf二进制数据,解码成一个个的Java对象。在子类的decode方法中,需要将解码后的Java POJO对象,放入decode的List< Object >实参中,一个个的传递到下一站的Inbou

2022-05-30 19:08:54 1934

原创 ByteBuf浅层复制的使用

浅层复制可以有效避免内存复制。ByteBuf的浅层复制有两种:切片浅层复制和整体浅层复制。切片浅层复制 sliceslice方法可以获取到一个ByteBuf的一个切片。一个ByteBuf可以进行多次的切片浅层复制,多次切片后的ByteBuf对象可以共享一个存储区域。slice方法有两个重载版本:public ByteBuf slice():返回的是ByteBuf中可读部分的切片public ByteBuf slice(int index, int length):可以灵活设置不同起始位置和长度,

2022-05-30 19:08:30 612

原创 Reactor反应器模式

反应器模式由Reactor反应器线程、Handlers处理器两大角色组成:Reactor反应器线程的职责:负责响应IO事件,并且分发到Handlers处理器Handlers处理器职责:非阻塞的执行业务逻辑1. 单线程Reactor反应器模式...

2022-05-30 19:08:16 170

原创 四种主要的IO模型

1. 同步阻塞IO在阻塞IO模型中,Java应用程序从IO系统调用开始,直到系统调用返回,在这段时间内,Java进程是阻塞的,返回成功后,应用程序才开始处理用户空间的缓存区数据。优点:开发快。缺点:一个线程维护一个IO连接,在并发量高的情况下,内存、线程切换开销非常大2. 同步非阻塞NIO在NIO模型中,会出现下面两种情况:在内核缓冲区中没有数据的情况下,系统调用会立即返回一个调用失败的信息在内核缓冲器有数据的情况下,是阻塞的,直到数据从内核缓冲区复制到用户进程缓冲。复制完成后,系统调用返回

2022-05-29 22:41:03 200

原创 解码器和编码器结合

1. ByteToMessageCodec编解码器这是一个抽象类,继承它,就等同于继承了ByteToMessageDecoder解码器和MessageToByteEncoder编码器这两个基类。有两个方法需要去实现:编码方法:encode(...)解码方法:decode(...)// 示例public class Byte2IntegerCodec extends ByteToMessageCodec<Integer> { @Override public voi

2022-05-29 22:39:51 551

原创 Protobuf通信协议

Protobuf的编码过程为:使用预先定义的Message数据结构将实际数据进行打包,然后编码成二进制的码流进行传输或者存储。Protobuf的解码过程为:将二进制码流解码成Protobuf自己定义的Message数据结构的POJO实例。使用方法:// 定义proto协议版本syntax = "proto3";package com.floweryu.netty.protobuf.bean;// 生成POJO类将代码放入指定包中option java_package = "com.flow

2022-05-29 22:39:21 483

原创 Netty中的Reactor反应器模式

一、Netty中的Channel通道组件NioSocketChannel:异步非阻塞TCP Socket传输通道NioServerSocketChannel:异步非阻塞TCP Socket服务器监听通道NioDatagramChannel:异步非阻塞的UDP传输通道NioSctpChannel:异步非阻塞Sctp传输通道NioSctpServerChannel:异步非阻塞Sctp服务器监听通道OioSocketChannel:同步阻塞式TCP Socket传输通道O

2022-05-29 22:38:34 191

原创 Netty中的Bootstrap启动器

Netty中有两个启动器类,分别用在服务器和客户端。

2022-05-29 22:37:05 119

原创 Netty内置的Decoder

1. 固定长度解码器:FixedLengthFrameDecoder适用场景:每个接收到的数据包的长度,都是固定的。该解码器会将入站的ByteBuf数据包拆分成一个个固定长度的数据包,然后发送给下一个入站处理器。2. 行分割解码器:LineBaseFrameDecoder适用场景:每个ByteBuf数据包,适用换行符作为数据包的边界分隔符该场景下,会使用换行符把ByteBuf数据包分割成一个个完整的数据包发送到下一个入站处理器。工作原理:遍历ByteBuf数据包中的可读字节,判断在 二进

2022-05-29 22:36:35 878

原创 JSON传输的编码器和解码器原理

以Head-Content为例,解码过程如下:编码过程如下:本质上与传输普通的文本没有区别。

2022-05-29 22:36:10 142

原创 Java的NIO

1. NIO和OIO区别OIO面向流,NIO面向缓冲区OIO操作是阻塞的,NIO是非阻塞OIO没有选择器概念,NIO有选择器2. 通道 channel在NIO中,同一个网络连接使用一个通道表示,所有的NIO的IO操作都是从通道开始的。一个通道类似于OIO中的两个流的结合体,既可以从通道中读取,也可以向通道中写入3. 选择器 select通过选择器,一个线程可以查询到多个通道的IO事件的就绪状态4. 缓冲区 buffer通道的读取,就是将数据从通道读取到缓冲区中;通道的写入,就是将数据从

2022-05-29 22:34:18 82

原创 Encoder原理和浅解

1. MessageToByteEncoder编码器作用:将POJO对象编码成一个ByteBuf数据包。需要实现此抽象类的encode方法。public class Integer2ByteEncoder extends MessageToByteEncoder<Integer> { @Override public void encode(ChannelHandlerContext ctx, Integer msg, ByteBuf out) thr

2022-05-29 22:33:33 502

原创 ChannelInboundHandler生命周期

运行以下程序,可以看到ChannelHandler的方法回调顺序:public class InHandlerDemo extends ChannelInboundHandlerAdapter { @Override public void handlerAdded(ChannelHandlerContext ctx) throws Exception { System.out.println("被调用-handlerAdded()"); supe

2022-05-29 22:32:50 252

原创 Windows Terminal配置连接服务器

1. 打开Windows Terminal的json配置文件{ "commandline": "ssh aliyun", # 设置的terminal窗口打开命令 "guid": "{a5f1d6f0-67db-c8c7-5554-889333cf370b}", # guidk "name": "aliyun", "tabTitle": "aliyun-Linux"}2. 打开C:/Users/name/.ssh目录在下面的config文件中添加Host

2022-03-31 19:42:49 2249 2

原创 606. 根据二叉树创建字符串

题目链接你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。空节点则用一对空括号 “()” 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} *

2022-03-20 13:51:49 122

原创 6022. 将数组和减半的最少操作次数

题目链接给你一个正整数数组 nums 。每一次操作中,你可以从 nums 中选择 任意 一个数并将它减小到 恰好 一半。(注意,在后续操作中你可以对减半过的数继续执行操作)请你返回将 nums 数组和 至少 减少一半的 最少 操作数。输入:nums = [5,19,8,1]输出:3解释:初始 nums 的和为 5 + 19 + 8 + 1 = 33 。以下是将数组和减少至少一半的一种方法:选择数字 19 并减小为 9.5 。选择数字 9.5 并减小为 4.75 。选择数字 8 并减小

2022-03-20 11:35:55 165

原创 剑指 Offer 49. 丑数

题目连接我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。输入: n = 10输出: 12解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。class Solution { public int nthUglyNumber(int n) { int[] res = new int[n]; res[0] = 1; int i = 0, j

2022-03-13 23:14:27 413

原创 剑指 Offer 48. 最长不含重复字符的子字符串

题目描述请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。输入: “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。class Solution { public int lengthOfLongestSubstring(S

2022-03-13 22:46:35 65

原创 Comparator比较器返回值理解

最近使用到了Comparator接口的compare方法,思考了一下改方法的返回值跟升序降序的关系。背景升序代码public void sortTest() { Integer[] nums = new Integer[]{1, 4, 3, 5, 2, 7, 6}; Arrays.sort(nums, new Comparator<Integer>() { @Override public int compare(Integer o1, .

2022-03-08 11:18:22 3858 1

原创 @Value注解

1. 作用可以直接赋值:@Value("string value")private String stringValue;可以使用SpEL表达式:@Value("#{systemProperties['priority']}")private String spelValue;@Value("#{systemProperties['unknown'] ?: 'some default'}")private String spelSomeDefault;@Value("#{someBe

2022-03-06 22:48:35 821

原创 BeanPostProcessor接口

1. 作用BeanPostProcessor接口里面有下面两个方法:实现这两个方法可以在bean的初始化前后进行操作。实现该接口的类必须注入到容器中才能生效/**Apply this BeanPostProcessor to the given new bean instance before any bean initialization callbacks (like InitializingBean's afterPropertiesSet or a custom init-method).

2022-03-06 21:22:29 640

空空如也

空空如也

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

TA关注的人

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