自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Ubuntu 下 GitLab 磁盘爆满?LVM 在线扩容全指南

一看,根分区却只有 19GB,而且已经用了 14GB,剩余不到 4GB,自然撑不住 GitLab 的持续运行。最近遇到这样一个场景:在 Ubuntu 20.04 服务器上部署了 GitLab,运行一段时间后,GitLab 突然报错连接不上,日志里提示。,否则无法在虚拟机设置中直接扩展磁盘。可明明当初创建虚拟机时分配了 40GB 的硬盘,用。,完全在线操作,不影响服务(但建议在业务低峰期进行)。(把增量分配给根分区并 resize)(在虚拟机管理软件中增加磁盘容量)如果是上述情况,就需要在线扩容。

2026-07-31 20:07:17 113

原创 Python 并发编程深度解析:从 GIL 到 asyncio

场景Python 方案Java 对比IO 密集,同步代码同样有线程池,但线程是真并行IO 密集,新建项目`asyncio`虚拟线程(Java 21+),更易用CPU 密集直接用线程池即可,无 GIL 限制线程安全原子操作必须加锁共享内存天然支持(同一 JVM 进程内)核心要点:1. GIL 让 Python 的线程不能并行计算,但 IO 密集型任务不受影响。2. CPU 密集用 `multiprocessing`,IO 密集用 `threading` 或 `asyncio`。

2026-07-15 17:40:42 387

原创 虚拟机安装tailscale 出现连接不上问题解决

直接上图。

2026-07-15 11:21:50 656

原创 深入理解 Java 中的 wait、notify 和 notifyAll

在 Java 多线程编程中,线程间的协作与通信是一个核心话题。wait()notify()和是 Java 提供的用于线程间通信的最基础的机制,它们定义在Object类中,因此每个对象都天然具备了这些方法。/*** 标准模板 - 请牢记!*/// 等待方模板while (!condition) { // 1. while 循环// 2. 释放锁并等待// 3. 条件满足,执行业务// 通知方模板// 1. 改变条件// 2. 通知所有等待线程。

2026-06-02 08:56:08 539

原创 Matplotlib.pyplot 完全入门指南

Matplotlib 是 Python 数据可视化领域最基础、功能最强大的库之一,而则为其提供了一个类似 MATLAB 的绘图接口。无论你是做数据探索、算法调试,还是撰写论文、发布报告,掌握pyplot的用法都能让你高效地生成高质量图形。plot()函数接受可选的格式字符串或关键字参数来控制线条外观。常用的格式字符串如'r--'表示红色虚线,'go'表示绿色圆点标记(无线条)。plt.show()

2026-05-30 09:05:00 558

原创 Streamlit 用法详解(二)

括号里传入的就不是数字(列数),而是一个数值型列表,这个列表元素个数表示列数,元素的数字表示每列占比。按照前面学到的内容写页面的话,所有元素都是从上往下布局的。时,默认每列的宽度都是一样的。的默认值是1,也就是选中下标为 1 的那项。它接收一个字符串作为按钮文本,可以将点击结果赋值给一个变量。差不多,也是可以设置提示语、默认值、最大值、最小值以及步长。接收到的文件可以赋值给一个变量,这个变量接收到文件后可以通过。如果你想在页面中,增加一个logo图标,可以使用。单选按钮也可以使用一个变量来接收结果。

2026-05-28 16:00:33 541

原创 Streamlit 用法详解(一)

官方网站:https://streamlit.io/能在几分钟内把Python脚本变成可分享的网站。只需使用纯Python,无需前端经验。甚至,你只需要懂markdown,然后按照一定规则去做也能搞个网页出来。它还支持免费部署,感动到落泪。

2026-05-26 07:26:48 365

原创 PyCharm安装

安装完毕后,我们可以看到这里提示我是否需要从其他的开发工具中,导入配置信息,这里我们直接选择 skip Import 跳过。打开PyCharm进入欢迎页面后,可以设置一个主题颜色,语言等信息,可以根据自己的喜好,进行调整。勾选一下创建桌面快捷方式 PyCharm,然后点击 "下一步"。确认没问题之后,直接点击 创建。然后选择 "安装"。

