自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 软件设计模式的分类

目的:关注对象的创建方式,提供更灵活的实例化方法,避免直接使用 new 关键字,提高代码的可扩展性和可维护性。常见创建型模式:1)工厂方法模式(Factory Method):定义一个创建对象的接口,由子类决定实例化哪一个具体类。2)抽象工厂模式(Abstract Factory):提供一个创建一系列相关对象的接口,而不指定具体类。3)单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。4)建造者模式(Builder):用于创建复杂对象,将对象的构造过程与表示分离。5)原型模

2025-04-04 20:44:04 431

原创 四种限流算法

滑动时间窗口是将计数器算法中的实际周期切分成多个小的时间窗口,分别在每个小的时间窗口中记录访问次数,然后根据时间将窗口往前滑动并删除过期的小时间窗口。,如果有客户端来请求,先需要从令牌桶中拿一个令牌,拿到令牌,才有资格访问系统,这时令牌桶中少一个令牌。在这个容量范围内的请求可以排队等待系统的处理,超过这个容量的请求,才会被抛弃。漏桶算法的原理就像它的名字一样,我们维持一个漏斗,它有恒定的流出速度,不管水流流入的速度有多快,,类似于消息中间件,不管消息的生产者请求量有多大,消息的处理能力取决于消费者。

2025-03-24 22:41:59 287

原创 分布式系统的CAP理论

⼀致性(Consistency): 所有节点访问同⼀份最新的数据副本可⽤性(Availability): ⾮故障的节点在合理的时间内返回合理的响应(不是错误或者超时的响应)。分区容错性(Partition tolerance): 分布式系统出现⽹络分区的时候,仍然能够对外提供服务。什么是网络分区?分布式系统中,多个节点之前的⽹络本来是连通的,但是因为某些故障(⽐如部分节点⽹络出了问题)某些节点之间不连通了,整个⽹络就分成了⼏块区域,这就叫⽹络分区。

2025-03-22 22:33:31 833

原创 一个表每天有 1000 万条数据插入,如何设计数据库表

对于每一条数据,如果有很大字段(如文本或二进制数据),可以考虑将其存储在单独的表中,避免影响主表的查询和索引效率。:如果数据结构有明确的模式(如 MySQL、PostgreSQL),可以通过适当的分表和索引设计来提高性能。:对经常查询的字段(如时间戳、地域、状态等)建立索引,但要避免过多的索引,以免影响插入性能。:如果可以接受短时间的延迟,可以采用异步写入或者将数据先写入缓存,再定时批量插入到数据库中。:对于不再频繁访问的数据,可以定期归档到不同的存储介质或表中,保持主表的高效性能。

2025-03-22 21:17:41 390

原创 数据库表每天新增数据量大该如何设计表(从业务角度来分析)

主要考察数据库的设计能力。路由策略。路由策略的选择,完全根据业务场景而定的。主要看业务场景又有哪些要求。参考资料《大厂面试题》每天新增100W数据,表应该怎么设计。

2025-03-22 21:05:57 378

原创 B+树的使用场景和优点

B+ 树相比 B 树的主要改进在于其所有数据存储在叶子节点,并且内部节点只存储索引,提高磁盘访问性能,使得其在数据库和文件系统等存储密集型应用中得到广泛应用。

2025-03-22 20:31:40 370

原创 项目中的RabbitMQ作用基础架构及与RocketMQ和Kafka的对比

RabbitMQ 适用于 低延迟、可靠性高的任务调度,如用户通知、订单处理。RocketMQ 适用于 高吞吐、事务消息,如金融支付、订单系统。Kafka 适用于 大数据、日志分析,如日志收集、流式计算。

2025-03-22 20:17:53 289

原创 太多TIME_WAIT的原因

