自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Redis】数据结构&&持久化

Redis 常用的数据类型有五种:String、List、Hash、Set、Sorted Set(ZSet)。另外 Redis 还有 Bitmap、HyperLogLog、Geo、Stream 等扩展数据类型。底层实现会根据数据量和场景选择不同的数据结构,比如 SDS、ziplist/listpack、hashtable、quicklist、skiplist 等。Redis 的 ZSet 底层有两种结构,小数据量使用 listpack,大数据量使用 skiplist+dict。

2026-07-19 11:29:18 225

原创 【面经】HashMap和ConcurrentHashMap区别

HashMap和的最大区别在于线程安全性。是非线程安全的。这意味着在多线程环境下,如果多个线程同时修改HashMap,可能会导致数据不一致,甚至引发死循环等问题。是线程安全的,它通过细粒度的锁机制来保证并发安全。在多线程环境下,不同的线程可以同时对不同的部分进行修改而不会影响到其他线程。的线程安全是通过分段锁(Segment Locks)来实现的。具体来说,会将Map分为多个段,每个段有自己的锁,这样线程可以在不同的段上进行并发操作,不会发生阻塞。相比之下,HashMap。

2026-07-18 23:23:33 361

原创 【JUC】关于锁的那点事

乐观锁:持乐观态度,认为并发冲突的概率较低,在提交时检查数据是否被修改,若未被修改则提交,否则重试或抛出异常。例如 版本号法、CAS(compare and swap),即乐观锁实现应用场景:①适合读多写少(并发冲突的概率低),可以降低锁定带来的性能开销②系统能够容忍或者处理失败的情况,因为乐观锁可能会因为并发冲突导致执行失败。=》并发性能高悲观锁:持悲观态度,认为并发冲突的概率高,每次操作数据时都加锁,确保线程安全。

2026-07-18 23:19:34 232

原创 【Mysql】关于MVCC的那点事

MVCC在MySQL InnoDB中的实现主要是为了提高数据库并发性能,在并发读写数据库时,可以做到在读操作时不用阻塞写操作,写操作也不用阻塞读操作,提高了数据库并发读写的性能(做到即使有读写冲突时,也能做到不加锁,非阻塞并发读)。同时还可以解决脏读,幻读,不可重复读等事务隔离问题。多事务的并发进行一般会造成以下几个问题:脏读: A事务读取到了B事务未提交的内容,而B事务后面进行了回滚。

2026-07-18 10:37:27 258

原创 【Kafka】消息队列解决异步处理问题

在秒杀链路中,我使用 Redis Lua 脚本完成库存判断、一人一单判断和 Redis 库存预扣,从而将大量无效请求拦截在 Redis 层。获得购买资格后,服务提前生成全局唯一订单号,并将订单消息发送到 Kafka,接口直接返回订单号,实现异步下单和流量削峰。消费者监听秒杀订单 Topic,在数据库事务中完成订单创建和数据库库存扣减。消费成功后提交 offset,消费失败则抛出异常,由 DefaultErrorHandler 按照 FixedBackOff 策略进行重试。

2026-07-16 16:24:18 277

原创 【Java】HashMap的put过程

如果桶为空就直接插入;如果桶中已经有元素,就判断 key 是否相同,相同则覆盖 value,不同则处理哈希冲突。插入后,如果链表节点数量达到 8,并且数组容量至少为 64,就把链表转换成红黑树;扩容时容量通常翻倍,新索引只比旧索引多判断一位,所以元素的新位置要么还是原位置,要么是原位置加上旧容量。HashMap 会在 resize 时把节点迁移到新数组,之后 get 使用新容量重新计算下标,因此仍然能够找到原来的元素。新节点插入链表后,如果当前桶中的节点数量达到 8,会尝试把链表转换成红黑树。

2026-07-16 14:30:16 214

原创 【Redis】 Redis 是单线程还是多线程

Redis 6 引入的多线程主要优化前一部分;真正执行GETSETHSETINCR等命令、访问和修改核心数据结构,仍主要由主线程串行完成。

2026-07-15 19:02:14 145

原创 【Mysql】慢查询怎么优化

