自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Jackasher的博客

利用现代化方式为你解决编程疑惑

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

原创 为什么TCP连接是三次握手?不是四次两次?

TCP三次握手是建立可靠连接的核心机制,通过三次消息交换确保通信双方都能收发数据。第一次握手(SYN)客户端发起连接请求;第二次握手(SYN+ACK)服务器确认请求并回应;第三次握手(ACK)客户端确认服务器响应。三次握手解决了两次握手可能导致的资源浪费和连接混乱问题,确保了双方收发能力的相互确认。同时,三次握手能有效避免因网络延迟导致的已失效连接请求问题。连接建立后,双方进入ESTABLISHED状态,开始数据传输。

2025-08-17 21:07:21 1136

原创 HTTP 1.0, 2.0 和 3.0 有什么区别?

HTTP协议演进:从1.0到2.0的性能革命 HTTP协议是客户端与服务器通信的基础规范。HTTP/1.0采用"一问一答"的串行模式,每次请求都需建立/关闭TCP连接,效率低下。HTTP/1.1引入持久连接保持TCP连接复用,但仍存在队头阻塞问题。HTTP/2.0实现了重大突破:通过二进制分帧实现多路复用,允许同一连接上并行处理多个请求;采用头部压缩减少冗余;支持服务器主动推送资源;可设置请求优先级。这些改进使HTTP/2.0在性能上获得质的飞跃,大幅提升了网页加载速度和网络资源利用率。

2025-08-16 15:04:56 1071

原创 关于Redis的集群Rehash

Redis集群通过哈希槽在线迁移实现弹性伸缩,扩容时添加新节点并分配槽位,缩容前迁移槽位再移除节点,整个过程对应用透明。哈希标签(Hash Tag)利用{}强制相关Key落在同一槽位,解决多Key操作的原子性问题,但需注意避免数据倾斜。两种机制共同保障Redis集群的高可用与灵活性。

2025-08-12 10:53:56 351

原创 Spring中的监听器(Nacos Watch)

Spring事件机制基于观察者模式实现,通过解耦发布者与监听者来提升系统可扩展性。核心流程包括:1)定义继承ApplicationEvent的自定义事件类;2)通过实现ApplicationListener或@EventListener注解定义监听器;3)使用ApplicationEventPublisher发布事件;4)Spring容器自动匹配并调用相关监听器。该机制支持同步/异步处理,并能通过@TransactionalEventListener实现事务绑定,有效解决业务逻辑耦合问题,使系统更易维护和扩

2025-08-12 10:13:38 1086

原创 Redis如何实现一个分布式锁?

Redis分布式锁通过原子性操作、过期时间和唯一标识实现互斥访问共享资源。核心流程:1)使用SET命令(NX+EX参数)原子性获取锁并设置过期时间;2)业务逻辑执行完毕时,通过Lua脚本验证锁的唯一标识后删除。该方案解决了传统方案的三个问题:1)SETNX+EXPIRE非原子性导致的死锁;2)锁未及时释放引发的死锁;3)锁误删问题。通过给每个锁设置唯一值,确保只有锁持有者才能释放锁,同时过期时间机制避免了客户端崩溃导致的死锁问题。

2025-08-10 19:48:19 1058 5

原创 synchronized和RentrantLock用哪个?

现代Java版本中,synchronized和ReentrantLock性能已接近,甚至在某些场景下synchronized更优。JDK6后synchronized引入偏向锁、轻量级锁和自适应自旋等优化,使其性能大幅提升。synchronized适合简单同步需求,由JVM自动管理;ReentrantLock则提供更灵活的高级功能,如可中断锁、非阻塞获取锁等。选择时,优先考虑synchronized,仅在需要特定高级功能时使用ReentrantLock。

2025-08-09 21:10:26 800

原创 Redis为什么要引入多线程?

Redis系统设计演进体现了KISS与YAGNI原则的哲学智慧。早期单线程设计通过内存操作、无锁竞争和I/O多路复用达到极致性能,适应当时网络I/O和内存的瓶颈。随着硬件发展,网络带宽提升使I/O处理成为新瓶颈。Redis 6.0创新性引入多线程I/O,将网络处理与命令执行解耦:主线程保持串行执行确保一致性,I/O线程池并行处理网络通信。这种精准优化既提升了吞吐量,又保留了单线程的核心优势,展现了系统设计中资源瓶颈分析与核心优势守卫的平衡艺术。