在 C/S 模型(客户端-服务器)中,通常是客户端发起请求,服务器处理后再主动关闭连接。如果服务器短时间内处理大量短连接(如 HTTP/HTTPS、RPC),那么服务器会进入大量的 TIME-WAIT 状态。:HTTP 短连接模式(Connection: close),每次请求都重新建立和关闭 TCP 连接,导致服务器不断进入 TIME-WAIT。

2025-03-22 16:15:04 163

原创 CLOSE-WAIT和TIME-WAIT的区别

如果你的系统里有大量 CLOSE-WAIT,说明应用层代码没有正确关闭 socket。如果有大量 TIME-WAIT,说明短连接过多,可能需要优化连接复用策略。

2025-03-22 15:54:18 412

原创 TCP为什么可靠

奇校验‌:如果数据中“1”的个数已经是奇数,则校验位为0;如果“1”的个数是偶数,则校验位为1,以确保“1”的总数为奇数。偶校验‌:如果数据中“1”的个数已经是偶数,则校验位为0;如果“1”的个数是奇数,则校验位为1,以确保“1”的总数为偶数。校验和需一致才能传输成功,它有奇校验、偶校验等等。在TCP进行传输时,会进行确认应答和数据编号。会像探路一样发送小数据,防止阻塞。超过指定时间未收到应答,则重传。根据接收端能力进行发送。

2025-03-22 15:38:31 313

原创 TCP头部

源端口(Source Port):发送端的端口号目的端口(Destination Port): 接收端的端口号序列号(Sequence Number):用于可靠数据传输,表示数据流中的字节偏移量。确认号(Acknowledge Number):仅在ACK标志位有效时,表示期望接收的下一个序列号。URG标志位:表示紧急数据,紧急指针字段有效ACK标志位:置为1的时候表示确认号字段有效。PSH标志位:立即交付数据到应用层。SYN标志位:用于建立连接。FIN标志位:终止连接。

2025-03-21 00:42:55 274

原创 端口号,IP,MAC地址

MAC 地址用于局域网通信,IP 地址用于跨网段通信,端口号用于标识同一设备上的不同应用。

2025-03-20 23:17:22 358

原创 地址栏输入网址到页面显示过程中各层使用的协议

ARP(地址解析协议):如果目标IP地址不在本地缓存,设备会使用 ARP(IPv4)或 ND(IPv6)查找目标MAC地址。ICMP (互联网控制报文协议):可能用于网络诊断(如Ping)或处理某些错误情况(如路径MTU【最大传输单元】发现)。TCP(传输控制协议):HTTP/HTTPS依赖TCP进行可靠传输,建立三次握手连接(客户端和服务器之间)。UDP(用户数据报协议):DNS查询通常使用UDP进行快速解析(部分情况下可能使用TCP).

2025-03-20 13:25:15 217

原创 JVM垃圾回收底层机制之内存分配和回收机制

GC 期间虚拟机又发现 allocation1 无法存入 Survivor 空间,所以只好通过 分配担保机制 把新生代的对象提前转移到老年代中去,老年代上的空间足够存放 allocation1,所以不会出现 Full GC。如果对象在 Eden 出生并经过第一次 Minor GC 后仍然能够存活,并且能被 Survivor 容纳的话,将被移动到 Survivor 空间(s0 或者 s1)中,并将对象年龄设为 1(Eden 区->Survivor 区后对象的初始年龄变为 1)。

2025-03-08 17:59:04 296

原创 常见同步工具类的对比

但它与共享锁的概念有所不同。如果 state 减 1 后小于 0,表示当前并发访问的线程数量已达到 permits 的限制,该线程会被放入 AQS 的等待队列并阻塞,CountDownLatch 是一次性的,计数器的值只能在构造方法中初始化一次,之后没有任何机制再次对其设置值,当 CountDownLatch 使用完毕后,它不能再次被使用。它要做的事情是:让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。

2025-03-08 12:40:26 657

原创 为什么进程切换的开销比线程的大