遇到慢 SQL,我首先会通过慢查询日志定位具体 SQL,重点关注执行时间、扫描行数和执行频率。然后使用 EXPLAIN 查看执行计划,分析是否存在全表扫描、扫描行数过多、索引选择不合理、回表。优化时会从索引和 SQL 两方面入手。索引方面要遵循联合索引的最左前缀原则,尽量将等值条件放在前面、范围条件放在后面;避免在索引列上使用函数、计算和不必要的隐式类型转换。对于 LIKE 查询,尽量使用右模糊匹配,并通过覆盖索引减少回表。

2026-07-15 16:49:47 240

原创 【面经】中科大自动化所(2026.7.13)

Service@Autowired@Service@AutowiredA → BB → A创建 A 时需要 B,创建 B 时又需要 A。

2026-07-15 13:48:24 332

原创 【Spring】循环依赖&&三级缓存

Spring循环依赖是指多个Bean在创建过程中互相等待的情况。Spring通过三级缓存机制解决这个问题:一级缓存存放完整的Bean,二级缓存存放早期引用,三级缓存存放Bean工厂。创建Bean时,先实例化并存入三级缓存,当遇到循环依赖时,通过工厂获取早期引用并存入二级缓存,从而避免死循环。最终完成属性注入和初始化后,Bean会从二级缓存移至一级缓存。这种机制确保了循环依赖能被正确处理,同时支持AOP代理等高级特性。

2026-07-15 10:14:40 376

原创 【JVM】编译&&解释

编译就是:在程序运行之前,先把源代码整体翻译成机器能直接执行的代码。hello . c → 编译器编译 → hello . exe生成的hello.exe就是机器码文件,操作系统可以直接运行。所以 C 语言通常叫编译型语言。源代码 → 机器码 → 直接运行解释就是:程序运行时,解释器一边读代码,一边翻译,一边执行。源代码 → 解释器逐行解释 → 执行它通常不会提前生成一个真正的机器码可执行文件。边翻译,边执行。

2026-06-07 15:30:00 366

原创 【JVM】JVM调优经验

内存区域大小↓影响对象分配和晋升↓影响 GC 频率和 GC 耗时↓影响接口响应时间和系统稳定性为什么 GC 频繁?为什么 Full GC?为什么对象提前进老年代?为什么停顿时间变长?调整哪个区域能缓解这个问题?这才是面试官真正想听的。

2026-06-07 15:15:00 237

原创 【JVM】JIT编译器

当某些方法或循环被频繁执行时,JVM 会把它们识别为热点代码,然后由 JIT 编译器将这些字节码编译成本地机器码,并缓存起来。JIT 的优势是可以提高热点代码的执行效率,并且可以根据运行时信息做动态优化,比如方法内联、循环优化、逃逸分析、常量折叠、死代码消除等。也就是说,JIT 不会一开始就把所有代码都编译成本地机器码,而是等程序运行起来后,观察哪些代码经常被执行。如果这个方法被调用了很多次,JVM 会认为它是热点代码,然后 JIT 会把它编译成本地机器码。编译出来的不是某个操作系统专用的机器码,而是。

2026-06-07 11:05:51 308

原创 【JVM】双亲委派

类加载器可以理解成:JVM 中负责把.class字节码文件加载到内存中的组件。程序运行时,JVM 不会一开始就把所有 class 文件都加载进来,而是用到哪个类,就由类加载器把哪个类加载进 JVM 内存。加载进去之后,JVM 才能创建对象、调用方法、执行代码。我们也可以自己写一个类加载器,继承。1. 加载指定路径下的 class 文件2. 实现类隔离3. 实现热部署4. 实现插件化5. 实现同一个类的多版本共存6. 破坏双亲委派。

2026-06-07 11:04:04 294

原创 【JVM】三色标记法

回收器解决思路关注哪个条件核心思想CMS增量更新黑色对象新增对白色对象的引用新增的引用要补标G1原始快照 SATB灰色对象删除对白色对象的引用删除前的引用也要保留CMS:你新增了引用,我记下来。G1:你删除了引用,我也记下来。

2026-06-07 11:03:25 320

原创 【JVM】垃圾回收器