2026-05-25 07:30:52 139

原创 Python安装文档

然后选择自定义安装 "Customize installation"。然后进入特性选择页面,什么都不用操作,直接点击 Next 下一步。进入安装页面,在这个页面中要选择Python的安装路径(开发类的软件尽量安装在一个没有中文,不带空格的目录下),这里呢,将软件安装在了 D盘下的 develop 这个目录下,在这个目录下创建一个文件夹Python,用来存放python的安装文件。选择好了安装路径之后,直接点击Install,就可以执行安装了。安装完毕直接点击 close。

2026-05-24 10:04:06 230

原创 Ollama-安装使用

手动部署最简单的方式就是使用Ollama,这是一个帮助你部署和运行大模型的工具。官网如下:https://ollama.com/注意:Ollama默认安装目录是C盘的用户目录,如果不希望安装在C盘的话(其实C盘如果足够大放C盘也没事),就不能直接双击安装了。需要通过命令行安装。在所在目录打开cmdOllamaSetup.exe /DIR=你要安装的目录位置2). 配置环境变量OK,安装完成后,还需要配置一个环境变量,更改Ollama下载和部署模型的位置。

2026-05-23 22:48:13 844

原创 RocketMQ Dledger 集群与 Raft 协议

在分布式系统的漫漫征途中,“共识” 问题始终是绕不开的核心命题。当消息中间件 RocketMQ 需要从主从架构走向真正的自动容灾时,Dledger 与 Raft 协议的组合方案应运而生。本文将深入剖析这一组合背后的设计哲学、技术原理及演进脉络RocketMQ Dledger 选用 Raft 协议,是分布式系统演进中一次典型的工程化选择。它不是理论上的唯一解,但却是最务实、最可控、生态最完备的路径。

2026-05-22 21:49:53 845

原创 SQL出现filesort 一定慢吗

filesort 出现在当无法使用索引排序时,MySQL 必须自己计算排序顺序,这个过程称为filesort。EXPLAIN的Extra字段会出现。常见触发场景:排序列不在索引中,或顺序/方向与索引不一致ORDER BY包含RAND()等函数跨表排序(如JOIN后对非驱动表的列排序)查询范围过大(如WHERE条件不能有效缩小索引前缀匹配)首选:用索引避免 filesort这是性能最佳的方案,彻底消除排序开销。次选:接受内存 filesort如果无法索引排序,但。

2026-05-21 22:11:54 896

原创 ConcurrentHashMap:computeIfAbsent 的陷阱

是 Java 并发编程中使用频率最高的数据结构之一,而computemerge等一批“复合操作”方法更是提升了并发场景下的编码效率。然而,这些看似便利的 API 背后,隐藏着不少容易踩坑的细节。禁止在映射 / 合并函数中修改同一个,尤其禁止递归调用compute*系列方法。确保函数快速且无副作用。耗时操作(网络 IO、磁盘读写)应移到函数外部,考虑使用Future或异步加载。避免依赖函数被调用的次数。的函数可能只调用一次,merge的函数可能重试多次——不要让这些次数影响业务正确性。优先使用处理延迟初始化。

2026-05-20 21:42:56 820

原创 UUID作为主键:深入剖析与最佳实践

在数据库设计中,主键的选择往往被低估,但它对系统性能、可扩展性和维护成本有着深远影响。自增 ID(AUTO_INCREMENT)长期占据主流地位,但随着分布式系统、微服务架构的普及,UUID(Universally Unique Identifier)逐渐成为另一热门选项。然而,UUID 并非银弹——它带来全局唯一性的同时,也引入了诸如页分裂、存储膨胀等棘手问题。场景推荐主键方案理由单机 MySQL,高写入 OLTP自增 bigint最高写入性能,最小存储开销分布式系统,无严格顺序要求。

2026-05-19 07:35:13 752

原创 全链路压测深潜:流量标与影子库,你真的用对了吗?

