自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 多线程并发安全系列问题(七)

缓存层用Redis原子操作快速拦截99%的请求,保证高并发下的响应速度;分布式锁协调多服务实例,避免分布式环境的并发冲突;数据库用行锁+条件更新兜底,确保库存数据最终正确;限流和队列削峰保护系统不被流量冲垮。通过“快速拦截(缓存)→ 全局协调(分布式锁)→ 最终兜底(数据库)”的三层防护,既能扛住10万QPS的流量,又能绝对保证库存扣减的并发安全。问题32:如何处理“超卖”和“少卖”的边界情况?是否考虑过最终一致性方案(如消息队列重试)?处理“超卖”和“少卖”的核心是。

2025-08-06 16:25:22 666

原创 多线程并发安全系列问题(六)

胜在“自动优化”(低竞争时高效),胜在“底层轻量”(精细控制时更灵活);场景上:普通同步用(简单、安全),自定义同步工具或需要精细控制线程状态时,用(灵活、可控)。问题28:在项目中是否遇到过并发导致的线上故障(如数据不一致、死锁)?请描述问题现象、排查过程及解决方案。在实际项目中,并发导致的线上故障问题很常见,我遇到过一次典型的库存死锁和一次数据不一致并发故障的排查核心是“先定位线程状态,再还原竞争场景死锁靠线程快照看锁等待关系,解决靠统一资源竞争顺序;

2025-08-06 15:56:53 966

原创 多线程并发安全系列问题(五)

维度独占锁(acquire)共享锁(acquireShared)核心目标保证只有一个线程获取锁允许多个线程同时获取锁尝试方法返回值tryAcquire返回boolean(成功/失败)tryAcquireShared返回int(成功时带剩余名额)入队节点模式独占模式Node共享模式Node唤醒机制唤醒一个节点后,该节点独自竞争唤醒一个节点后,成功的节点会继续唤醒后续共享节点简单说:独占锁是“孤军奋战”,抢到锁就独自执行,唤醒后也只有自己尝试;

2025-08-06 15:41:54 773

原创 多线程并发安全系列问题(四)

CountDownLatch像“观众等演员谢幕”:观众(等待线程)只负责等,演员(任务线程)负责表演,表演完(倒计时到0)观众才散场,角色分明。CyclicBarrier像“队友等齐了再开团”:所有人都是队友(平等线程),必须等所有人到齐,一起行动,没有单纯的“等待者”。所以“多个线程等待所有任务完成”这种有明确“等待者”和“被等待任务”的场景,CountDownLatch更贴合需求,用起来更自然。问题18:在生产者-消费者模式中,如何用BlockingQueue和Condition实现高效同步?

2025-08-06 15:33:54 548

原创 多线程并发安全系列问题(三)

AtomicInteger的ABA问题是“值相同但中间被改过”导致的误判;解决办法是给值加版本号,同时校验值和版本号;AtomicStampedReference就是通过“值+版本号”的组合,确保CAS操作能识别中间的修改,从根本上避免ABA问题。简单说:AtomicInteger像“只认数字的门卫”,AtomicStampedReference像“既认数字又认通行证(版本号)的门卫”,后者更严格,能防止“换了身份又回来”的情况。

2025-08-06 15:25:40 859

原创 多线程并发安全系列问题(二)

synchronized像"傻瓜相机"——简单易用、自动处理,适合大多数基础场景,JVM还在不断优化它的性能。ReentrantLock像"单反相机"——功能强大、灵活可控,适合复杂场景(如需要尝试拿锁、公平锁、中断响应等),但需要手动操作,容易出错。实际开发中,简单场景优先用synchronized(减少代码量和出错风险),复杂需求再考虑ReentrantLock。问题8:synchronized的锁升级过程(偏向锁→轻量级锁→重量级锁)是怎样的?为什么需要锁升级?

2025-08-06 15:16:48 685

原创 说说DDD领域驱动设计!

领域驱动设计(DDD,Domain-Driven Design)是一种针对复杂业务系统的设计思想,核心是“让代码真正反映业务”。它解决了传统开发中“代码逻辑与业务脱节”“复杂业务难以维护”等问题,尤其适合电商、金融、医疗等业务规则复杂的系统。

2025-08-05 14:46:05 503

原创 为什么 Zookeeper 可以用来作为注册中心

ZooKeeper 能作为注册中心,主要是因为它的一些特性刚好能满足注册中心的需求,下面结合专业概念和大白话来解释:

2025-08-05 14:42:05 259