2025-08-07 22:47:22 623

原创 Mysql进行操作时锁的具体行为

本文剖析了MySQL中的锁机制实现原理,通过三个典型场景展示了锁管理的底层运作过程。场景一演示了单事务更新时X锁和IX锁的获取流程;场景二展示了读写冲突时事务B如何进入等待队列;场景三重点解析了间隙锁(Gap Lock)如何防止幻读现象。文章深入揭示了锁管理器的核心数据结构,包括锁哈希表、资源标识符和锁对象等内存结构,它们共同构成了数据库的并发控制机制。这些内部结构通过精妙的组织方式,实现了对表锁、行锁和间隙锁的高效管理,确保事务隔离性的同时兼顾系统性能。

2025-08-06 11:43:12 961

原创 Mysql中的锁到底是什么?锁的是什么?

本文深入探讨了MySQL InnoDB的锁机制,将其形象地比作"中央交通指挥中心"。首先通过银行取款案例说明锁的必要性,指出InnoDB采用集中式锁管理而非对象自带锁的模式。接着详细解析了锁管理器的核心数据结构:LockResource(资源标识)、LockObject(锁对象)、全局锁哈希表(资源索引)和事务锁列表(事务持有锁记录)。最后阐述了不同SQL语句(INSERT、UPDATE、SELECT FOR UPDATE等)对应的具体锁策略,包括表级意向锁、行级排他锁和间隙锁等。文章通

2025-08-06 10:27:26 696

原创 Mysql的事务是什么?

MySQL事务通过四大特性(ACID)保障数据可靠性:原子性(Undo Log实现回滚)、一致性(依赖其他特性)、隔离性(MVCC和锁机制)和持久性(Redo Log确保提交后数据不丢失)。其中,MVCC通过Undo Log记录数据历史版本,结合Read View实现不同隔离级别下的并发控制,而InnoDB默认的"可重复读"级别通过间隙锁彻底解决幻读问题。事务机制如同保险系统,确保操作要么全成功要么全失败,在并发和崩溃场景下维护数据正确性。

2025-08-03 19:45:48 1058

原创 Mysql的MVCC是什么

MVCC(多版本并发控制)是一种数据库技术,通过保存数据的历史版本实现读写并发。核心思想是为每行数据维护多个版本,读操作访问旧版本,写操作创建新版本,避免读写阻塞。InnoDB通过隐藏列(事务ID、回滚指针)、Undo Log(存储历史版本)和Read View(决定事务可见性)实现MVCC。Read View根据事务ID判断数据版本可见性,确保事务读取一致性。MVCC解决了高并发下读写冲突问题,提升数据库性能。

2025-08-03 19:31:49 1335

原创 Mysql在页内是怎么查找数据的?

InnoDB的B+树叶子节点采用"页目录结构"实现高效查找。该结构将16KB数据页内的有序记录划分为若干小组(槽),每个槽存储指向组内最大记录的指针。查找时先在槽数组中进行二分查找定位目标组,再在组内(通常4-8条记录)进行顺序遍历。这种设计结合了二分查找的高效性和链表结构的插入便利性,既避免全页遍历的O(N)复杂度,又通过限制组大小确保局部遍历的高效性。页目录结构完美平衡了读写性能,是InnoDB实现快速记录检索的关键机制。

2025-08-02 16:46:12 1274

原创 MySQL 中 count(*)、count(1) 和 count(字段名) 有什么区别?

MyISAM 引擎COUNT(*)和COUNT(1)是最快的,因为它们直接读取元数据。COUNT(字段名)会慢一些,因为它需要实际扫描数据来检查 NULL 值。InnoDB 引擎COUNT(*)和COUNT(1)几乎没有性能差异,它们都会被优化器智能地处理,通常通过扫描最小的二级索引来完成,所以速度很快。COUNT(字段名)的性能取决于:该字段是否有索引:有索引会比没索引快很多。该字段是否允许 NULL 值:如果允许 NULL,即使有索引,也需要额外的逻辑来跳过 NULL 值。通常,

2025-08-02 16:43:11 822

