自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 计算机网络抓包实战

计算机网络作为一门计算机专业课,平时都是各种抽象的协议和各种发送接收,很难具体的去感受其含义,因此也是借助wireshark对发送的包进行一个分析。

2023-10-11 21:27:56 119

原创 正向代理与反向代理

正向代理时,由客户端发送对某一个目标服务器的请求时,代理服务器在中间将请求转发给目标服务器,目标服务器将结果返回给代理服务器,代理服务器再将结果返回给客户端。服务器根据客户端的请求,从其关系的一组或多组后端服务器上获取资源,然后再将这些资源返回给客户端,客户端只会得知代理服务器的IP地址,而不知道代理服务器后面的服务器集群的存在。**流程:**由客户端发起对代理服务器的请求,代理服务器在中间将请求转发给某一个服务器,服务器将结果返回给代理服务器,代理服务器再将结果返回给客户端。

2023-10-08 16:05:18 126

原创 每日力扣4

根据异或运算,相同的数异或会得到0,而任意一个数与0异或是本身,而且异或运算满足交换律,因此将所有数进行异或,最后剩下的数就是要找的数。很显然,由于 & 运算左右值可以进行交换而不改变结果,因此这也是一个对称矩阵,而异或运算对于左右值相同时结果为0。,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。所以对于 nums 数组,它的查询结果为 nums[i]^。的 xor 美丽值。

2023-10-04 15:35:39 133

原创 每日力扣3

在内部用Map维护一个缓存,然后用双向链表去维护一个缓存的值,每次存入一个元素就将该元素注册成链表中的节点,然后放入链表尾部。在调用put时先查看放入的key存不存在,如果存在就直接跟新节点,将节点移入尾部;如果不存在则判断元素个数有没有超过限制,超过了则删除链表头节点,根据该节点对应的key去Map中删除k-v对,然后插入新元素,包装成链表节点放入尾部。在LRU类中维护一个头节点和尾节点。建立链表的尾插入方法,删除头方法,删除指定节点方法,移动到尾部方法。链表结构:key,v,next,pre。

2023-10-03 19:51:43 75

原创 grpc之protobuf协议的一些实现

因为XML的封解包的过程,需要从文件中读出字符串,再转换为XML文档对象结构模型,之后再从XML文档对象结构模型中读取指定节点的字符串,最后再将这个字符串换成指定类型的变量。编码原理是基于一个事实,即在一般使用中,绝大部分用到的数都比较小,不至于用32位来存储,会形成很大浪费。由于负数的存储是用的补码,高位是1,会导致varint编码特别大,必定消耗5个字节。field_number表示消息中的第几个字段,不允许重复,推荐0~15,会节省字节。进行解码,获得数n,返回 (n>>>1)^-(n&1)

2023-09-28 20:46:58 69

原创 每日力扣2

A链表长度为a+b,B链表长度为c+b,因此让两个指针p1,p2分别从A、B的头开始遍历,当A到结尾时p1指向B的头,B到结尾时p2指向A的头,当他们第一次相等时,要么是都为null,此时说明他们没有节点,要么就都指向了同一个节点,此时p1走了a+b+c的路程,而p2指针也走了a+b+c的路程,肯定是第一个节点。l 是翻转的起始节点的前一个节点,r 是翻转结束节点的后一个节点,因此函数的参数是翻转起始节点,l1 ,终止节点是r1,翻转完后,l.next=r1 l1.next = r。,判断链表中是否有环。

2023-09-27 19:27:08 63

原创 Java线程池

如果当前运行的线程数已经等同于最大线程数了,新建线程将会使当前运行的线程超出最大线程数,那么当前任务会被拒绝,饱和策略会调用。如果向任务队列投放任务失败(任务队列已经满了),但是当前运行的线程数是小于最大线程数的,就新建一个线程来执行任务。如果当前同时运行的线程数量达到了最大线程数,且任务队列也已经满了,此时会对新提交的任务有一些处理策略。如果当前运行的线程数等于或大于核心线程数,但是小于最大线程数,那么就把该任务放入到任务队列里等待执行。

2023-09-27 09:55:38 134

原创 ReentrantLock原理