原创 epoll和poll的区别

维度pollepoll底层数据结构固定大小的数组(红黑树(存储监控的fd)+ 就绪链表事件查找效率O(n)(每次遍历全部fd)O(1)(直接从就绪链表获取)fd数量限制受系统限制(通常默认1024,可修改)无上限(仅受系统内存限制)触发方式仅水平触发(LT)支持水平触发(LT)和边缘触发(ET)内存拷贝每次调用需拷贝整个pollfd数组到内核仅在时拷贝,无拷贝(用户空间直接访问就绪链表)适用场景连接数少且活跃的场景高并发、大量连接(如百万级TCP连接)epoll是对poll的根本性改进,通过。

2025-08-05 14:35:37 642

原创 Mysql同步ES的四种方案

在Java开发中,MySQL同步Elasticsearch(ES)是常见的业务需求(如实现全文检索、复杂聚合分析等)。

2025-08-05 14:29:14 657

原创 有没有想过mysql的默认隔离级别为什么是RR?

底层依赖InnoDB的MVCC机制,让RR的“可重复读”特性高效实现(无额外锁开销);业务层面,RR避免了不可重复读导致的隐性bug,适配多数场景;额外通过Next-Key Lock缓解幻读,进一步提升一致性;最终在“太松(RC)”和“太严(串行化)”之间找到平衡,成为最适合多数用户的默认选择。

2025-08-05 14:26:22 647

原创 如何在 2G 大小的文件中找出高频 top100 的单词

将大文件拆分为可内存处理的小文件(局部统计)→ 合并所有局部统计结果(全局统计)→ 用堆筛选top100高频词。全程需处理单词完整性(避免拆分单词)、内存控制(防止OOM)和效率优化(减少IO与计算开销)。统一大小写:将所有单词转为小写(如“Hello”与“hello”视为同一单词)。去除特殊字符:过滤标点、数字等非字母字符(如“word.”→“word”,“don’t”→“dont”,可根据需求调整)。分词规则:以非字母字符(空格、标点、换行等)作为分隔符。

2025-08-05 14:22:49 677

原创 详细说说布隆过滤器吧

布隆过滤器是一种高效的概率型数据结构,通过二进制数组和多哈希函数实现快速的存在性判断,适合处理大数据量、对空间敏感且可容忍一定误判率的场景。在Java开发中,可通过Guava等库快速集成,典型应用包括缓存穿透防护、大数据去重等。使用时需根据业务场景合理设置参数(mk),平衡空间、速度和误判率。

2025-08-05 14:18:18 987

原创 SpringBoot自动装配机制的原理是什么?

自动装配并非“一刀切”,SpringBoot 保证用户自定义配置的优先级高于自动配置:自动配置类中的@Bean通常标注此注解,若用户手动定义了同名 Bean(如自定义DataSource),自动配置的 Bean 会被忽略。配置文件覆盖:用户在中配置的属性(如)会覆盖自动配置的默认值。排除自动配置类:通过可直接禁用指定的自动配置类。触发:主启动类的包含,开启自动装配。导入选择器导入。加载候选配置类通过 SPI 机制读取中的自动配置类。筛选配置类:根据用户排除规则和条件注解(),筛选出有效配置类。

2025-08-05 14:14:53 642

原创 你是怎么理解Springboot的约定优于配置这句话的?

核心思想:通过预设标准化约定减少重复配置,仅在必要时进行定制。具体体现:目录结构、配置文件、Starter 依赖、自动配置等。价值:降低开发门槛、提高效率、减少错误,让 Java 开发者更专注于业务逻辑而非框架配置。对于 Java 生态而言,这种理念不仅影响了 Spring Boot,还被其他框架(如 Quarkus、Micronaut)借鉴,成为现代 Java 开发的主流范式。

2025-08-05 14:04:37 899

原创 Binlog 和 Redo Log 是否缺一不可

在 InnoDB 存储引擎的生产环境中,Binlog 和 Redo Log 对于保障数据的一致性、持久性,以及支持主从复制和数据恢复等方面都起着不可或缺的作用。虽然在某些特殊场景或非 InnoDB 存储引擎下,它们的重要性可能会有所变化,但对于使用 Java 开发的对数据可靠性有较高要求的应用来说,二者协同工作是确保应用稳定、可靠运行的基础。

2025-08-05 13:57:53 539

原创 Binlog 刷盘机制

Binlog 刷盘机制是 MySQL 数据安全与性能的关键平衡点,参数的选择需结合业务场景。优化数据库交互性能,避免不必要的性能损耗;保障核心业务的数据一致性,防止因 Binlog 丢失导致的业务风险;快速排查主从复制、数据恢复相关的问题。在实际开发中,应根据业务对“数据安全性”和“性能”的容忍度,选择合适的刷盘策略,并通过代码优化(如批量操作)降低刷盘机制对性能的影响。

2025-08-05 13:55:39 393

原创 MySQL 如何通过 Redo Log 实现崩溃恢复

Redo Log 是 MySQL InnoDB 存储引擎实现数据持久性和崩溃恢复的重要机制。通过记录事务对数据页的修改操作,并在服务器崩溃后重新应用这些修改,Redo Log 确保了数据的一致性和完整性。对于 Java 应用开发者来说,理解 Redo Log 的工作原理和与 Java 应用的关联,有助于开发出更加健壮、高效且数据安全可靠的应用程序。

2025-08-05 13:53:54 820

原创 MySQL 中的 Buffer Pool、Undo Log、脏页

是内存缓存,提升读写性能,是 Java 应用与 MySQL 交互的“性能瓶颈”核心。Undo Log保障事务回滚和 MVCC,是 Java 事务一致性的底层支撑。脏页是内存与磁盘数据不一致的临时状态,其管理直接影响 MySQL 性能和数据安全性。理解这三个组件的工作机制,有助于 Java 开发者写出更高效的数据库操作代码(如优化事务粒度、避免长事务),并在出现性能问题时快速定位原因(如缓存命中率低、脏页刷盘频繁等)。

2025-08-05 13:52:17 877

原创 用户忘记了密码,系统为什么不能提供密码,而是要修改密码

技术上不可行:系统只存储不可逆的哈希值,没有原始密码;安全上必须做:避免明文存储风险,防止密码泄露和账号被盗。这一机制是现代信息系统安全的基础,Java等主流开发语言的框架(如Spring Security)也通过内置工具强制实现了这一规范,从技术层面杜绝了“明文存储密码”的可能性。

2025-08-05 13:48:45 640

原创 随手来几道SQL题

通过上述 SQL 语句,可以查询每个客户的最新订单总金额及其在客户所有订单总金额中的比例。这样可以清晰地了解每个客户的消费行为,特别是最新订单的金额及其在总消费中的占比,方便进行进一步的分析和决策。通过上述 SQL 语句,可以查询每个订单的总商品数量及其包含的商品列表(用逗号分隔)。这样可以清晰地了解每个订单的商品构成和数量,方便进行进一步的分析和决策。通过上述 SQL 语句,可以查询每个客户的姓名及其上一个订单的总金额。这样可以清晰地了解每个客户的最近消费情况,方便进行进一步的分析和决策。

2025-08-05 13:40:19 593

原创 从网络角度来看,用户从输入网址到网页显示,期间发生了什么?

从输入网址到网页显示,是“DNS解析→TCP连接→HTTP请求→服务器处理(Java核心)→响应返回→浏览器渲染”的完整流程。其中,Java通过Web服务器、框架、数据库交互等技术,承担了服务器端处理请求的核心职责,是实现动态网页和复杂业务逻辑的关键。

2025-08-04 15:13:59 398

原创 简单谈谈你对 CDN 的理解?

CDN通过分布式节点缓存静态资源,实现“就近访问”,是提升Web应用性能的关键基础设施。核心是将静态资源与动态服务分离,静态资源通过CDN分发,Java后端专注于API等动态内容。需通过配置、SDK集成实现资源上传、缓存刷新等功能,并处理跨域、版本控制等问题。合理利用CDN可显著降低Java服务器负载,提升应用的响应速度和可用性。理解CDN的工作原理,能帮助Java开发者更好地设计前后端架构,优化资源交付链路。

2025-08-04 15:11:37 407

原创 简单谈谈你对 DNS 的理解?

Java 9引入了// 自定义DNS解析器(示例:固定返回某个IP)@Override@Override// 自定义解析逻辑:例如将"www.example.com"解析为192.168.1.100// 其他域名使用默认解析@Override// 使用自定义DNS解析器// 注册自定义DNS提供器(Java 9+)// 此时解析www.example.com会返回192.168.1.100// 输出192.168.1.100。

2025-08-04 15:10:03 284

原创 JWT Token 能说说吗?

JWT是一种高效、安全的跨域身份认证方案,通过JSON格式传递声明信息,依赖数字签名保证安全性。在Java中,可通过jjwt等库快速实现JWT的生成与验证,广泛应用于前后端分离、微服务等场景。使用时需注意密钥安全、合理设置过期时间,并避免存储敏感信息,以最大化其优势并规避潜在风险。

2025-08-04 15:08:19 394

原创 Cookie、Session、Token 之间有什么区别?

应用层通信:Java通过内置API(如HttpClient)或第三方库(如OkHttp、Apache Commons Net)实现HTTP、FTP等应用层协议,屏蔽底层传输细节。身份识别机制Cookie:客户端存储,适合简单场景,安全性低。Session:服务器存储,安全性高,分布式需额外配置。Token:无状态,支持跨域和分布式,适合前后端分离、移动端场景。

2025-08-04 15:04:51 884

原创 OSI 七层模型是什么?

OSI七层模型:从底层到高层依次为物理层、数据链路层、网络层、传输层、会话层、表示层、应用层,每层专注于特定通信任务。Java与OSI的关联:Java主要操作传输层(TCP/UDP)和应用层(HTTP等协议),底层(物理层至网络层)由操作系统封装,会话层和表示层功能通过应用层工具类实现。理解OSI模型有助于Java开发者在网络编程中定位问题(例如:数据乱码可能是表示层编码问题,连接超时可能是传输层或网络层故障)。

2025-08-04 15:02:47 784

原创 TCP/IP 四层模型是什么?

TCP/IP 四层模型:从下到上为网络接口层(物理传输)、网际层(IP 路由)、传输层(TCP/UDP 端到端传输)、应用层(具体应用协议)。Java 与四层模型的关系底层(网络接口层、网际层):透明封装,依赖操作系统。传输层:通过Socket家族 API 直接操作 TCP/UDP。应用层:提供丰富的协议工具类,支持 HTTP、FTP 等常见协议。

2025-08-04 15:00:46 328

原创 ARP 和 RARP 分别是什么?有什么区别?

ARP:解决“已知IP求MAC”的问题,是局域网通信的基础,Java网络程序依赖其完成底层数据帧封装。RARP:解决“已知MAC求IP”的问题,主要用于早期无盘设备,现被DHCP替代。Java中的角色:不直接操作ARP/RARP,但其网络通信依赖ARP的正常工作;遇到局域网连接问题时,需结合操作系统工具排查ARP缓存或网络配置。理解二者的区别有助于定位Java程序在局域网环境中的通信故障,尤其是因IP-MAC映射异常导致的连接问题。

2025-08-04 14:58:41 957

原创 说说 TCP 拥塞控制的步骤?

TCP 拥塞控制通过“慢启动→拥塞避免→快重传→快恢复”四步,动态调整发送速率以避免网络拥塞。拥塞控制由操作系统实现,Java 仅能通过缓冲区配置、Nagle 算法开关等间接影响。合理设置可配合拥塞窗口充分利用带宽。对延迟敏感的场景可禁用 Nagle 算法,但需权衡网络拥塞风险。应用层需通过超时异常等感知拥塞,并采取重试、降速等策略。理解拥塞控制步骤有助于 Java 开发者优化网络程序,在可靠性和效率间取得平衡。

2025-08-04 14:56:59 386

原创 TCP 滑动窗口的作用是什么?

TCP 滑动窗口的核心作用是平衡发送方速率与接收方处理能力,通过动态调整可传输的数据量,既避免接收方过载,又最大化利用网络带宽。通过和优化缓冲区大小,间接提升滑动窗口效率。应用层缓冲区大小应与 TCP 报文段大小、窗口大小适配,减少数据拆分/合并开销。不同场景(大文件传输、实时通信)需调整不同的窗口相关参数,在吞吐量和延迟间取得平衡。滑动窗口是 TCP 高性能传输的基础,理解其原理有助于编写更高效的 Java 网络程序。

2025-08-04 14:55:31 914

原创 TCP 的 SACK 的引入是为了解决什么问题?

SACK 机制的核心价值是解决传统累积确认在报文失序场景下的冗余重传问题,通过精准标记已接收的失序报文,让发送方仅重传真正丢失的数据,从而提升 TCP 传输效率。确保操作系统启用 SACK(默认通常启用),避免传输效率损失。合理配置 Socket 缓冲区大小,配合 SACK 发挥最佳效果。在高并发、大数据传输场景中,SACK 是提升 Java 网络程序性能的重要底层保障(无需代码层面干预,只需依赖操作系统支持)。

2025-08-04 14:53:50 237

原创 TCP 有超时重传为什么还需要快速重传机制?

超时重传是“保底机制”:适用于所有丢包场景(尤其是连续丢包或网络彻底中断时,此时不会有重复ACK),通过等待超时确保最终重传。快速重传是“优化机制”:仅适用于“单报文丢失且后续报文正常到达”的场景,通过接收方的重复ACK快速响应,减少延迟。在Java网络编程中,开发者虽无法直接操作这两种机制,但理解其原理可帮助优化程序:例如通过合理设置缓冲区大小减少丢包,通过超时参数控制应用层对重传失败的响应,从而在可靠性和效率之间取得平衡。

2025-08-04 14:51:54 379

原创 TCP 中何时会出现 RST(reset)报文?

在Java中,RST报文通常由连接异常操作触发,如对已关闭连接的读写、强制关闭连接、缓冲区溢出等。RST的作用是快速终止异常连接,避免资源浪费,但可能导致数据丢失。开发中需通过合理的异常处理(如捕获)感知RST事件,并采取重连等补救措施,保障通信稳定性。

2025-08-04 14:50:05 391

原创 TCP 超时重传机制是为了解决什么问题?

TCP超时重传机制的核心作用是解决网络不可靠性导致的数据传输失败问题,而Java通过提供超时配置API(如SO_TIMEOUT、连接超时),让应用层能够感知和处理超时场景,配合底层TCP的自动重传,共同保障通信的可靠性。需要注意的是:Java不直接控制TCP重传的底层逻辑(如RTO计算、重传次数),这些由操作系统实现;开发者的核心工作是通过合理配置超时参数,确保应用在异常时能优雅处理(如重试、断线重连)。

2025-08-04 14:47:19 544

原创 除了四次挥手,还有什么方法断开连接?

四次挥手:TCP的正常关闭流程,通过FIN报文优雅终止连接强制关闭close()等方式发送RST报文,快速终止连接(可能丢失数据)半关闭允许单方向通信继续,最终仍需close()完成关闭实际开发中,应根据场景选择合适的方式:正常场景用四次挥手(或半关闭),异常场景用强制关闭。

2025-08-04 14:45:28 307

原创 为什么 TCP 挥手需要有 TIME_WAIT 状态?

在四次挥手的第四次交互中,主动关闭方(如客户端)会向被动关闭方(如服务器)发送最后一个 ACK 报文(确认服务器的 FIN 报文)。这个 ACK 报文可能因网络延迟或丢失,导致服务器收不到确认。若没有TIME_WAIT状态:客户端发送 ACK 后立即关闭连接,若 ACK 丢失,服务器会因未收到确认而持续重传 FIN 报文,并一直处于LAST_ACK状态,导致服务器资源(端口、内存)被长期占用,最终可能耗尽资源。有TIME_WAIT状态时:客户端在发送 ACK 后进入TIME_WAIT,等待 2MSL。

2025-08-01 10:46:40 579

原创 说说 TCP 的四次挥手?

TCP 四次挥手是关闭全双工连接的必要过程,通过四次交互分别关闭两个方向的数据流,确保双方数据完整传输。Java 中通过触发挥手过程,底层由操作系统管理状态转换(尤其是TIME_WAIT状态)。理解四次挥手有助于排查连接关闭相关问题(如端口占用、数据残留),是构建可靠网络应用的基础。

2025-08-01 10:45:13 915

原创 TCP 协议是如何保证可靠传输的?

TCP 协议通过确认与重传解决丢包问题,序列号与确认号解决乱序和重复问题,滑动窗口实现流量控制和高效传输,拥塞控制避免网络拥堵,校验和检测数据损坏,再配合三次握手/四次挥手管理连接,共同实现了可靠传输。在 Java 开发中,这些机制由底层 TCP 协议栈自动实现,开发者通过Socket等 API 即可直接利用其可靠性,无需关心细节。理解这些机制有助于排查网络问题(如延迟可能与拥塞控制有关,数据不完整可能是重传机制失效)。

2025-08-01 10:43:20 773

原创 什么是 SYN Flood 攻击?

SYN Flood 攻击利用 TCP 三次握手的漏洞,通过大量无效 SYN 报文耗尽服务器半连接队列资源,导致服务不可用。防御的核心是通过SYN Cookie 机制摆脱对队列的依赖,辅以队列扩容、重传优化和流量过滤。Java 开发者需合理配置backlog参数,使用高效网络框架,并依赖系统层防御措施,才能有效抵御此类攻击。

2025-08-01 10:28:10 605

空空如也

空空如也

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

TA关注的人

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