原创 Mysql索引失效问题及其原因

MySQL 中使用索引不一定有效。索引好比字典的目录,用对了能快速找到字,用错了或者没必要用,反而可能拖慢速度。你需要“侦探工具”—— 命令,才能看清你的查询是不是真的用了索引,以及用得好不好。这里我们要抛开“索引万能”的误区。索引的本质是空间换时间,它通过额外的存储空间,牺牲一些写入性能(因为每次增删改查都要维护索引),来提高查询性能。但这个“提高”是有条件的。索引就像一把瑞士军刀,功能很多,但你不能指望它在所有场合都发挥作用。我们可以从几个角度来探讨:数据的特性(数据的“样貌”)查询的特性(查询的“意图

2025-07-31 22:55:59 878

原创 如果Mysql有多个聚簇索引会怎么样

摘要:允许多个聚簇索引会导致严重问题。最直接的实现是存储多份按不同键排序的完整数据副本,导致存储空间剧增和写入性能灾难(每次修改需同步所有副本)。更复杂的实现方案(如多维数据结构)则面临极高实现难度、不确定的查询性能和维护成本。现代数据库仅支持一个聚簇索引加多个非聚簇索引,正是为避免这些性能与一致性问题。

2025-07-29 21:46:29 320

原创 MySQL的存储引擎

MySQL存储引擎对比:InnoDB vs MyISAM MySQL存储引擎如同汽车发动机,不同引擎适用于不同场景。InnoDB与MyISAM是两种主要引擎: InnoDB特点: 支持事务、行级锁和外键 具备崩溃恢复能力 适合高并发、需数据安全的场景(如电商、金融) MyISAM特点: 查询速度快但不支持事务 仅支持表级锁 适合读多写少、对一致性要求低的场景(如日志统计) 核心区别: 事务支持:InnoDB支持ACID事务,MyISAM不支持 锁机制:InnoDB行级锁 vs MyISAM表级锁 外键约束:

2025-07-29 21:26:54 820

原创 最专业的ThreadLocal理解

ThreadLocal是Java中用于线程局部变量的类,但其使用不当可能导致内存泄漏。每个线程内部维护的ThreadLocalMap中,键是ThreadLocal的弱引用,而值是强引用。当外部强引用消失时,ThreadLocal实例会被回收,但对应的值仍被ThreadLocalMap强引用。若线程长期存活(如线程池),这些未被清理的值将导致内存泄漏。解决方法是在使用完ThreadLocal后调用remove()方法清除数据。此外,ThreadLocal不适用于异步编程场景,且会增加内存开销。

2025-07-27 17:25:03 1079

原创 Socket到底是什么(简单来说)

Socket抽象了网络通信的底层复杂性,让开发者只需专注于数据收发而无需处理传输细节。就像快递服务简化了包裹寄送流程一样,Socket隐藏了网络协议栈、硬件接口和操作系统内核的复杂机制,包括IP路由、TCP握手、数据分段重组等。它提供标准API(如socket()、bind()等),实现跨平台兼容性,使开发者能像操作文件一样简单地进行网络通信。这种抽象显著降低了开发门槛,提高了效率,使应用程序更易维护和移植。

2025-07-12 22:50:28 359

原创 Redisson是如何实现分布式锁的?

Redisson实现分布式锁的核心原理是通过Redis的Lua脚本保证操作的原子性,主要解决了传统Redis锁的死锁和误删问题。其核心改进包括:1)设置过期时间避免死锁;2)使用唯一客户端ID防止误删;3)采用哈希结构实现可重入锁,记录重入次数。Redisson提供了多种锁类型,包括可重入锁、公平锁、联锁、红锁等,其中红锁通过多节点机制提高可用性。所有加锁和解锁操作都通过Lua脚本执行,确保原子性,并通过哈希表维护客户端ID和重入次数,实现安全的分布式锁机制。

2025-07-09 15:30:15 443

原创 Mysql字段没有索引,通过where x = 3 for update是使用什么级别的锁

没有索引时使用FOR UPDATE会导致表级锁,严重影响并发性能。当查询条件字段无索引时,数据库无法精确定位要锁定的数据行,只能锁定整个表来防止幻读问题(新数据插入)。这就像图书馆管理员找不到"维修中"书籍的具体位置时,只能暂停所有借还操作。为提高数据库效率,建议为经常用于查询条件(特别是FOR UPDATE)的字段创建索引,这样数据库只需锁定相关行而非整个表。