CountDownLatch 将state设置为count数,可以每次执行 countDown方法会用CAS让state减一,实质时释放掉一个锁,当state为0时会完全释放掉锁,让调用wait方法阻塞的线程进行执行。ReentrantLock中的Sync继承了AQS,实现了模板方法,通过FairSync继承Sync实现公平锁,通过NonfairSync继承Sync实现非公平锁。实现了Lock接口,是一个可重入且独占式的锁,与 synchronized 关键字类似,但更加灵活。但默认使用非公平锁。

2023-09-27 09:47:03 53

原创 JVM垃圾回收笔记

用于解决内存碎片问题。将内存分为大小相等的两块,每次只使用其中一块,当其中一块快使用完时就将还存活的对象复制到另一块,然后再把使用的空间进行清理。在老年代中,由于对象存活的几率比较高,而且很多对象可能是大对象,而且没有额外的空间对它进行分配担保,所以会用标记-清楚或标记-整理算法进行收集。是因为一次垃圾回收中,很多对象都是会被清除,留下的较少,因此标记它所进行修改的语句执行的会少一些。标记过程与标记-清理算法一样,但后续不是直接回收对象,而是让所有存活对象向一端移动,然后直接清理掉端边界以外的内存。

2023-09-27 09:44:43 50

原创 一个java调用gRPC的demo

将压缩包解压至某个路径即可。

2023-09-27 09:38:35 453

原创 记一次跨域解决

使用的继承WebMvcConfiguer类,重写addCorsMappings方法,在CorsRegistry中设置跨域属性。所以应该提前进行跨域验证,因此增加一个跨域验证的过滤器,过滤器由servlet提供在发生在拦截器之前。上述拦截器问题的原因:该请求在进行跨域验证前就被拦截了。

2023-09-26 15:50:07 66

原创 spring之cron表达式学习

只能用在日期和星期中,表示最后一天。在星期中表示星期六,日期中表示该月最后一天。表示每年每月每天每时每分的5秒开始,每过10秒执行一次(在5秒的时候不会执行)表示每年每月距离31号最近的一个工作日的0时0分0秒。表示每年每月每天每时每分的每个1,2,3秒。只能用在日期中,表示距离当天的最近的工作日。表示每年每月的最后一个星期五的0时0分0秒。表示每年每月的第三个星期五的0时0分0秒。表示每年每月的倒数第二天的0时0分0秒。表示每年每月每天每时每分的1到30秒。例子:0/5 * * * *?

2023-09-26 15:48:38 118

原创 SpringMVC源码解读之CORS跨域原理

在*处,会进行一次判断,如果此请求已经是跨域请求,或者是非简单请求的预检请求,都会执行该语句的内容。​ 在某个版本之前,跨域拦截的生成顺序是在所有拦截器的后面,此时就会存在配置好跨域,但由于设置了其他拦截器,比如做了一个登录拦截,拦截掉所有没有携带token的请求,此时就会导致跨域失败。由于登录拦截是在跨域拦截器的前面,跨域的预检无法通过登录拦截,走不到跨域拦截器中进行跨域请求头的设置,导致了后续跨域请求的失败。语句,在这行中,将会获取此次请求的拦截器链,并将该请求对应的处理器和拦截器链包装在一起。

2023-09-26 15:46:18 164

原创 rabbitmq初解

不过当消费速度大于生产速度且broker没有堆积的情况下,优先级没有太大意义。DLX,死信交换器。当一个消息在队列中变成死信后,它能被重新发送到另一个交换器中,这个交换器就是DLX,绑定DLX的队列就是死信队列。延迟队列指的是存储对应延迟消息,消息被发送后,并不想立刻让消费者拿到消息,而是等待特定时间后,消费者才能拿到这个消息进行消费。RabbitMQ在3.5.0后有优先级队列实现,优先级高的队列会被消费。在发布订阅模式中,多了一个Exchange角色,过程稍微进行变化了。消息可靠性,也就是消息不丢失。

2023-09-26 15:44:16 50

原创 每日力扣1

贡献法,就是对于一个元素,找到以它为最小值或者最大值的一个区间,对于这个区间内每个包含该元素的子区间,它都会有一个贡献,例如:一个元素i,左区间是L,右区间是R,是(L,R)的开区间。这里右边是大于等于,因为如果是大于的话,对于两个相同,并且挨着的元素,它会造成重复计算。与 LC907思路相同,都是算一个元素对于最后结果产生的共享,但不同的是此题是算最大元素和最小元素的差值,而对于一个元素,它作为区间最大值时产生的贡献将会是正的,因为是最大元素减最小元素,而作为区间最小值时产生的贡献则是负值。