各个进程之间可能拥有独立的内存空间,切换进程需要进行内存页的切换和可能的页面交换,把虚拟地址转换为物理地址需要查页表,查页表是很慢的过程,转换检测缓冲区TLB可以提高页表查询速度就是一个缓存,页表切换后TLB就会失效,命中率就会变低,切换过程就会慢,线程则不需要切换地址空间所以开销比较小。相比于使用TLB(转换检测缓冲区)优化页表查询,直接查询页表需要访问主存,速度较慢,因此CPU设计了TLB作为缓存,存储最近的地址映射,提高地址转换效率。

2025-03-04 13:31:54 154

原创 数字签名原理

就是说用私钥去签署一份文件,然后全世界的人都可以用公钥去解密数字签名,如果解密成功就可以认定这份的确是我签署的。数字签名:用私钥去加密,用公钥去解密。

2025-03-04 10:17:01 276

原创 DSA和RSA对比

DSA: 仅可用于数字签名RSA: 既可用于签名,也可用于加密/解密。如果需要数据加密,RSA是更好的选择。

2025-03-03 20:18:12 239

原创 RSA公钥加密算法

RSA是一种非对称加密算法,也称为公钥加密算法。

2025-03-03 19:55:22 165

原创 中间人攻击

未授权的攻击者与通讯的两端分别创建独立的联系,并交换其所收到的数据,使通讯的两端认为他们正在与对方直接对话。如SMB会话劫持、DNS欺骗等攻击都是典型的中间人攻击。简而言之,所谓的中间人攻击就是通过拦截正常的网络通信数据并进行数据篡改和嗅探,而通信的双方却毫不知情。这种攻击模式是通过各种技术手段将控制住的一台计算机虚拟放置在网络连接中的两台通信计算机之间。中间人攻击成为对网银、网游、网上交易等最有威胁并且最具破坏性的一种攻击方式,我们使用的WIFI无线网络也可能是犯罪份子开启的虚假WIFI热点。

2025-03-03 16:58:23 296

原创 调用一个函数在堆中的过程

当 printValue() 结束后,它的 栈帧销毁,main() 继续执行。

2025-03-03 16:41:18 152

原创 OSI七层模型 & TCP/IP五层模型

而IP协议依赖于链路层的协议,因此外层还会再包裹一层链路层的协议相关内容;Nginx它主要工作在七层的时候,这里的七指的是OSI七层模型里面的七。同样道理,TCP协议依赖于IP协议,因此外层还会再包裹IP协议相关内容;为了把用户名和密码传送给对方服务器,外层会包裹HTTP协议相关内容;HTTP协议依赖于TCP协议,因此外层还会再包裹TCP协议相关内容;链路层:mac地址就是属于链路层的一个协议存在。应用层:HTTP协议、FTP协议。传输层:TCP协议和UDP协议。再包裹物理层的协议相关内容。

2025-03-03 16:08:03 213

原创 MySQL的内存模型以及执行update的内存变化

执行 UPDATE 时,MySQL 会首先在内存的缓冲池中查找并修改数据页,修改内容会被记录在重做日志中,修改后的数据页变为脏页,最终在适当时机写回磁盘。这样,MySQL 的内存模型确保了操作的高效性,同时保证数据的持久性和一致性。

2025-02-25 16:46:23 292

原创 Mysql高度为3的b+树能存储多少数据

叶子节点存放的是我们的数据完整记录,非叶子节点存的是索引值以及页偏移量。因此InnoDB的所有数据文件(后缀为.ibd 的文件),它的大小始终都是16384B(16k)的整数倍。那么再假设我们的一行数据是1KB(就是我们的叶子节点),那么一个页就是16行数据(16KB除以1KB)。由于b+树的结构,那么我们认为高度为2的时候,我们存在一个根节点和若干个叶子节点。那么同理高度为3的时候,我们b+树的构成是根节点+一堆非叶子节点+索引页就是我们的索引键值+我们的指针,一般是我们的非叶子节点。

2025-02-25 16:17:39 263

原创 MySQL数据库页满了该如何调整底层B+树结构

