- 博客(72)
- 收藏
- 关注
原创 常见且高频的 ZooKeeper 面试题
ZooKeeper 的 Leader 选举使用 FastLeaderElection 算法,节点启动或 Leader 宕机时进入 LOOKING 状态,通过比较事务 ID(zxid)和节点 ID(myid)来投票,数据最新的节点优先。ZooKeeper 的 Watch 机制是一种一次性触发的监听功能,客户端在读取节点数据或子节点列表时可以注册 Watch,当节点数据或子节点发生变化时,ZooKeeper 会异步通知客户端。临时节点保证会话断开时锁自动释放,顺序节点保证锁的公平性。B 删除后,C 获得锁。
2025-11-13 16:26:18
916
原创 gRPC vs RPC 高频面试题
它的原理是通过客户端 Stub 将方法调用序列化成数据,通过网络传输到服务端,服务端 Stub 反序列化后调用真实方法,并将结果序列化返回。gRPC 基于 HTTP/2,支持四种通信模式:Unary(一次请求一次响应)、Server Streaming(一次请求多次响应)、Client Streaming(多次请求一次响应)、Bidirectional Streaming(多次请求多次响应)。这样开发者就能像调用本地方法一样调用远程服务,而底层的序列化、网络传输、反序列化过程由 RPC 框架自动完成。
2025-11-11 15:53:16
593
原创 零拷贝2(Zero Copy)
零拷贝(Zero Copy)是一种数据传输优化技术减少数据在用户空间(User Space)和内核空间(Kernel Space)之间的拷贝次数,从而降低 CPU 开销,提高数据传输速度。在 Kafka、Nginx、Netty 等高性能系统中,零拷贝是提升吞吐量的关键技术之一。
2025-11-10 11:07:10
256
原创 数据结构篇常见面试题
这份清单基本覆盖了 数据结构篇的所有常见面试题,从数组、链表、栈队列、哈希表到树、图、堆、跳表都有涉及。最短路径算法(Dijkstra、Bellman-Ford、Floyd-Warshall)?树状数组(Fenwick Tree)的原理与应用?线段树(Segment Tree)的原理与应用?并查集(Union-Find)的原理与应用?数组的时间复杂度分析(查找、插入、删除)?三、栈(Stack)与队列(Queue)BST 的查找、插入、删除的时间复杂度?双端队列(Deque)的原理与应用?
2025-11-07 17:51:51
416
原创 Spring + Spring Boot + Spring Cloud 常见面试题
的常见面试题,从 IOC/AOP 到自动配置、微服务组件都有涉及。
2025-11-06 10:50:04
457
原创 Java 基础篇常见面试题
Java 作为一种面向对象的编程语言,有以下主要特点:结果:多态让同一个方法 在不同对象中有不同表现。3. 自动内存管理(Garbage Collection) 原理:Java 有 垃圾回收器(GC) 自动回收不再使用的对象,减少内存泄漏风险。 示例:结果:GC 会自动清理失去引用的对象。结果: 方法会启动一个新线程。面试官:Java 有哪些特点?回答:结果:JVM 是执行 Java 程序的核心。如果没有 JDK,就无法编译 文件。可以用一个简单的包
2025-11-06 10:45:41
294
原创 多线程常见面试题解析1
进程之间相互独立,拥有独立的内存空间,切换开销大,通信需要 IPC;线程共享进程的内存空间,切换开销小,通信可以直接访问共享变量。一个进程可以包含多个线程,线程崩溃可能导致整个进程崩溃,而进程崩溃不会影响其他进程。进程是操作系统资源分配的最小单位,线程是 CPU 调度的最小单位。
2025-11-04 17:32:11
346
原创 高频 Redis 面试题清单
这些是 Redis 面试的“入门必考”,不掌握基本没法往下聊。这些问题考察你对 Redis 在业务中的应用能力。如果你能答出来,面试官会觉得你很有实战经验。这些问题是资深开发或架构师岗位常问的。
2025-10-31 15:31:31
487
原创 Redis 持久化方式
Redis 提供两种持久化机制:触发条件fork 子进程写入 RDB 文件原子替换完成持久化命令追加文件增长AOF 重写恢复数据打开 (Redis 配置文件),找到 RDB 配置: 后台方式(推荐):执行后会在 目录生成 文件。打开 ,找到 AOF 配置:执行后会生成一个新的精简版 AOF 文件,替换旧文件。在 中:这样: 查看 AOF 文件 Redis 命令检查✅ 总结给新手的建议:
2025-10-31 15:27:43
912
原创 Redis 分布式锁如何保证同一时间只有一个客户端持有锁
其中 NX 保证只有当锁不存在时才能加锁,EX 设置过期时间防止死锁,value 用唯一标识防止误删。释放锁时用 Lua 脚本判断 value 是否匹配,保证只能删除自己加的锁。如果业务执行时间可能超过锁的过期时间,可以用自动续期机制避免锁提前释放。是原子操作,多个客户端同时加锁时,只有第一个执行的客户端能成功。来保证同一时间只有一个客户端持有锁。保证同一时间只有一个客户端持有锁。Redis 是单线程执行命令的,Redis 分布式锁通过。
2025-10-31 15:13:56
803
原创 增强版 Redis 分布式锁
线程 Thread-1 获取锁成功。线程 Thread-2 获取锁失败。线程 Thread-1 释放锁成功。线程 Thread-2 获取锁成功。线程 Thread-2 释放锁成功。
2025-10-31 09:48:42
414
原创 用 Redis 的 List 存储库存队列,并通过 LPOP 原子性出队来保证并发安全案例
user_1 -> 抢购成功,获得库存:stock_1。user_3 -> 抢购成功,获得库存:stock_2。user_5 -> 抢购成功,获得库存:stock_3。user_2 -> 抢购成功,获得库存:stock_4。user_4 -> 抢购成功,获得库存:stock_5。user_10 -> 抢购失败,库存已空。user_6 -> 抢购失败,库存已空。user_7 -> 抢购失败,库存已空。user_8 -> 抢购失败,库存已空。user_9 -> 抢购失败,库存已空。库存初始化完成,数量:5。
2025-10-31 09:43:27
197
原创 Redis 和 Memcached
如果你的缓存中有大量小对象,Memcached 的 Slab 机制可能会造成。,而 Redis 的灵活分配方式更适合多种数据大小混合的场景。
2025-10-31 09:38:37
401
原创 MySQL 中的 行锁(Record Lock) 和 间隙锁(Gap Lock)
假设有表:事务 A: InnoDB 会在 这一行的索引记录上加 Record Lock。 事务 B 如果执行:会被阻塞,直到事务 A 提交或回滚。假设表中有数据:事务 A: InnoDB 会对 和 加 Record Lock。 同时会对 之间的空隙加 Gap Lock。 事务 B 如果执行:会被阻塞,因为 的间隙被锁住。✅ 总结:如果a和b距离很大是否直接锁住a和b中间所有行是的,在 InnoDB 的 隔离级别下,执行会触发 Nex
2025-10-30 19:53:54
807
原创 MySQL 更新(UPDATE)语句的执行流程,包括 存储引擎内部的文件写入 和 主从复制的同步过程
9. 主库 Binlog → 从库 I/O 线程 → Relay Log。客户端 → MySQL Server → 解析器 → 优化器 → 执行器。1. 查找数据页(Buffer Pool / 数据文件)10. 从库 SQL 线程执行 Relay Log。6. Redo Log prepare → 刷盘。7. 写 Binlog Cache → 刷盘。5. 写 Redo Log Buffer。4. 写 Undo Log。假设 MySQL 开启了。它们配合使用才能实现。
2025-10-30 19:38:13
1027
原创 MySQL分库分表
这个问题在实际生产中非常常见,我给你详细分析一下,并告诉你如何设计才能避免后期扩容带来的灾难性迁移。:一个电商系统,用户表和订单表数据量都很大,且业务逻辑不同。:跨库不能直接用 JOIN,需要应用层聚合。,查询时就会错位,必须迁移老数据,非常痛苦。,否则后期加表会让你陷入全量数据迁移的噩梦。:订单表数据量非常大(上亿条),我们按。改了,老数据仍在原表,不需要迁移。如果你要做长期可扩展的水平拆分,拆到不同的数据库中。
2025-10-25 17:39:01
996
原创 MySQL 大表查询优化、超大分页处理、SQL 慢查询优化、主键选择
记录上一次的最大 ID,下次直接从该 ID 往后查,避免扫描前面的数据。在 offset 很大时会扫描大量数据,性能很差。:先用索引快速定位 ID,再回表取数据。
2025-10-25 17:10:47
470
1
原创 MySQL 的各种关联查询(JOIN)
返回左右表的所有记录(MySQL 不直接支持 FULL JOIN,需要用。:返回左表的所有记录,即使右表没有匹配,也会显示(右表字段为 NULL)。:返回右表的所有记录,即使左表没有匹配,也会显示(左表字段为 NULL)。:每个员工和每个部门都会组合一次(4×3=12 行)。:返回左右表的所有组合(没有 ON 条件)。:同一张表自己关联自己,常用于层级结构查询。
2025-10-25 16:40:02
307
原创 数据库在什么情况下会发生数据库死锁
死锁(Deadlock) 是指两个或多个事务在执行过程中,互相持有对方需要的锁,并且都在等待对方释放锁,从而导致它们都无法继续执行。简单来说:死锁通常满足以下四个条件(同时成立才会发生):场景 2:间隙锁(Gap Lock)导致死锁在 REPEATABLE READ 隔离级别下,InnoDB 会使用 间隙锁 来防止幻读。如果两个事务在范围查询时加了间隙锁,并且互相等待对方释放,就可能死锁。两个事务锁定的范围有重叠,可能导致互相等待。当更新或删除带有外键约束的表时,InnoDB 会对父表和子
2025-10-25 16:26:22
887
原创 mysql的存储引擎
树的高度越低,查询时需要的磁盘页访问次数越少,性能越高。只需在聚簇索引的 B+ 树中找到叶子节点即可,MySQL(InnoDB)选择。,每个表可以单独指定存储引擎。在 MySQL 中,
2025-10-25 16:03:00
960
原创 数据库事务的四大特性(ACID)
事务B读到的值是事务A的临时修改,最终并不会存在于数据库中,这就是。,因为在两次查询之间,另一个事务插入或删除了满足条件的新数据。,而这些数据可能会被回滚,从而导致读到的数据是无效的。,因为在两次读取之间,另一个事务修改并提交了该数据。事务A第二次查询时,出现了“幻影”行,这就是。,这些操作要么全部成功,要么全部失败回滚。事务A两次读取同一行数据,结果不同,这就是。如果第二条更新失败,第一条也必须回滚。事务的目的是保证数据的。
2025-10-25 16:02:12
831
原创 零拷贝(Zero-Copy)
(2 次 DMA + 2 次 CPU),CPU 需要参与两次内存拷贝,效率低。之间会发生多次拷贝,而零拷贝的目标是。(尤其是网络传输和文件传输),目的是。把文件数据发送到网络连接,实现。在传统 I/O 模型中,数据在。方法底层会调用操作系统的。系统调用,从而实现零拷贝。
2025-10-25 11:47:54
625
原创 MySQL 中的 binlog(Binary Log) 的 写入方式、作用与功能、以及底层原理
由于sql的执行是有上下文的,因此在保存的时候需要保存相关的信息,同时还有一些使用了函数之类的语句无法被记录复制。记录单元为每一行的改动,基本是可以全部记下来但是由于很多操作,会导致大量行的改动(比如altertable),因此这种模式的文件保存的信息太多,日志量太大。此外,新版的MySQL中对row级别也做了一些优化,当表结构发生变化的时候,会记录语句而不是逐行记录。,一种折中的方案,普通操作使用statement记录,当无法使用statement的时候使用row。binlog 文件由多个。
2025-10-25 11:37:17
915
原创 数据库三大范式
在设计数据库结构的时候,要尽量遵守三范式,如果不遵守,必须有足够的理由。事实上我们经常会为了性能而妥协数据库的设计。第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键。第一范式:每个列都不可以再拆分。数据库三大范式是什么?
2025-10-25 11:28:18
70
原创 双亲委派机制
双亲委派机制是的一种工作模式,用于保证类加载的和。它的核心思想是:当一个类加载器需要加载某个类时,去尝试加载;如果父类加载器无法加载该类,才由当前类加载器自己去加载。
2025-10-25 11:24:59
358
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