2023-09-26 15:41:43 66

原创 TCP初解

是面向连接的、可靠的、基于字节流的传输层通信协议。面向连接:一定是一对一才能连接,不能像UDP那样一个主机同时向多个主机发送消息。可靠的:无论网络链路中出现了怎样的链路变化,TCP都可以保证一个报文一定能到达接收端。字节流:TCP报文是有序的,当前一个TCP报文没有收到的时候,即使它先收到了后面的TCP报文,那么也不能扔给应用层去处理,同时对重复的TCP报文自动丢弃。

2023-09-26 15:40:00 92

原创 redis的缓存设计

问题:会出现缓存和数据库中的数据不一致的现象。更新缓存前先加分布式锁,保证同一时间只有一个请求更新缓存,但对写入性能有影响在更新缓存后,给缓存加上一个较短的过期时间,即使出现缓存不一致的情况也能很快过期。先更库或先更缓存,在高并发的情况下都会导致缓存和数据库不一致。因此要采用删除缓存,读取数据时缓存没有数据再去数据库中读然后更新到缓存中。即旁路缓存策略。

2023-09-26 15:35:12 91

原创 Redis的持久化机制

在执行bgsave命令时会创建子进程,与父进程共享同一片内存数据,因为创建子进程时会复制父进程的页表,但页表指向的物理内存还是一个,若主线程执行写操作,则被修改的数据会复制一份副本然后bgsave子进程会把该副本写入RDB文件,过程中主进程仍然可以直接修改原来的数据。重写过程中,主进程仍然处理命令操作,此时主进程若修改已经存在的KV数据则会发生写时复制,为了解决这个问题redis设置了。在重写时,读取当前数据库中的所有键值对,然后将每一个键值对用一条命令记录到新AOF文件中,全部记录完后替换掉旧文件。

2023-09-26 15:33:47 46

原创 MySQL下的两阶段提交

MySQL会使用内部XA事务,内部XA事务由binlog作为协作者,存储引擎是参与者。当客户端在执行commit语句或者在自动提交的情况下,MySQL内部开启一个XA事务,分两阶段来完成XA事务的提交。事务提交后,redo log 和bin log 都需要刷新到磁盘中,但这两个刷盘是独立的逻辑,可能出现某一个成功,另一个失败的状况。所以,当redo log和bin log有一个日志持久化失败时就会导致主从环境数据不一致,这是因为。为了避免两份日志出现逻辑不一致的问题,使用两阶段提交来解决。

2023-09-26 15:32:43 194

原创 MySQL下的bin log

事务执行时,会先把日志写入到 binlog cache,事务提交后再把binlog cache写入到binlog文件中。MySQL给每个线程分配了一片内存用于缓存binlog。写入到page cache很快,但是执行fsync刷新到磁盘是很慢的,因此MySQL提供了sync_binlog参数控制刷新到磁盘的频率。在事务提交时,执行器把binlog cache里的完整事务写入到binlog文件,然后清空binlog cache。binlog文件记录了所有数据库表结构更改和编数据修改的日志。

2023-09-26 15:31:44 81

原创 InnoDB引擎下的redolog与undolog

开启事务后,InnoDB 层更新记录前,首先要记录相应的 undo log,如果是更新操作,需要把被更新的列的旧值记下来,也就是要生成一条 undo log,undo log 会写入 Buffer Pool 中的 Undo 页面。当系统崩溃时,虽然脏页数据没有持久化,但是 redo log 已经持久化,接着 MySQL 重启后,可以根据 redo log 的内容,将所有数据恢复到最新的状态。WAL 技术指的是, MySQL 的写操作并不是立刻写到磁盘上,而是先写日志,然后在合适的时间再写到磁盘上。

2023-09-26 15:25:49 77

原创 Mysql的多版本并发控制记录

ReadView字段:creator_trx_id、m_ids、min_trx_id、max_trx_id。mvcc的实现依赖于几个字段。

2023-09-26 15:22:54 67

原创 线程池初解