虽然这个问题描述的是插入导致页面满,但如果后续有删除操作或者更新导致某个页面的数据量减少到一定程度(例如,低于一个阈值),B+ 树可能会进行合并。合并过程是将两个相邻的页面合并成一个页面,并将相应的中间键值从父页面中删除。如果父页面也因此变得过少,父页面也可能被合并,直到树达到平衡。在分裂过程中,如果需要创建新的页面,MySQL 会为新页面分配新的磁盘块,并将其加入 B+ 树中。新页面会插入到分裂后的父页面中,指向新的子页面。分裂是将一个满页分为两个页面,并将中间的键值提到父页面中。

2025-02-25 15:52:10 174

原创 MySQL的B+树根页不动,插入数据和页分裂原理

但是如果我们现在要写入的主键数据等于66,这个数据肯定会被写到page(36)中,但是有一个问题,主键66必须要写在主键53和78之间,这个时候就不得不伴随一次数据移动,先把主键等于78的数据向前移,腾出一个位置,然后再将主键等于66的数据,相当于"插空", 这就是数据的insert过程。注意根页和其他的page大小都是相同的,都是16KB, 因此这个根页总有被写满的时候,当这个根页被写满的时候,他会新分配一个page,这个page就不叫根页了,例如这里的page(31),然后把根页中的数据移动到31中。

2025-02-25 15:30:11 261

原创 间隙锁导致死锁

间隙锁是一种用于保护索引范围的锁。它不会锁定具体的记录,而是锁定,从而防止其他事务在该间隙中插入新的记录。具体来说,间隙锁的目标是保证,避免出现幻读。在 RR (Repeatable Read)隔离级别下,MySQL 默认启用了,这意味着如果一个事务读取某个范围的记录并持有锁时,其他事务不能在该范围内插入新的记录。间隙锁通常与和一起使用。

2025-02-25 14:59:06 213

原创 Spring中父子事务回滚情况

父事务回滚:父事务的回滚会导致所有子事务回滚,除非子事务使用 REQUIRES_NEW 传播行为。子事务回滚:子事务的回滚会影响父事务的回滚,具体影响取决于传播行为(如 REQUIRES_NEW 会忽略父事务的回滚)

2025-02-25 10:29:50 257

原创 Spring中的事务是如何实现的

并且修改数据库连接的autocommit属性为false,禁止此连接的自动提交,这是实现Spring事务非常重要的一步。如果出现了异常,并且这个异常是需要回滚的就会回滚事务,否则仍然提交事务。在这里调用test方法,并不会直接直接这个方法,而是会做一些别的操作,例如开启事务。例如调用上图中的a方法,就不会开启事务,因为没有加@Transactional注解。当调用代理对象的方法时,会先判断该方法上是否加了@Transactional注解。Spring中的事务是基于AOP来实现的,

2025-02-24 22:02:33 236

原创 如何设计一个单例模式下的自定义类加载器和父类加载器

首先,创建一个类加载器类,并确保它是单例的。我们可以通过延迟初始化和线程安全的方式来保证类加载器的唯一性。// 单例对象// 私有构造函数,防止外部实例化// 使用传入的父类加载器// 获取实例的静态方法// 自定义类加载实现@Override// 自定义加载逻辑// 使用父加载器加载,或者自行实现加载逻辑可以在 loadClass 方法中插入自定义的逻辑。例如,如果类是从某个特定的目录或网络位置加载,可以在这里实现相关的字节码读取和类转换操作。@Override。

2025-02-24 21:46:28 216

原创 设计模式之适配器模式

将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。

2025-02-24 21:13:12 183

原创 设计模式之策略模式

定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。

2025-02-24 20:55:21 364

原创 什么是拆包和粘包怎么解决?