流量标,业内也叫“流量染色”。本质上,你给每个压测请求注入一个特殊的“身份ID”,就像给每只羊打上耳标一样。通常的做法是在HTTP请求的Header中加一个自定义字段,比如或。当这个标识在请求链路中被一路携带,每一个服务、每一个中间件都能认出它:“哦,这是个压测流量,别把它当真实业务处理。

2026-05-18 08:21:59 781

原创 RocketMQ 主从切换:你真的理解“短暂连不上”与数据丢失吗?

在分布式消息队列领域,高可用性是系统设计的核心目标之一。RocketMQ 通过主从架构实现服务的高可用保障,当主节点发生故障时,从节点能够接管服务,确保业务连续性。然而,主从切换过程中客户端连接状态的变化是一个关键问题,直接关系到业务的稳定性。以下将从 RocketMQ 的主从复制模式、切换机制、客户端行为等多个维度,深入剖析主从切换过程中客户端是否会出现短暂连接断开的问题。以下“主从切换”特指Broker 集群的角色切换,NameServer 仅作为注册中心,不参与选举,只负责路由变更通知。

2026-05-17 07:13:38 667

原创 RocketMq是CP模型还是AP模型

CAP 理论指出,分布式系统无法同时满足以下三个特性:- C(Consistency)一致性:所有节点在同一时刻看到的数据完全一致- A(Availability)可用性:每个请求都能得到非错误的响应,不保证是最新数据- P(Partition Tolerance)分区容错性:系统在遇到任意网络分区故障时仍能继续运行在实际生产环境中,网络分区是不可避免的,因此系统必须在 C 和 A 之间做出选择。CP模型:放弃部分可用性(A)来确保数据的强一致性(C)。

2026-05-16 10:28:44 811

原创 CMS垃圾回收

就是当灰色对象要删除指向白色对象的引用关系时, 就将这个要删除的引用记录下来, 在并发扫描结束之后, 再将这些记录过的引用关系中的灰色对象为根, 重新扫描一次,这样就能扫描到白色的对象,将白色对象直接标记为黑色(目的就是让这种对象在本轮gc清理中能存活下来,待下一轮gc的时候重新扫描,这个对象也有可能是浮动垃圾)就是当黑色对象插入新的指向白色对象的引用关系时, 就将这个新插入的引用记录下来, 等并发扫描结束之后, 再将这些记录过的引用关系中的黑色对象为根, 重新扫描一次。CMS 不会移动存活对象。

2026-05-14 15:30:46 882

原创 线程池队列详解

理解线程池队列的核心脉络:1. 队列类型决定了线程池的扩容行为:无界队列让 `maxPoolSize` 失效;直接传递队列让排队缓冲失效;有界队列是两者之间的平衡点。2. 队列的锁设计直接影响吞吐量:`LinkedBlockingQueue` 的双锁适合高并发读写分离的场景;`ArrayBlockingQueue` 的单锁在容量小时竞争不高且实现简单可靠;`SynchronousQueue` 的无锁 CAS 适合匹配快速的场景。

2026-05-13 14:53:19 705

原创 Java原子累加器深度解析(二)

技术应用位置说明CAS无锁原子更新,替代 synchronizedvolatile保证可见性,禁止指令重排自旋longAccumulate()的死循环忙等待替代阻塞退避/重哈希CAS 失败后换 Cell 而不是硬怼两阶段冲突collide标志连续两次 CAS 失败才扩容,减少不必要的数据迁移分段锁cells 数组将全局竞争分散到多个 Cell缓存行填充@Contended防止不同 Cell 的伪共享锁分离cellsBusy。

2026-05-12 07:01:36 673

原创 Java原子累加器深度解析(一)

在并发编程中,计数器是最常见的需求之一——统计 QPS、记录请求数、追踪错误次数。JDK 从 1.5 起提供了 `AtomicLong`,基于 CAS 实现无锁原子操作。但在高并发场景下,CAS 自旋失败率飙升,CPU 空转严重。于是 JDK 8 引入了 `LongAdder`,通过分散热点 的核心设计思想"空间换时间 + 分而治之",将单点竞争拆分为多 Cell 并发写入,吞吐量提升一个数量级。