你可以这样说:CMS 是一款以响应时间优先为目标的老年代垃圾回收器,它采用标记-清除算法,主要流程包括初始标记、并发标记、重新标记和并发清理。其中并发标记和并发清理可以和用户线程同时执行,因此减少了 STW 时间。但是 CMS 存在内存碎片和浮动垃圾问题,当老年代空间不足或发生并发模式失败时,会退化为 Serial Old,触发长时间 Full GC。

2026-06-06 20:00:00 359

原创 【JVM】根可达算法

GC Root 就是垃圾回收时的“起点对象”。JVM 在判断对象是否存活时,不是看这个对象有没有被别人引用,而是看:这个对象能不能从 GC Root 出发,通过引用链找到。如果A是 GC Root,那么 JVM 从A出发,可以找到B,再找到C。A、B、C 都是存活对象D -> EE -> D虽然D和E互相引用,但如果从任何 GC Root 都找不到它们,那么它们就是垃圾。这也解决了引用计数法无法解决的循环引用问题。

2026-06-06 20:00:00 314

原创 【JVM】垃圾回收

在 Java 中,垃圾对象指的是:程序后续不可能再使用到的对象。原来的new User()对象已经没有变量引用它了,后续无法再访问,它就可能成为垃圾。

2026-06-06 15:43:07 306

原创 【JVM】创建对象一定分配在堆里吗

面试可以这样说:Java 对象不一定一定分配在堆上。通常情况下,new 出来的对象会分配在堆中,优先在 Eden 区分配;为了提高多线程分配效率,JVM 会为每个线程在 Eden 区划分 TLAB,对象优先在线程自己的 TLAB 中分配。但如果 JVM 通过逃逸分析发现对象没有逃逸出当前方法,可能会进行栈上分配,甚至通过标量替换消除对象分配。因此,对象通常在堆中,但不是绝对一定在堆中。对象通常分配在堆里;如果未逃逸,可能栈上分配或被标量替换;如果进入堆分配,优先尝试在线程自己的 TLAB 中分配;

2026-06-06 15:42:34 391

原创 【JVM】JVM内存结构解析

JVM 运行时数据区分为五部分:堆、方法区、虚拟机栈、本地方法栈、程序计数器。堆和方法区是线程共享的。堆主要存放对象实例,是 GC 管理的主要区域;方法区主要存放类信息、常量、静态变量、运行时常量池和 JIT 编译后的代码。虚拟机栈、本地方法栈和程序计数器是线程私有的。虚拟机栈用于 Java 方法调用,每次方法调用都会创建一个栈帧,栈帧中保存局部变量表、操作数栈、动态链接和返回地址。本地方法栈服务于 native 方法。程序计数器记录当前线程正在执行的字节码指令地址,用于线程切换后恢复执行位置。

2026-06-06 15:41:43 287

原创 【计算机网络】CDN

CDN 就是:把图片、视频、CSS、JS 等静态资源缓存到离用户更近的服务器上,让用户就近获取,减少访问源服务器的次数,从而提高访问速度、降低服务器压力。

2026-06-04 09:47:38 793

原创 【计算机网络】网址到网页过程解析

你写的是:通过 ARP 协议在以太网中以广播的形式获得目标 MAC 地址。这句话在同一局域网内是对的。下一跳网关的 MAC 地址目标 IP 是服务器 IP目标 MAC 是网关 MAC因为服务器不在你的局域网里,ARP 广播不可能跨互联网广播到服务器那里。

2026-06-04 09:47:11 481

原创 【计算机网络】TCP粘包和拆包

常见方案有三种:定长、分隔符、长度字段/TLV。

2026-06-03 10:16:49 506

原创 【计算机网络】TCP三握四挥

第四次挥手时,客户端给服务端发 ACK。但是这个 ACK 可能丢失。如果 ACK 丢了,服务端收不到,就会以为自己的 FIN 没有被确认,于是服务端会重发 FIN。如果客户端此时已经直接关闭了,就无法再回复 ACK。所以客户端不能马上关闭,而是要等一段时间。如果在 TIME_WAIT 期间又收到了服务端重发的 FIN,客户端就再发一次 ACK。意思是:一个 TCP 报文在网络中最多能存活的时间。为什么是 2MSL?客户端 ACK 到服务端:最多 1MSL。

2026-06-03 10:16:18 457

原创 【计算机网络】TCP的可靠性保证