2025-07-09 15:04:18 378

原创 Mysql组合索引的update在多种情况下的间隙锁的范围(简单来说)

间隙锁是InnoDB在可重复读隔离级别下防止幻读的机制,当UPDATE语句使用组合索引时,其锁定范围取决于WHERE条件对索引的利用方式。精确匹配存在记录时仅加行锁;部分匹配或范围查询会锁定相关索引区间及其间隙;未使用索引可能导致表级锁。组合索引的最左前缀原则影响锁定范围:完全匹配时锁定最小间隙,部分匹配则扩大锁定区间,范围查询覆盖整个查询区间。间隙锁本质是通过锁定"可能插入新记录的空隙"来确保事务期间数据一致性,其范围随查询条件精确度动态变化。

2025-07-09 14:53:57 702

原创 简单来说:Redis是怎么做Rehash的

Redis的rehash机制采用渐进式方式动态调整哈希表大小,以平衡性能与内存使用。当负载因子过高或过低时触发扩容或缩容,通过在后台维护新旧两个哈希表(ht[0]和ht[1]),将数据迁移分摊到每次客户端操作中,逐步完成数据转移。该机制既避免了服务阻塞,又优化了查找效率,但会暂时占用双倍内存。整个过程类似图书馆分批次搬书,确保服务始终可用,体现了Redis在高并发场景下的设计智慧。

2025-07-07 09:04:10 992

原创 简单来说:Redis集群扩容时,插槽切换时怎么处理新的读写

Redis分片集群在数据迁移过程中采用"智能门卫"机制,通过ASK和MOVED两种重定向确保数据访问不中断。当数据正在迁移时,源节点会检查Key是否存在:若存在则直接处理,否则通过ASK重定向临时指向目标节点。迁移完成后,源节点会返回MOVED重定向永久指向新节点,客户端更新本地缓存。这种机制既保证了迁移期间的数据可用性,又确保了最终一致性,类似于搬家时保留临时指引和最终地址更新的过程。

2025-07-06 01:34:54 2281

原创 简单来说:Redis的增量同步是怎么一回事

摘要:增量同步是一种高效的数据同步方式,Master仅发送比Slave更新的数据,而非全量数据。其核心在于Master的复制积压缓冲区(Replication Backlog)和复制偏移量(Replication Offset)。当Slave断线重连时,通过比对replid和offset判断是否可增量同步:若offset在Backlog范围内则发送增量数据,否则退化为全量同步。Backlog缓冲区大小配置至关重要,过小可能导致增量同步失败。该机制显著减少了全量同步次数,提高了数据复制效率。(150字)

2025-07-06 00:50:23 554

原创 Redis的主从节点怎么处理全量同步(简单来说)

Redis主从同步机制通过比对复制ID和偏移量来决定全量或增量同步。当从节点首次连接(发送SYNC命令)或主节点ID变更时,触发全量同步;若复制ID匹配但偏移量不在主节点的积压缓冲区范围内,也需全量同步;只有当复制ID一致且偏移量在缓冲区范围内,才进行增量同步。该机制确保数据一致性,同时优化网络传输效率。

2025-07-06 00:41:38 457

原创 Netty的Bytebuf流到底是什么?

**摘要:**应用程序无法直接获取TCP分片内容,因为TCP协议栈会将分片数据重组为连续字节流放入操作系统缓冲区。Netty等框架读取的是已组装的字节流而非原始TCP分段,因此需要应用层自行处理半包/粘包问题。网络分层中,传输层(TCP)负责分片重组,应用层只能获取完整数据流,需通过长度字段或分隔符等方式解析逻辑消息。(150字)

2025-07-04 11:31:54 954

原创 该怎么理解Java中的JUC(他们到底是干什么的?为什么需要?)

Java并发JUC摘要 Java并发包JUC(Java.util.concurrent)是处理多线程编程的核心工具库,主要解决并发编程中的共享资源访问问题。JUC的核心价值在于帮助开发者安全高效地实现程序并发能力。 并发(Concurrency)与并行(Parallelism)的区别:并发通过任务切换让多个任务看似同时进行,而并行则是真正同时执行。JUC主要解决并发问题。 并发编程的难点在于共享资源访问导致的数据不一致、死锁等问题。JUC通过协调与同步机制(如锁、原子类等)来解决这些问题,确保共享资源在多线