2026-05-11 16:05:22 666

原创 Spring Statemachine详解底层和落地

/ 支付逻辑// 取消逻辑// 发货逻辑// 退款逻辑// …… 后面还有一堆类似的判断,一旦开始删改就会心生绝望这类「if-else 式」状态管理的弊端非常明显:状态与转换分散在不同业务 Service 中,持续膨胀的嵌套结构会让维护成本飙升;每次增加状态或修改转换规则都要在多个地方修改,极易遗漏导致奇怪 Bug;行为没有与状态强绑定,业务逻辑难以测试和复用。这就是要解决的刻骨铭心的痛点。

2026-05-10 17:57:19 538

原创 AQS 深度解析与扩展实践

AbstractQueuedSynchronizer(简称 AQS)是 Java 并发包(`java.util.concurrent`)的基石。`ReentrantLock`、`Semaphore`、`CountDownLatch`、`ReentrantReadWriteLock`、`ThreadPoolExecutor` 的 Worker——这些你每天都在用的并发工具,内部都有一个 AQS 子类在默默工作。

2026-05-09 08:16:58 604

原创 JDK 21 新特性深度解析

KEM(密钥封装机制)是一种在现代密码学中广泛使用的模式,尤其是在后量子密码学(PQC)中。它的场景是:发送方通过 KEM 生成一个对称密钥并"封装"(encapsulate)它,然后将封装后的密钥安全传送给接收方。接收方使用自己的私钥"解封"(decapsulate)得到相同的对称密钥。这个过程中,对称密钥本身从未在网络中明文传输。这比传统的"先用 RSA 加密对称密钥再传给对方"的方式更加安全(提供 CCA2 安全性),也是 NIST 后量子密码算法标准的底层机制。

2026-05-08 16:03:08 1219

原创 JDK17新特性

JDK8中,我们写的Java代码是在⼀个⼀个的package下⾯的,模块化在包之上增加了更⾼级别的聚合,它包括⼀组密切相关的包和资源以及⼀个新的模块描述符⽂件。简单点说,module是java中package包的上⼀层抽象。通过module,java可以更精确的分配对象的生效范围。比如,在JDK8的安装⽬录下,JDK预设的功能是以⼀个⼀个jar包的形式存在的,但是在JDK17的安装⽬录下,你就看不到那些jar包了,取而代之的,是⼀系列以jmod后缀的⽂件,这些就是⼀个⼀个的模块。

2026-05-08 11:30:46 379

原创 Zookeeper-Java客户端(二)

在单体的应用开发场景中涉及并发同步的时候,大家往往采用Synchronized(同步)或者其他同一个JVM内Lock机制来解决多线程间的同步问题。在分布式集群工作的开发场景中,就需要一种更加高级的锁机制来处理跨机器的进程之间的数据同步问题,这种跨机器的锁就是分布式锁。目前分布式锁,比较成熟、主流的方案:(1)基于数据库的分布式锁。这种方案使用数据库的事务和锁机制来实现分布式锁。虽然在某些场景下可以实现简单的分布式锁,但由于数据库操作的性能相对较低,并且可能面临锁表的风险,所以一般不是首选方案。

2026-05-07 10:11:31 570

原创 Zookeeper-Java客户端

ZooKeeper应用的开发主要通过Java客户端API去连接和操作ZooKeeper集群。可供选择的Java客户端API有:ZooKeeper官方的Java客户端API。第三方的Java客户端API,比如Curator。ZooKeeper官方的客户端API提供了基本的操作。例如,创建会话、创建节点、读取节点、更新数据、删除节点和检查节点是否存在等。

2026-05-06 14:04:10 544

原创 Zookeeper深入理解