可以把理解成一句话:TCP 为了让数据“发得出去、收得到、不乱序、不丢失、不压垮对方、不压垮网络”,设计了一整套机制。你这段内容整体是对的,我帮你串起来解释。

2026-06-02 10:57:53 346

原创 【计算机网络】Http&&Https

HTTP/2 引入多路复用、二进制帧、头部压缩和服务器推送,可以在一个 TCP 连接上并发处理多个请求,提高传输效率。HTTP/3 基于 QUIC 协议,QUIC 基于 UDP 实现可靠传输,支持多路复用、0-RTT/1-RTT 建连、连接迁移,并一定程度解决了 TCP 队头阻塞问题。这比 HTTP/2 好,因为 HTTP/2 虽然应用层多路复用,但底层 TCP 一旦丢包,整个连接都会受影响。如果 TCP 传输过程中某个包丢了,后面的数据即使到了,也不能立刻交给应用层处理,必须等丢失的数据重传回来。

2026-06-02 10:56:49 294

原创 【Mysql】SQL优化最佳实践

你这份总结内容比较全,我帮你按面试/学习逻辑重新解释一遍。

2026-05-31 10:31:52 287

原创 【Mysql】执行计划的分析---Type本质

type本质看的是:MySQL 访问这张表的方式。where / join 条件决定 MySQL 能不能快速定位数据,所以主要影响 type。select 后面的字段决定 MySQL 要取哪些列,如果这些列都在索引里,MySQL 可能只扫描索引,所以有时也会影响 type。where 决定怎么找;select 决定找完以后取什么;type 反映最终怎么访问表。主键等值查询 -> const唯一索引 JOIN -> eq_ref普通索引等值查询 -> ref索引范围查询 -> range。

2026-05-31 10:30:33 246

原创 【Mysql】执行计划的分析

执行计划就是 MySQL 对 SQL 的执行方案说明。type:访问方式,判断性能好坏key:实际使用的索引rows:预计扫描行数Extra:额外执行信息type = ALLkey = NULLrows 很大key 有值rows 较小一句话总结:执行计划就是用来判断 SQL 有没有正确使用索引、扫描数据量大不大、有没有额外排序或临时表,从而帮助我们定位 SQL 性能问题。

2026-05-30 22:38:24 373

原创 【Mysql】执行SQL查询语句的过程

客户端发送 SQL↓连接器建立连接、校验身份、检查权限↓查询缓存,命中则直接返回↓解析器进行词法分析、语法分析,生成语法树↓预处理器检查表和字段是否存在,展开 select *↓优化器生成执行计划↓执行器根据执行计划调用存储引擎↓存储引擎读取数据↓执行器返回结果↓客户端收到结果连接器 → 查询缓存 → 解析器 → 预处理器 → 优化器 → 执行器 → 存储引擎。

2026-05-30 22:37:04 324

原创 【Mysql】日志(RedoLog、UndoLog、BinLog)

UndoLog:事务执行失败,我要回滚。RedoLog:事务提交成功,崩溃后我要恢复。BinLog:数据库发生变化,我要备份和同步。UndoLog 保证原子性。RedoLog 保证持久性。BinLog 用于复制和恢复。

2026-05-29 16:13:13 534

原创 【Mysql】索引失效的原因

对索引列使用函数对索引列进行表达式计算发生隐式类型转换phone 是 varcharlike 以开头where name like '%张'where name like '%张%'联合索引不符合最左前缀法则联合索引(a, b, c),必须从a开始使用。都不符合。OR 两边有一边没有索引如果age没索引,可能导致全表扫描。索引就像一本按规则排序的字典。只要查询条件破坏了这个排序规则,或者让 MySQL 不能直接按索引值查找,就可能导致索引失效。

2026-05-29 16:12:09 310

原创 【Mysql】事务

事务 = 一组 SQL 操作组成的逻辑执行单元原子性:要么都成功,要么都失败,靠 Undo Log持久性:提交后不丢,靠 Redo Log隔离性:并发事务互不干扰,靠 MVCC + 锁一致性:事务前后数据正确,是最终目标脏读:读到了别人未提交的数据不可重复读:同一行数据前后读取内容不同幻读:同一查询条件前后查询行数不同读未提交:啥问题都可能有读已提交:解决脏读可重复读:解决脏读、不可重复读,MySQL InnoDB 基本也避免幻读串行化:全部解决,但性能最低。