拆包是把一个完整的数据包拆分成多个小包进行发送。而接收端无法一次性接收所有的小包,导致接收的数据不完整。粘包指的是把多个数据包粘合在一起,一次性发送。而接收端可能无法正确的去区分每个数据包,导致接收到数据出现错位或者混乱。接收端可以根据这个长度来解析数据包,来保证消息的完整性。最后,基于定长消息,发送端的消息长度是固定的,服务端按照固定长度来解析。参考资料【java常问面试题】这题你理解吗:什么是拆包和粘包怎么解决?

2025-02-23 17:50:06 250

原创 事务四大特性及其保证方式

保证方式:持久性由redolog来保证,MySQL修改数据的时候会在redolog中记录一份日志数据,就算数据没有保存成功,日志保存成功了,数据仍然不会丢失。一旦事务提交成功,事务中所有的数据操作都必须被持久化保存到数据库中,即使提交事务后,数据库崩溃,在数据库重启时,也必须保证通过某种机制恢复数据。事物的执行操作要么执行成功,要么执行失败。隔离性就是指在并发操作中,不同的事物之间应该隔离开来,每个并发事务不会相互的干扰。保证方式:一致性是由其他的三个特性来保证的,程序代码要保证业务上的一致性。

2025-02-23 14:06:50 292

原创 第三次握手的时候能携带信息么?

在TCP 三次握手过程中,第三次握手是可以携带数据的(客户端发送完 ACK 确认包之后就进入 ESTABLISHED 状态了),这一点在 RFC 793 文档中有提到。也就是说,一旦完成了前两次握手,TCP 协议允许数据在第三次握手时开始传输。如果第三次握手的 ACK 确认包丢失,但是客户端已经开始发送携带数据的包,那么服务端在收到这个携带数据的包时,如果该包中包含了 ACK 标记,服务端会将其视为有效的第三次握手确认。这样,连接就被认为是建立的,服务端会处理该数据包,并继续正常的数据传输流程。

2025-02-23 13:32:20 309

原创 工厂模式的概念及其优缺点

工厂模式是一种创建型设计模式,它提供了一种创建对象的方式,但不暴露对象创建的具体逻辑,而是通过工厂方法来返回对象。工厂模式常用于解决对象创建的复杂性,并使得代码具有更高的可维护性和扩展性。

2025-02-22 20:06:33 242

原创 volatile如何告知编译器变量值会变以及是否线程安全

这意味着编译器不能把变量的读取操作优化为使用缓存值,也不能把多次读取合并为一个读取。通过这种方式,volatile 确保每次对该变量的访问都是真实的、从内存中直接获取的。例如,通常编译器可能会将变量保存在寄存器中,重复使用这个寄存器中的值来加速访问。当你在声明一个变量时使用 volatile,它的作用是。,避免编译器做出“假设”或者缓存该变量的值。

2025-02-22 19:23:47 257

原创 使用Redis实现分布式限流

从原理上看,RRateLimiter在Redis上所存储的信息都必须在一个Redis实例上,所以它的限流QPS的上限就是Redis,单实例的上限,比如你Redis3实例就是1w QPS,你想用RRateLimiter3实现一个2w QPS的限流器,必然实现不了。单限流器肯定是实现不了的,我们可以拆分多个限流器,比如我搞10个限流器,名词用不一样的,然后每台机器随机使用一个限流器限流,实际的流量不就被分散到不同的限流器上了吗,总的限流上线不也就上来了。从RRateLimiter的实现原理你也看出了,

2025-02-22 17:20:45 236

原创 dts中如何减少延迟

指的是在将数据从一种格式转换为另一种格式的过程中所产生的额外资源消耗(时间、内存等)。

2025-02-22 16:58:00 379

原创 两盘均能烧1小时的蚊香, 如何判断出45分钟

步骤1:有蚊香A、B 先同时点燃A的两端以及B的一端, 当A烧完时, B烧了一半,时间过了30分钟。步骤2:此时在点燃B的另一端,当B烧完时,时间又过了15分钟,一共45分钟。

2025-02-22 15:15:13 108

空空如也

空空如也

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

TA关注的人

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