ZooKeeper 是一个开源的分布式协调框架,是Apache Hadoop 的一个子项目,主要用来解决分布式集群中应用系统的一致性问题。Zookeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。ZooKeeper本质上是一个分布式的小文件存储系统(Zookeeper=文件系统+监听机制)。提供基于类似于文件系统的目录树方式的数据存储,并且可以对树中的节点进行有效管理,从而用来维护和监控存储的数据的状态变化。

2026-05-05 10:11:34 535

原创 深入理解Mybatis

MyBatis呢,是Java领域中的一款持久化框架,它的主要功能是,让我们能够轻松地在Java对象和数据库之间建立联系。通过这种联系,开发者可以很方便地存储、检索和操作数据。MyBatis与其他ORM框架相比,有一些独有的特点。首先,MyBatis强调对SQL的可控性。在使用的时候,可以直接编写SQL语句,提供更精准地优化查询。还可以充分利用数据库的特性,处理各种复杂的业务逻辑。在某些情况下,这能够带来更好的性能。

2026-05-04 15:21:26 503

原创 并发编程工具类

Java 并发编程远不止 `synchronized` 和 `volatile`。在 `java.util.concurrent` 包中,有一组专为多线程协作设计的工具类,它们各自解决不同场景下的线程同步问题。本文将围绕以下核心类展开:第一梯队(基础协作类):CountDownLatch、CyclicBarrier、Semaphore、Exchanger第二梯队(进阶工具类):Phaser、CompletableFuture、LockSupport。

2026-05-03 08:05:17 428

原创 深入解析Feign

在微服务架构中,服务间的远程调用是最基础也是最高频的操作。如果你用过 RestTemplate,一定体会过那种手动拼接 URL、设置请求头、解析响应体的繁琐。Feign 的出现,就是为了让 HTTP 调用像调用本地方法一样简单。这里有几个细节值得展开:name 属性:这是服务注册中心中的服务名,Feign 会通过它做服务发现和负载均衡。如果你不用服务发现,而是直接指定 URL,那 name 只是一个标识符。path 属性:定义接口级别的公共路径前缀,会被拼接到每个方法的路径前面。

2026-05-02 15:07:25 608

原创 深入理解线程池

第一,给每个业务线程池起一个有意义的名字。线程池名称是监控和告警的唯一标识,`pool-1`、`pool-2` 这种名字在出问题时完全无法定位。好的命名方式是 `业务域-用途-pool`,比如 `order-query-pool`、`payment-callback-pool`、`search-index-pool`。`DynamicTp` 提供了 `VariableLinkedBlockingQueue`,它的 `capacity` 字段是 `volatile` 的,支持运行时修改。

2026-05-02 08:29:23 502

原创 深入解析Java线程的进化与状态(二)

回顾,从进程到线程、从同步原语到内存模型、从设计模式到虚拟线程、从实战踩坑到范式革命,整个知识体系可以归纳为三个核心问题:1. 如何安全地共享数据?- 优先使用不可变对象- 其次使用线程封闭(ThreadLocal、局部变量)- 需要共享时,使用 `synchronized`、`ReentrantLock` 或原子类- 使用并发容器(`ConcurrentHashMap`、`BlockingQueue`)代替手动同步2. 如何高效地并行执行?

2026-05-01 11:03:27 478

原创 深入解析Java线程的进化与状态(一)

这很安全,但代价巨大。调用 `start()` 之后,原来的线程继续往下走,新线程会在某个时刻并行执行 `run()` 方法。因为 JDK 1.6 之后 `synchronized` 经过锁升级优化,性能已经和 `ReentrantLock` 接近,而且 JVM 对 `synchronized` 有更好的内建优化(如锁消除、锁粗化),代码也更简洁。比如 `count++` 操作(读-改-写三步),即使 `count` 是 `volatile` 的,多个线程同时执行 `count++` 仍然会产生竞态条件。

2026-05-01 09:25:34 507

原创 Netty功能和线程模型

Netty是由JBOSS提供的一个Java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。Netty 是一个基于NIO的客户、服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用。Netty相当简化和流线化了网络应用的编程开发过程,例如,TCP和UDP的socket服务开发。