如果当前运行的线程数已经等同于最大线程数了,新建线程将会使当前运行的线程超出最大线程数,那么当前任务会被拒绝,饱和策略会调用。如果向任务队列投放任务失败(任务队列已经满了),但是当前运行的线程数是小于最大线程数的,就新建一个线程来执行任务。如果当前同时运行的线程数量达到了最大线程数,且任务队列也已经满了,此时会对新提交的任务有一些处理策略。如果当前运行的线程数等于或大于核心线程数,但是小于最大线程数,那么就把该任务放入到任务队列里等待执行。

2023-09-26 15:20:33 58

原创 HashMap源码解读

在jdk 7版本中出现的问题,由于在扩容时对链表使用的头插法,在多线程下可能会出现循环链表导致死循环。在jdk 8中修复了该问题。被挂起,B执行完毕后tab[i]已经存在内容,但A继续执行后就覆盖掉了B线程执行的内容,导致元素丢失。现在有线程A、B,A在执行put方法,且需要扩容,在执行resize方法时执行到了。语句,此时B线程执行get方法则会因为table没有内容而无法获取到真正的元素。如果A、B线程同时执行到此处,A在执行到。HashMap扩容的核心机制。可以看到主要是调用了。

2023-09-26 15:17:24 41

原创 基于AOP实现接口防重复设计

来实现无侵入式的功能增强。

2023-09-26 15:13:26 104

原创 关于在多重积分以及曲线曲面积分中对称性的应用

关于在多重积分以及曲线曲面积分中对称性的应用

2022-07-04 00:01:47 3792 1

原创 python复习笔记

不可变数据类型:数字、字符串、元组可变数据类型:列表、字典、集合元组中包含0个或1个元素的特殊语法规则 #空元组 # 一个元素,需要在元素后添加逗号集合的操作 函数。集合a、b,差集: 并集 : 交集: 对称差:优先级为 字符串常用函数 ## 字典的操作字典元素排序 ## 列表函数复习列表可以使用+操作符进行拼接 ## 函数和类的复习python 的函数参数的传递:类的复习: ## 文件操作,txt和excl等文件xlwt1.创建一个工作簿2.创建一个sheet对象,第二

2022-06-29 13:42:49 577

原创 C++算法题——平衡二叉树判断

平衡二叉树的判断

2022-06-24 00:04:40 745

原创 C++算法题--商品上架

商品货架可以看成一个栈,栈顶商品的生产日期最早,栈底商品的生产日期最近。上货时,需要进行倒货架,以保证生产日期较近的商品在较下的位置。用栈和队列作为周转,实现上述管理。输入:栈的初始大小,及栈内的商品生产日期,上货的商品数量,及每个商品的生产日期输出:栈的大小,及栈内的商品生产日期样例输入:520220101202203152022040920220529202206013202205152022041220220617样例输出:820220101202203152022040920220412202205

2022-06-23 08:49:35 1064

原创 数据结构之二分查找

数据结构之二分查找

2022-06-23 08:37:54 142

原创 数据结构之二叉搜索树

数据结构之二叉搜索树

2022-06-23 08:36:43 112

原创 数据结构排序算法之堆排序

数据结构排序算法之堆排序

2022-06-23 08:34:50 75

原创 数据结构排序算法之归并排序

数据结构排序算法之归并排序

2022-06-23 08:33:19 97

原创 数据结构排序算法之快速排序

数据结构排序算法之快速排序

2022-06-23 08:31:25 126

原创 数据结构排序算法之四大基础算法

数据结构基础排序

2022-06-23 08:28:42 111

原创 数据结构图之最小生成树--克鲁斯卡尔算法

数据结构图之最小生成树--克鲁斯卡尔算法

2022-06-22 21:04:54 160 1

原创 数据结构图之关键路径与拓扑排序的实现

数据结构图之关键路径与拓扑排序的实现

2022-06-22 21:01:01 151

原创 数据结构图之弗洛伊德算法

数据结构图之弗洛伊德算法

2022-06-22 20:58:12 130

原创 数据结构图算法之迪杰斯特拉最短路径算法

迪杰斯特拉算法

2022-06-22 20:54:57 402

原创 数据结构之图

数据结构图的最基础算法

2022-06-22 19:37:22 71

空空如也

空空如也

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

TA关注的人

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