- 博客(60)
- 收藏
- 关注
原创 什么是序列化?是二进制吗?一文解答你的疑惑!
序列化(Serialization)是指的过程。简单来说,就是把内存中的对象变成可以保存到文件或通过网络发送的形式。
2025-05-19 23:15:11
624
原创 面试题之进程 PID 分配与回收算法:从理论到 Linux 内核实现
PID 分配与回收算法是操作系统的基础组件,不同实现方案在时间复杂度、空间复杂度和工程实现难度上各有优劣。现代操作系统(如 Linux)通过组合多种算法,在保证性能的同时兼顾了扩展性。
2025-05-19 10:36:27
1258
原创 一文读懂软链接硬链接
Linux 链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。情况下,命令产生硬链接。在 Linux 的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为。
2025-05-18 23:51:27
335
原创 超实用!Linux 查看日志命令大汇总,面试必备技能[特殊字符]
Linux 系统中查看日志的命令丰富多样,每个命令都有其独特的用途和优势。tail让我们快速获取最新日志,grep助力精准筛选关键信息,cat和sed在特定场景下也能发挥重要作用。同时,了解系统信息查看命令以及 java 项目相关命令,能让我们在运维工作中更加得心应手。希望这篇文章能帮助大家熟练掌握这些实用命令,提升 Linux 运维技能,高效解决各种问题💪。如果在使用过程中有任何疑问,欢迎在评论区留言交流~
2025-05-18 22:31:11
917
原创 Java 方法向 Redis 里操作字符串有什么需要注意的?
在 Java 开发中,Redis 作为高性能的键值存储数据库,常被用于缓存数据、处理高并发场景等。当我们使用 Java 方法向 Redis 中操作字符串类型数据时,有许多关键要点需要格外注意。这些要点不仅关系到代码的正确性和性能,还影响着整个系统的稳定性。接下来,我们就深入探讨一下具体需要关注的方面。。
2025-05-17 23:51:59
1212
原创 MySQL高效检索的十大优化策略与实战技巧
优化方式适用场景提升效果实施难度单列索引等值查询、排序字段★★★☆★★复合索引多条件组合查询★★★★★★★覆盖索引只查询索引列★★★★☆★★全文索引文本内容搜索★★★☆★★★分区表海量数据按条件筛选★★★★★★★★查询重写复杂分页、子查询★★★☆★★★★通过合理组合这些优化策略,可以使MySQL的检索性能得到显著提升。建议在实际应用中通过EXPLAIN分析和慢查询日志持续监控查询性能,针对性地进行优化调整。
2025-05-17 23:49:54
736
原创 云计算服务模式全景解读:IaaS、PaaS、SaaS分别都是什么?Saas和网页版应用的区别?
云计算的三层服务模式各有千秋,企业应根据自身实际情况灵活选择,也可以采用混合模式实现最优配置。随着云原生技术的发展,这三层服务正在不断融合创新,为企业数字化转型提供更多可能性。在传统IT时代,企业需要自建机房、采购服务器、部署系统,面临着巨大的前期投入和运维压力。完备的开发环境:内置各种开发工具和中间件。短期或波动需求:PaaS/SaaS更灵活。:如同租用毛坯厂房,企业自主装修布置。:如同入驻精装办公室,可直接开展业务。弹性计算资源:可按需获取的虚拟服务器。一站式服务:从开发到上线的全流程支持。
2025-05-16 21:07:29
708
原创 全面掌握JSR303校验:从入门到实战
String message() default "手机号格式不正确";Class<?Class<?@Override// 配合@NotNull使用// 使用自定义注解JSR303校验为Java开发者提供了一套优雅的参数校验解决方案。通过本文的学习,你应该已经掌握了从基础使用到高级特性的全部内容。在实际项目中,合理使用参数校验可以显著提高代码质量和系统安全性。
2025-05-15 23:58:20
681
原创 深入解析HTTP协议演进:从1.0到3.0的全面对比
HTTP协议的演进体现了互联网技术对性能和安全的不懈追求。理解这些版本的区别有助于:优化现有系统性能做出合理的技术选型设计更高效的网络应用随着HTTP/3的逐步普及,我们正进入一个更快速、更可靠的网络新时代。建议开发者现在就开始测试HTTP/3,为全面升级做好准备。
2025-05-15 23:26:28
823
原创 Spring Boot全局异常处理最佳实践:@RestControllerAdvice深度解析
通过实现全局异常处理可以:提高代码可维护性增强系统健壮性改善用户体验便于监控报警。
2025-05-15 01:19:21
705
原创 Spring Cloud Gateway 聚合 Swagger 文档:一站式API管理解决方案
在微服务架构中,随着服务数量的增加,API文档管理变得越来越复杂。每个微服务都有自己的Swagger文档,开发人员需要记住每个服务的文档地址,这无疑增加了开发难度。本文将介绍如何使用Spring Cloud Gateway聚合所有微服务的Swagger文档,实现一站式API文档管理。步骤:1、导包;2、配置两个Config3、启动gateway,选择服务访问通过Spring Cloud Gateway聚合Swagger文档,我们实现了:所有微服务API文档的统一管理。
2025-05-14 20:49:26
864
原创 深入理解 JVM:StackOverFlow、OOM 与 GC overhead limit exceeded 的本质剖析及 Stack 与 Heap 的差异
理解OOM和错误以及Stack与Heap的差异,是 Java 开发者解决内存问题的关键。合理设计方法调用:避免过深的递归调用和多层方法嵌套,确保方法调用逻辑清晰,及时释放不再使用的资源。优化对象管理:及时释放不再使用的对象引用,防止内存泄漏;合理控制对象的创建频率,避免一次性创建过多对象。监控与调优:利用 JVM 提供的监控工具(如jconsoleVisualVM等)实时监控内存使用情况,根据实际需求调整 JVM 参数(如堆内存大小、GC 策略等),优化内存性能。
2025-05-13 23:08:18
857
原创 10w 人疯抢 100 件商品?这套秒杀系统架构直接封神!带你拿下这道经典面试题!
"双 11 秒杀刚开场,服务器直接崩了!10 万用户集体投诉,公司损失超千万..."相信不少程序员都听过这样的惨痛案例。秒杀场景看似简单,实则暗藏重重陷阱:高并发流量如何扛住?库存超卖怎么解决?安全漏洞怎么防范?今天这篇文章,手把手教你设计一套能扛住 10w 并发的全链路秒杀系统架构,附带实战避坑指南!核心原则前端拦截、层层限流、异步处理、数据校验架构要点静态化 + CDN 减少 90% 流量Redis+Lua 保证库存扣减原子性MQ 异步削峰填谷K8s 动态伸缩应对流量波动。
2025-05-13 13:11:19
773
原创 救命!终于有人把 Nginx 主从架构 + VIP 切换讲得这么清楚了!
"线上 Nginx 主服务器突然挂了,用户疯狂投诉!运维小哥连夜抢修,我在旁边瑟瑟发抖..."相信不少程序员都经历过这种噩梦时刻。今天这篇文章,手把手教你用 VIP 虚拟 IP 实现 Nginx 主从架构的自动切换,从此告别手动改 DNS 的痛苦!核心价值:零感知切换、毫秒级响应、低成本关键技术:VIP 虚拟 IP + ARP 协议 + Keepalived实践建议配置完整监控报警体系定期进行故障演练关注云环境特殊配置还在等什么?赶紧把这套方案用起来,下次线上事故再也不用背锅了!
2025-05-13 02:03:36
643
原创 揭秘 Redis 高性能的四大核心秘籍,看完你就懂了!
旧的文章由于没有过多的文字解析,所以此处重构旧文章,采用更全面的解析,带你了解Redis!在当今数据驱动的时代,高性能数据库至关重要。Redis 凭借出色的性能,成为众多开发者的首选。但你是否深入思考过,Redis 为什么能如此之快?本文将带你一探究竟,深入剖析 Redis 性能好的四大关键因素,助你全面掌握 Redis 的核心优势。Redis 的高性能是基于内存存储、单线程架构、I/O 复用技术和高效数据结构等多方面因素共同作用的结果。
2025-05-13 00:24:32
564
原创 一文吃透!9 大经典数据结构之树型结构全解析,面试、工作都用得上!
在数据结构的世界里,树型结构凭借其独特的层级关系和高效的数据处理能力,成为程序员必须掌握的核心知识。无论是算法面试、日常开发,还是系统架构设计,树结构的身影无处不在。本文将带你深入拆解 9 种经典树型结构,用最通俗的语言、最实用的案例,帮你彻底吃透这些高频考点!树型结构看似复杂,但只要抓住每种结构的核心约束与应用场景,就能轻松驾驭!建议通过 LeetCode 专项训练(如二叉树、堆相关题目)巩固知识。精华速记平衡树保效率:AVL 树严格平衡,红黑树近似平衡B + 树赢在磁盘:数据库索引的不二之选。
2025-05-12 23:27:02
1889
原创 一文读懂!进程、线程、协程的区别与应用场景
在操作系统的世界里,进程、线程和协程是实现多任务处理的关键角色。对于编程学习者和开发者来说,理解它们之间的区别至关重要,这不仅能帮助我们编写出更高效、稳定的代码,还能深入理解操作系统的运行机制。本文将用通俗易懂的语言,结合实际例子,带你深入探索进程、线程、协程的奥秘。比较维度进程线程协程定义程序在操作系统中的一次执行过程,是系统进行资源分配和调度的基本单位进程内程序执行的最小单位,共享进程资源程序员在代码层面实现的轻量级 “微线程”,由用户手动控制调度资源占用。
2025-05-12 22:48:45
896
原创 必看!Linux 常用命令大揭秘
在开源的世界里,Linux 以其强大的稳定性、灵活性和高度的可定制性占据着重要地位。无论是系统运维人员、软件开发工程师还是热衷于探索技术的爱好者,熟练掌握 Linux 常用命令都是在 Linux 系统中高效工作的必备技能。本文将深入剖析一些日常使用频率极高的 Linux 命令,助力大家在 Linux 的天地中畅游无阻。Linux 的常用命令远不止上述这些,但掌握了这些基础且关键的命令,就如同拥有了一把开启 Linux 宝藏的钥匙。
2025-05-12 21:33:16
512
原创 JVM垃圾回收器详解
垃圾回收器的组合关系虽然很多,但是针对几个特定的版本,比较好的组合选择如下:JDK8及之前:ParNew + CMS(关注暂停时间)、Parallel Scavenge + Parallel Old (关注吞吐量)、 G1(JDK8之前不建议,较大堆并且关注暂停时间)JDK9之后:G1(默认)从JDK9之后,由于G1日趋成熟,JDK默认的垃圾回收器已经修改为G1,所以强烈建议在生产环境上使用G1。(此处)并行和并发概念补充并行(Parallel)
2024-07-10 11:56:02
1233
原创 JVM之垃圾回收算法详解
如果允许,那会继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果大于,将尝试进行一次 Minor GC,尽管这次 Minor GC 是有风险的;比如在新生代中,每次收集都会有大量对象死去,所以可以选择”标记-复制“算法,只需要付出少量对象的复制成本就可以完成每次垃圾收集。没有一个垃圾回收算法能兼顾上述三点评价标准,所以不同的垃圾回收算法它的侧重点是不同的,适用于不同的应用场景。:如果存活对象数量比较大,复制性能会变得很差【老年代存活的多,把那么多复制很费事,所以适合新生代】
2024-07-09 10:26:53
1705
原创 Redis持久化详解
Redis的持久化虽然可以保证数据安全,但也会带来很多额外的开销,因此持久化请遵循下列建议:用来做缓存的Redis实例尽量不要开启持久化功能【提高查询效率的不需要持久化,查询时再写一遍就好。对于安全性要求高的,比如分布式锁、库存、验订单的流水需要持久化(可以专门放在一个redis实例)】建议关闭RDB持久化功能,使用AOF持久化【可以混合。rdb会丢失数据】利用脚本定期在slave节点做RDB,实现数据备份设置合理的rewrite阈值,避免频繁的bgrewrite。
2024-07-03 21:35:37
992
原创 Redis主从集群下的脑裂现象
降级措施,将数据暂时写入本地缓存和磁盘中,在一段时间(等 master 恢复正常)后重新写入 master 来保证数据不丢失,也可以将数据写入 kafka 消息队列,等 master 恢复正常,再隔一段时间去消费 kafka 中的数据,让将数据重新写入 master。min-slaves-to-write x,主节点必须要有至少 x 个从节点连接,如果小于这个数,主节点会禁止写数据。主节点短暂失联,数据写入,重新选举的主节点上任后原主节点变从节点,第一次数据同步会清除从节点全部数据再进行。
2024-06-30 01:11:24
299
原创 ForkJoin
任务拆分:将一个大任务拆分为算法上相同的小任务,直至不能拆分可以直接求解。ForkJoin 使用 ForkJoinPool 来启动,是一个特殊的线程池,默认会创建。,避免和队列所属线程发生竞争,但是队列中只有一个任务时还是会发生竞争。难在如何拆分,后面JDK8就封装到stream的api了,并行流。,把每个任务的分解和合并交给不同的线程来完成,提升了运算效率。,适用于能够进行任务拆分的 CPU 密集型运算,用于。工作窃取算法允许空闲的线程从其它线程的双端队列中。Fork/Join:线程池的实现,体现是。
2024-06-29 23:08:08
402
原创 划分子网、子网掩码、地址范围、网络地址和广播地址。
一公司原来使用 192.168.1.0/24 这个标准网络,现在想为公司的每个部门(共六个)单独配置一个子网,其中最大的部门要分配 IPv4 地址的数量不超过 25 个。192.168.1.0 / 27 0~31(0 + 31) 192.168.1.31(31 + 0网络号 + 全1)网络号取3位,所以可以取000,001,010,011,100,101,110,111(8个子网)因为2,4,8所以划分为8个,用3位。网络地址:主机号全0。广播地址:主机号全1。
2024-06-28 21:40:04
629
原创 Vim编辑器基本使用技巧详解
wq保存在命令模式下按下:(英文冒号)就进入了底线命令模式。【光标变到最底下,就可以输入一些底线命令了】底线命令模式可以输入单个或多个字符的命令,可用的命令非常多。在底线命令模式中,基本的命令有(已经省略了冒号):q 退出程序w 保存文件按ESC键可随时退出底线命令模式。
2024-06-28 00:41:19
625
原创 go version go: cannot find GOROOT directory
自从1.8版本开始,GOROOT、GOPATH有默认路径,不再需要手动配置,并且启动GO Moudle模式也不需要将代码写在GOPATH下面。默认配置以我自己为例如下。或者import "github.com/q1mi/hello"然后再go mod tidy也可以。,所以我们需要换一个PROXY,这里推荐使用。
2024-06-27 01:29:43
641
原创 ReentrantReadWriteLock
0 and w == 0 表示有读锁(之前有的),【读锁不能升级】,直接返回 false====从这里也能看出不能升级,也就是原先有了读锁还要尝试tryAcquire获取写锁。读-读能共存、读-写不能共存、写-写不能共存【读锁保护数据的 read() 方法,写锁保护数据的 write() 方法】不同线程间读写是互斥的。// 记录读锁线程自己的持有读锁的数量(重入次数),因为 state 高16位记录的是全局范围内所有的读线程获取读锁的总量。可以去申请读锁,其他线程拿不到锁了,因为读写不共存。
2024-06-25 23:44:31
532
原创 JUC线程池最佳实践
使用 Spring 内部线程池ThreadPoolTaskExecutor 时,一定要手动自定义线程池,配置合理的参数,不然会出现生产问题(一个请求创建一个线程)【如网络请求、文件读写等,可以采用异步操作的方式来处理】是不同的业务使用不同的线程池【父子任务用同一个线程池容易死锁】,重心优化。(线程数太大,增加上下文切换消耗)。【美团的线程池参数动态配置】(设置线程池名称前缀,有业务含义)【 guava 的。值的传递功能,解决异步执行时上下文传递的问题】线程池是可以复用的,一定不要频繁创建线程池。
2024-06-24 22:36:21
346
原创 WebSocket
WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接, 并进行双向数据传输。HTTP是短连接(一次请求响应之后连接就断了,生命周期结束,需要重新建立连接)【请求响应模式】WebSocket是长连接(生命周期长)HTTP通信是单向的,基于请求响应模式WebSocket支持双向通信HTTP和WebSocket底层都是TCP连接。
2024-06-23 11:31:57
350
原创 LinkedBlockingQueue 原理
////注意,这种情况是take之前,队列已经满了,之前的所有生产者都等待呢。// 这里调用的是 notEmpty.signal() 而不是 notEmpty.signalAll() 是为了减少竞争。// 这里调用的是 notFull.signal() 而不是 notFull.signalAll() 是为了减少竞争。// 如果有多个线程进行出队, 第一个线程满足 c == capacity, 但后续线程 c < capacity。// 如果队列中只有一个空位时, 叫醒 put 线程。
2024-06-22 20:02:12
1031
原创 CyclicBarrier改善CountDownLatch循环重入
线程数要和基数保持一致,否则可能时两个线task1完成。第二次循环线程池还有线程的话可以去竞争。:线程调用 await 方法通知 CyclicBarrier 本线程已经到达屏障【基数不为0不会向下进行】谁调用await就阻塞谁,这个能阻塞多个,countdownlatch只能阻塞一个。应用:可以实现多线程中,某个任务在等待其他线程执行完毕以后触发。跟CountDOwnLatch非常类似,也是计时结束执行。parties:代表多少个线程到达屏障开始触发线程任务。(屏障),用来进行线程协作,
2024-06-20 22:27:22
992
原创 Semaphroe + CountDown
让当前线程等待,必须 down 完初始化的数字才可以被唤醒,否则进入无限等待【计时(数)器走完】:表示释放许可,acquire() 和 release() 方法之间的代码为同步代码。synchronized 可以起到锁的作用,但某个时间段内,只能有一个线程允许执行。:fair 表示公平性,如果设为 true,下次执行的线程会是等待最久的线程。// 4. 释放许可。,线程都是不断再运行的,肯定不能让某一个线程结束。
2024-06-20 20:53:34
815
原创 有HTTP为什么还要RPC
RPC80年代诞生,HTTP90年代诞生。所以准确来说是有RPC为什么还需要HTTP。跨微服务的远程调用(RPC,即emoteroduceall)RPC的实现方式有很多,比如:基于Http协议基于Dubbo协议[ 都只是定义了不同消息格式的而已。RPC本身并不是一个具体的协议,而是一种(grpc这种具体实现才是协议)。可以]RPC长连接复用且有连接池。-----OpenFeign 进行远程调用不需要开发人员手动构造 HTTP 请求对象、设置请求参数等RPC,因为它。
2024-06-20 15:28:03
460
原创 java线程池讲解!核心参数
当一个线程空闲超过一定的时间(keepAliveTime)时,线程池会判断:如果当前运行的线程数大于 corePoolSize,那么这个线程就被停掉,所以线程池的所有任务完成后最终会收缩到 corePoolSize 大小【当线程数达到 corePoolSize 并没有线程空闲,这时再加入任务,新加的任务会被加入workQueue 队列排队,直到有空闲的线程。----【会让核心线程一直运行】线程池中刚开始没有线程,当一个任务提交给线程池后,线程池会创建一个新线程来执行任务。线程池的线程都是非守护线程?
2024-06-13 23:30:11
963
原创 通过自定义线程池初步理解JAVA线程池
组件:线程池:存储可重用的线程(相当于消费者,不断获取任务来消费)阻塞队列:生产者消费者模式下平衡他们速度差异的组件 ----【1.生产者里线程迟迟没有提交任务,生产者需要等待,阻塞队列为等待位置。2.任务一下子特别多忙不过来,存入阻塞队列】main:生产者,源源不断产生线程实现:// 1. 任务队列// 2. 锁。保护阻塞队列,锁住头和尾,因为会有多个生产者消费者。// 3. 生产者条件变量。达到容量变量,阻塞,在条件变量等待// 4. 消费者条件变量。
2024-06-12 10:17:23
218
原创 RateLimiter实现令牌桶算法和漏桶算法
第三方工具类:disruptor(高性能的无阻塞的无锁队列)、guava--RateLimit(高性能的信号量的限流器)----【基础的类库】在 Guava 的中,并没有直接提供实现漏桶算法的方法,因为的设计就是基于令牌桶的。但是,如果我们想实现一个漏桶算法,我们需要自己编写代码来模拟水的流入和流出。
2024-06-11 21:56:41
783
原创 解析final原理
final 变量的赋值通过 putfield 指令来完成,在这条指令之后也会加入写屏障,保证在其它线程读到它的值时。//final保证不能读到两个值。第三种:【不加final都算是在堆中,Getstatic速度小于上面两种】5: bipush 20 // 将值直接放入栈中。之前的修改、赋值操作之后会同步到主内存中去(可见性)大于 short(短整型) 最大值会将其复制到类的。之前的指令不会重排序到后面去(有序性)其他线程访问 final 修饰的变量。,访问时从常量池获取。
2024-06-10 23:37:02
245
原创 什么是CAS?
CAS 并发原语体现在 Java 语言中就是 sun.misc.Unsafe 类的各个方法,调用 UnSafe 类中的 CAS 方法,JVM 会实现出 CAS 汇编指令,这是一种完全依赖于硬件的功能,实现了原子操作。,是由若干条指令组成 ,用于完成某个功能的一个过程,并且原语的执行必须是连续的,执行过程中不允许被中断,所以 CAS 是一条 CPU 的。执行的是循环操作,如果比较不成功一直在循环,最差的情况某个线程一直取到的值和预期值都不一样,就会无限循环导致饥饿,引出来 ABA 问题。
2024-06-09 18:08:23
1095
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人