2026-04-30 04:06:18 539

原创 NIO内核与机制

BIO:同步并阻塞,服务器实现一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,没处理完之前此线程不能做其他操作(如果是单线程的情况下,我传输的文件很大呢?),当然可以通过线程池机制改善。BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。System.out.println("等待连接。。");//阻塞方法System.out.println("有客户端连接了。。

2026-04-29 06:49:24 586

原创 Redis缓存架构与性能优化

第一种, 采用 LRU (Least Recently Use )策略,就是把 最近 不经常使用的 key 淘汰掉。第二种,采用 LFU (Least Frequently Use)策略,它在 LRU 算法上做了优化,增加了数据访问次数,从而确保淘汰的是非热点 key。第三种,随机策略,也就是是随机删除一些 key. allKeys volatile第四种,ttl 策略,从设置了过期时间的 key 里面,挑选出过期时间最近的 key 进行优先淘汰第五种,当内存不够的时候,直接报错,这是默认的策略。

2026-04-29 06:49:06 558

原创 JVM参数调优

首先熟悉一下通过java命令行查询jvm相关参数。

2026-04-28 03:42:16 463

原创 异步编程Future和CompleteFuture

直接继承Thread或者实现Runnable接口都可以创建线程,但是这两种方法都有一个问题就是:没有返回值,也就是不能获取执行完的结果。因此java1.5就提供了Callable接口来实现这一场景,而Future和FutureTask就可以和Callable接口配合起来使用。Runnable的缺陷:不能返回一个返回值不能抛出checked ExceptionCallable的call方法可以有返回值,可以声明抛出异常。和Callable配合的有一个Future类,通过。

2026-04-28 03:41:57 418

原创 MQ常见问题(2)

RocketMQ是通过消费者的响应机制来推进offset的,如果consumer从broker上获取了消息,正常处理之后,他要往broker返回⼀个响应,但是如果网络出现波动,consumer从broker上拿取到了消息,但是等到他向broker发响应时,发生网络波动,这个响应丢失了,那么就会造成消息的重复消费。对RocketMQ和Kafka来说,他们的消息积压能⼒本来就是很强的,因此,短时间的消息积压,是没有太多问题的。RocketMQ的处理⽅式,是会在发送消息时,给每条消息分配⼀个唯⼀的ID。

2026-04-27 03:39:14 534

TraeWork-CN-Setup-x64.exe

TraeWork_CN-Setup-x64.exe

2026-08-19

SQLserver2025-standard-安装驱动

SQLserver2025-standard-安装驱动

2026-08-19

ubuntu-24.04.1-wsl

可以直接在 Windows 里“开箱即用”的 Ubuntu 24.04 系统压缩包。

2026-08-09

ubuntu-22.04.5-wsl

可以直接在 Windows 里“开箱即用”的 Ubuntu 20.04 系统压缩包。

2026-08-09

ubuntu-20.04.6-wsl

可以直接在 Windows 里“开箱即用”的 Ubuntu 20.04 系统压缩包。

2026-08-09

tailscale虚拟机,终端机,PC网络互通

tailscale虚拟机,终端机,PC网络互通

2026-06-23

docker-compose-linux

docker-compose-linux-x86_64

2026-06-22

自动寻找skills的skills

自动寻找skills的skills

2026-06-12

nvm-noinstall

管理 node版本

2026-06-12

使用go语言,合并pdf

使用go语言,合并pdf

2026-05-29

代码review skills

代码review skills

2026-05-29

kun-tools是一款无需付费的多功能文档转换软件

kun-tools是一款无需付费的多功能文档转换软件

2026-04-28

迅雷10.1.17 zip 安装包

迅雷10.1.17 zip 安装包

2026-04-27

pdf -editor 编辑器

pdf -editor 编辑器

2026-04-27

navicat 15 安装包

navicat 15 安装包

2026-04-23

python安装包 3.13.8 amd64

python安装包 3.13.8 amd64

2026-04-23

空空如也

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

TA关注的人

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