2026-05-28 12:48:22 546

原创 【Mysql】B+树索引

id 是主键age 是二级索引第一步:去 age 二级索引树中查 age = 1查到叶子节点,得到 id第二步:拿这个 id 去主键索引树中查找到整行记录,拿到 name回表因为它从二级索引树,又“回到”主键索引树查完整数据。二级索引树 → 主键值 → 主键索引树 → 整行数据回表会增加查询成本,所以能避免就尽量避免。age是二级索引。id 和 age而ageage + id所以不需要再去主键索引树查整行数据。覆盖索引查询需要的字段,已经被当前索引覆盖了所以不需要回表。

2026-05-28 12:47:41 491

原创 【Mysql】如何理解MVCC

同一行数据,InnoDB 会保留多个历史版本。读操作不一定读最新值,而是根据当前事务的 ReadView,选择一个“对我来说可见”的版本。

2026-05-27 10:13:52 414

原创 【Mysql】基础篇

DDL 全称是Data Definition Language,数据定义语言。它不是用来操作具体数据的,而是用来操作数据库、表、字段结构的。查看当前 MySQL 里有哪些数据库。CREATE DATABASE 数据库名;创建一个数据库。USE 数据库名;切换到某个数据库,后续操作都在这个库里进行。DROP DATABASE 数据库名;删除数据库,这个比较危险,会把库里的表和数据一起删掉。MySQL 基础├── DDL:操作数据库和表结构├── DML:操作表中的数据。

2026-05-27 10:13:11 581

原创 【JUC】线程安全

你可以这样记:线程安全问题的根源是:多个线程并发访问共享数据,并且至少有一个线程在修改数据。只读一般不会有线程安全问题。多个线程同时读一个变量通常没问题。一个线程写,另一个线程读多个线程同时写就可能有问题。i++线程不安全,是因为它不是一个原子操作,而是由“读取、计算、写回”多个步骤组成。线程切换可能发生在这些步骤之间,导致多个线程基于同一个旧值计算,最终出现数据丢失。一句话总结:线程安全的本质,就是保证共享数据在多线程并发访问时,依然满足原子性、可见性和有序性,从而让程序结果始终正确。

2026-05-26 19:56:57 600

原创 【JUC】Unsafe

Unsafe 是 Java 提供给 JDK 底层使用的“后门工具类”,它可以直接操作内存、对象字段、线程和 CPU 原子指令。Atomic 原子类的 CAS、AQS 的线程阻塞唤醒等,底层都和 Unsafe 有关系。但它绕过了 JVM 的安全机制,所以功能强大但非常危险。AQS 全称是Java JUC 包里用来实现锁和同步器的底层框架。Semaphore。

2026-05-26 19:56:27 620

原创 【论文解读】Ensembling LLM-Induced Decision Trees for Explainable and Robust Error Detection(二)

经过两层 GNN 后,要判断单元格D[i,j]h_t2^(2):第 2 行节点最终表示h_Email^(2):Email 列节点最终表示这个单元格在第 k 个 GNN 节点上走 true_child 的概率论文也是这样:经过两层传播后,拼接 tuple node 和 attribute node 的 embedding,再输入两层 MLP 输出分支概率,并用二元交叉熵训练。

2026-05-25 10:33:22 380

原创 【JUC】多线程的上下文切换

上下文切换是指 CPU 从一个线程转到另一个线程时,需要保存当前线程的上下文状态,恢复另一个线程的上下文状态,以便于下一次恢复执行该线程时能够正确地运行。在多线程编程中,上下文切换是一种常见的操作,上下文切换通常是指在一个CPU 上,由于多个线程共享 CPU时间片,当一个线程的时间片用完后,需要切换到另一个线程运行。此时需要保存当前线程的状态信息,包括程序计数器、寄存器、栈指针等,以便下次继续执行该线程时能够恢复到正确的执行状态。同时,需要将切换到的线程的状态信息恢复,以便于该线程能够正确运行。

2026-05-25 10:06:08 493

空空如也

空空如也

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

TA关注的人

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