2025-05-30 20:50:23 1049

原创 迪杰斯特拉算法到底是怎么一回事?(简单易懂,由浅入深)

迪杰斯特拉算法是一种用于计算图中节点间最短路径的经典算法。其核心思想是通过"贪心策略"逐步扩展最短路径树:从起点出发,每次选择当前距离起点最近的未访问节点,更新其邻居的最短距离,并标记为已访问。算法要求边权重为非负值,确保每次选择的局部最优解能构成全局最优解。通过维护距离数组和访问集合,算法逐步确定起点到所有节点的最短路径。该算法广泛应用于路径规划、网络路由等领域,为导航软件等提供了理论基础。

2025-05-30 20:49:03 1025

原创 SpringMVC的数据绑定是如何受Content Type字段影响的

类型是用户在使用http请求时,表示http字段里面携带的请求体类型, SpringMVC通过显式绑定还是隐式绑定,告诉 Spring MVC 框架如何解析请求数据,以及如何将数据绑定到 Controller 方法的参数上。 🚀 让我们深入探讨 是如何影响这两种绑定方式的。对于显式绑定,我们使用注解 (例如 , , ) 来明确指示参数的绑定方式。 请求头会直接影响这些注解的解析行为。 和 : 注解用于将 HTTP 请求体的内容 绑定到 Controller 方法的参数上。 ** 请求头告诉 S

2025-04-08 16:01:50 1686

原创 SpringBoot利用docker一键在服务器部署(超简单)

然后一大堆配置, 程序员自然需要自动化,能不能把机械的行为自动化起来, 反正每次流程都是一样,当然了我们利用sh脚本也是可以的,把要下载的命令全部复制到文件里面,然后一起执行,不过mysql就比较麻烦了,因为需要获取临时密码,登录,修改访问权限。然后写docker compose文件,该文件会启动java项目,并且配置好数据库,包括账号密码,数据存储, 在。首先docker的下载和镜像源的配置我就不说了,自己摸索,(阿里云容器容器镜像控制台可以提供镜像加速网址)改成你自己的jar包,注意这里会使用。

2025-03-24 03:15:06 282

原创 操作系统不是本身就中断吗,为什么要说上锁会导致上下文切换造成性能开销呢

操作系统是中断驱动的,中断是操作系统高效运作的基础。锁是多线程编程中用来解决数据竞争问题的同步机制。锁 (特别是互斥锁) 在线程等待锁时,会导致线程进入阻塞睡眠状态,触发上下文切换。上下文切换本身是有开销的,频繁的上下文切换会降低程序性能。锁的性能开销不是锁本身的问题,而是等待锁和上下文切换带来的。合理使用锁,减少锁的竞争,避免不必要的上下文切换,是提高多线程程序性能的关键。操作系统中断和锁导致的上下文切换,是发生在不同层面的,服务于不同的目的。

2025-03-22 14:19:11 1695

原创 java并发包哪些是真正操作系统进行上锁了的

允许多个线程同时持有。需要注意的是, “真正上锁” 和 “逻辑上锁” 并不是一个严格的官方分类, 更多的是一种帮助我们理解锁的实现机制的角度。但是, 在读多写少的场景下, 读锁的性能通常比写锁好很多, 因为它可以允许多个线程并发读取, 减少了线程阻塞和上下文切换的开销。读锁允许多个线程同时持有, 用于读取共享资源, 写锁是互斥的, 只允许一个线程持有, 用于修改共享资源。更像是一个 “混合型” 的锁, 既有 “真正上锁” 的成分, 也有 “逻辑上锁” 的成分。

2025-03-22 13:53:31 682

原创 ThreadLocal内存泄露(你知道LocalMap在哪里吗?)

ThreadLocal为什么会内存泄漏,以及为什么要这么设计

2025-03-21 12:43:45 702

原创 对Spring,SpringMVC的一些理解

关于对Spring的一些理解

2024-09-26 02:24:08 1981

空空如也

空空如也

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

TA关注的人

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