type
Post
status
Published
date
Mar 11, 2026
slug
interview-qa
summary
八股进行时
tags
开发
category
技术分享
titleIcon
password
icon
insider
🎮
八股进行时
双写 - 单个写失败带来的不一致性 - 重试/补偿 - 最终一致性(简单,时延低)
监听数据变更binlog - canal解析binlog events转为语句 - 发MQ - 下游消费者订阅MQ同步变更(消费者可能失败,多次后人工介入,可能网络原因重复,需要幂等性)
 
AOP 和 MDC 实现全链路日志追踪
condition 条件
 
项目snowflake 内存屏障
 
tcc
 
广播失效 本地缓存
  • 一致性方案:
    • Cache Aside
    • 删除缓存而不是更新缓存
    • 延迟双删
    • MQ / PubSub 通知本地缓存失效
  • 稳定性方案:
    • 热点 key:逻辑过期、互斥重建
    • 穿透:BloomFilter、空值缓存
    • 雪崩:TTL 抖动、预热、限流降级
    • 击穿:分布式锁、异步刷新
 
 
 
 
 
RocketMQ消息丢失 堆积

建索引原则

  1. 给高频查询建
  1. 优先考虑 where / join / order by
  1. 联合索引顺序按常用过滤和排序设计
  1. 尽量做覆盖索引
  1. 不要滥建,写入有成本

2)索引什么时候失效?

高频回答:
  • 对索引列做函数/计算
  • 隐式类型转换
  • 没遵守最左前缀
  • 范围条件后,后续列利用能力下降
  • like '%xx'

Redis

单线程模型

核心

  • Redis 是“核心执行单线程 + 周边能力多线程/子进程”的模型。

缺点

  • 大 Key、慢命令、Lua 脚本、阻塞命令都会卡主线程,导致延迟抖动。

什么不是单线程

  • 多线程
  • unlink - 异步删除
  • AOF - fsync
  • 网络socket IO(小包很多,网络读写开销大)
  • 多进程
  • bgsave - RDB
  • bgrewriteaof - AOF重写

性能 - 为什么快

  • 基于内存,CPU 不是主要瓶颈
  • 数据结构实现简单高效
  • IO多路复用epoll
  • 单线程执行命令,没有锁竞争、线程切换成本低

缓存异常

  • 穿透
  • 击穿 - 逻辑过期(长TTL兜底,value存expireTime),独立线程重建
  • 雪崩

IO多路复用

  • select | poll | epoll

数据结构

  • String | List | Set | Hash | Zset
  • 底层实现 listpack(7/ziplist(
  • SDS 压缩列表 跳表 复杂度
  • 应用场景 排行榜

大热key

  • 大key
  • 热key
  • 治理

数据淘汰

  • lru lfu

集群

  • 脑裂

持久化

  • AOF AOF膨胀 AOF重写
  • RDB
  • 混合

应用

  • 分布式锁(Redisson实现原理,红锁替代)
  • 布隆过滤器(误判率)
  • 一致性(双删,CDC)
  • lua原子执行业务逻辑(读 判断 写)| Redis 事务:解决“多条命令一起执行”

MySQL

存储引擎

  • InnoDB vs MyISAM(事务不完整)

事务

ACID

  • A - undo log + 2PC(redo|bin)
  • C - 一致性实现 A/I/D + 约束 + 正确业务逻辑共同保证
  • I - 隔离性实现 MVCC + 锁
  • D - redo log WAL + doublewrite(恢复半写入页) + 落盘fsync(bin|redo)

隔离级别

  • (RU RC RR Serializable 脏读 不可重复 幻读 - MVCC + gap/nextkey锁索引)
  • 锁 2PL 行锁 间隙锁 Next-Key锁

MVCC

  • 一行数据留多个版本,读历史版本减少快照读与写冲突;
  • 行隐藏信息:最后修改trx_id,undo log指针

ReadView

  • 快照读时,事务提交与活跃状态的快照,决定当前事务可见版本
  • min [active] max

WAL

  • 内存更新页,日志落盘后commit,随后刷盘
  • 随机写改顺序写,延迟数据页刷盘(结合doublewrite保障刷盘完整,先顺序写doublewrite,落盘,然后根据doublewrite(LSN redo log更新)落实际位置,查checksum确认是否需要)
  • 性能更高 更安全

索引

  • b+结构
    • 支持范围查询;
    • 天然有序,支持 order by / group by / 区间扫描;
    • 更适合磁盘/页存储,层高低,IO 次数少;
    • 叶子层顺序扫描效率高,适合大量连续数据读取;
    • 支持最左前缀匹配,复合索引利用率高。
    • 对比b树
    • B+ 树非叶子节点只存键,不存行数据,单页能放更多 key,树更矮;
    • 所有数据都在叶子节点,更适合范围扫描。
  • 建索引考虑因素 - 高频查询条件建索引、选择区分度大的列,插入/更新频繁的列谨慎建立索引
  • 索引失效 - 索引列函数计算、联合索引不满足最左前缀原则、索引列模糊匹配、隐式类型转换
  • 索引类型 - 划分
  • 查看表索引,是否走索引

索引下推

  • Server层 WHERE 条件中包含的索引条件,下推到存储引擎层,在扫描索引时就先过滤一部分数据,减少回表次数。
  • explain - Using index condition 索引下推 Using where 表示还有条件需要在 Server 层继续过滤 Using index 表示用了 覆盖索引

SQL调优

explain -id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra

  • type - 访问方式 - const(唯一索引常量比较) | eq_ref(唯一索引等值join) | ref(索引常量比较) | range(范围比较)| index(全索引) | all(全表)
  • possible_keys - 索引候选
  • key - 索引
  • key_len - 索引长度 - 联合索引
  • rows - 预估扫描行数
  • filtered - 过滤留存百分比
  • extra - Using index | index condition | where | filesort | temporary | join buffer
  • type - key - key_len - rows - extra
  • 深分页

日志

  • bin log - Server 层、偏逻辑、用于主从复制/恢复
  • undo log - MVCC,事务回滚
  • redo log - InnoDB 层、偏物理、用于崩溃恢复 innodb_flush_log_at_trx_commit
  • 2PC - InnoDB redo log prepare | MySQL Server binlog | InnoDB redo log commit
  • 崩溃恢复 prepare [binlog] commit
  • group commit

JVM

内存模型/运行时数据

  • 线程独占:栈(HotSpot合并native)PC 线程共享:堆 方法区(旧永久代在堆里内存受限,元空间实现动态)

JVM调优

  • 堆大小
  • 直接内存

类加载生命周期

  • 加载(Loading) → 链接(Linking:验证、准备、解析) → 初始化(Initialization) → 使用(Using) → 卸载(Unloading)
  • 加载 - 1. 通过类的全限定名获取二进制字节流 2.将字节流转成运行时数据结构 3.在堆中生成一个 java.lang.Class 对象
  • 链接 - 验证:确保这个类的字节码是合法、安全、符合 JVM 规范的,不会危害虚拟机。 准备:为类变量(也就是 static 变量)分配内存,并设置默认零值。解析:把常量池中的符号引用,替换成直接引用。解析可以在初始化之后按需进行,也就是延迟解析。
  • 只有“主动使用”类时才会初始化。常见触发条件:
(1)创建类实例 (2)访问类的静态变量 (3)调用类的静态方法 (4)通过反射使用类 (5)初始化子类时,先初始化父类
(6)JVM 启动时的主类

双亲委派

  • 防重复 防篡改
  • Bootstrap → Platform → Application → 自定义
  • 类加载机制 流程
  • 类加载器层次
  • 打破双亲委派(SPI - JDBC|SLF4j ContextClassLoader,热部署热更新,新的cl加载新版本旧的类与cl一起回收,Tomcat多版本依赖)
  • findClass() | getParent().loadClass() // 业务类/插件类优先自己加载(child-first)

GC

CMS G1 ZGC

维度
CMS
G1
ZGC
设计目标
最小化老年代停顿
可预测停顿 + 大堆通用
极低停顿
堆结构
传统分代:新生代/老年代
Region 分区,逻辑分代
分区化(ZPages/Regions),新版本支持分代
回收方式
并发标记 + 清除
标记 + 复制整理(Evacuation)
并发标记 + 并发搬迁
是否压缩整理
是否易碎片
很低
停顿特点
初始标记/重新标记短停顿,但 Full GC 风险高
Young/Mixed GC 有停顿,可调但不是硬保证
停顿通常极短,目标基本与堆大小弱相关
并发程度
中等
中等偏高
很高
屏障机制
主要写屏障,增量更新
SATB + RSet 写后屏障
着色指针 + Load Barrier(分代版再加 store barrier)
典型问题
碎片、浮动垃圾、concurrent mode failure
RSet 开销、Humongous 对象、仍有 STW
CPU/内存开销更高,吞吐可能略低
版本地位
JDK9 弃用,JDK14 移除
JDK9 起默认
JDK11 引入,JDK15 生产可用,JDK21 有分代 ZGC
notion image

GC Roots

  • 活跃线程栈帧中的局部变量引用 - Object obj
  • 已加载类的静态字段引用 - static
  • JNI 引用 - native (Object obj)
  • 活跃线程对象 - new Thread().start()
  • 监视器锁相关引用 - synchronized(obj)
  • JVM 内部保留引用 - 常量池

GC算法

  • Young - 复制
  • Old - 标记清除 | 标记整理
  • Mixed

GC种类

  • CMS G1 ZGC
  • 分代理论 各自特点 算法 是否STW
  • 读写屏障
 

手撕

  • 多线程交替打印ABC
  • 反转区间链表 x2
  • 环形链表
  • 链表反转
  • topK x2
  • 并发安全单例模式
  • LRU - ttl
  • 字符串中第一个不重复的字母
  • 打印二叉树的最长路径 
  • 课程表(拓扑排序)
  • 出现次数超过一半的数字
  • 岛屿数量
  • 合并两个有序数组 x2
  • 最接近的三数之和
  • LRUCache
11. 一道回溯 已知元素:1 2 3 4,查出所有形如这样的组合:1 12 123 124 1234 13 134 14 2 23 234 24 3 34 4
  • 二叉树高度
  • 删除链表的倒数第 N 个结点
  • 反转二叉树(迭代和层序遍历)

JUC

逃逸分析

  • 对象会不会逃出当前方法?return | 字段赋值 | 传参其他方法保存 | 集合
  • 会不会被别的线程访问,那就属于线程逃逸
  • 用于锁消除(如果某个锁对象根本不会被别的线程看到,那加锁就没意义,可以去掉。)
  • 标量替换(如果一个对象不会逃逸,JVM 甚至可能连对象都不真创建,直接把它拆成几个普通变量用。)
  • 栈上分配

JMM

JMM(Java Memory Model)规定的是:
  • 哪些重排序是允许的
  • volatilesynchronizedfinal 各自提供什么保证
  • happens-before 成立时,线程间应该看到什么结果
可见性问题由来:
  • 1)编译器/JIT 会重排
  • 2)CPU 会乱序执行
  • 3)多核各自有缓存

Synchronized

锁升级

  • JVM 根据锁竞争强度,动态选择“偏向线程、CAS 自旋、阻塞唤醒”三种不同成本的同步方式。
偏向锁(17移除)
基本只有一个线程反复进出
“这把锁偏向某个线程”
轻量级锁
多线程交替访问,但竞争不激烈
CAS + 自旋,尽量不阻塞
重量级锁
多线程激烈竞争
进入 ObjectMonitor,线程阻塞挂起
无锁 ↓ 偏向锁
  • 适合单线程反复进入
  • 对象头记录线程ID
  • 同一线程重入几乎零成本
↓(其他线程来竞争,撤销偏向) 轻量级锁
  • 线程栈创建 Lock Record(旧mark word)
  • CAS 抢锁
  • 抢不到先自旋
↓(自旋失败 / 竞争激烈) 重量级锁
  • 膨胀为 ObjectMonitor(重入次数 | owner | 阻塞队列 | wait队列)
  • 线程阻塞挂起
  • 涉及上下文切换,用户内核态转换,成本最高

作用

  • 实现原理 - monitorenter monitorexit ACC_SYNCHRONIZED字节码 信息存在对象头的Mark Word(hashCode | GC年龄 | 偏向线程ID | 栈帧LockRecord指针 |ObjectMonitor指针)
  • 方法锁 this(实例)/class(static) 自定义锁控制粒度+封装
JVM 是通过对象头的 Mark Word 来记录“这个对象现在是什么锁状态”的。

对比volatile

  • volatile的happens-before: volatile写 - 类似monitorexit | volatile读 - 类似monitorenter,最后写,最先读,保障其他变量的可见性
  • volatile可见性 + 有序性
  • synchronized可见性(同锁的happens before) + 有序性 + 原子性(复合操作count++) + 互斥
  • 双重检查单例(DCL)里必须给 instance 加 volatile,因为第一次 if (instance == null) 是在锁外读的;只靠 synchronized,这个锁外读没有和初始化线程建立 happens-before,可能读到半初始化对象

对比ReentrantLock

  • 超时、可中断、公平、多个条件队列时选 Lock

CAS

  • 自旋锁 - 空转浪费CPU
  • ABA问题 - +时间戳,版本号等单调序列区分

AQS框架

    ThreadLocal

    • 弱引用Key - 内存泄露
    • 应用场景 - MDC,用户信息
    • 用完一定 remove(),最好放在 finally 里。
    • 每个 Thread 对象内部都有一个 ThreadLocalMap
    • ThreadLocal 作为 key,线程隔离的数据作为 value。

    线程池

    线程的三种创建方式

    • 继承 Thread
    • 实现 Runnable
    • 实现 Callable + Future/FutureTask/ExecutorService

    Runnable 和 Callable 区别?

    • Runnable 无返回值,不能抛受检异常;
    • Callable 有返回值,可抛异常。

    参数与流程

    • 参数 - 核心 最大 时间 单位 队列 拒绝策略 线程工厂
    • 流程 - 核心 → 队列 → 最大 → 拒绝
    • 设置考虑 - 1 + W/C(W-等待,DB RPC Lock 阻塞 IO | C- CPU火焰图 Arthas)
    • N = Ncpu × Ucpu × (1 + W/C)。这个公式的推导逻辑是:一个线程并不是一直在用 CPU,它在一个任务周期里只有 C/(W+C) 的时间真正占用 CPU。为了让 CPU 达到目标利用率,就需要更多线程去填补等待时间,于是推导出 1 + W/C 这个放大系数。
    • 拒绝策略 - CallerRuns Abort Discard DiscardOldest
    • 阻塞队列 - ArrayBlockingQueue可控
     
    核心业务拒绝:
    • 拒绝时打日志、埋点、告警
    • 必要时落库 / 发 MQ / 延迟重试 / 降级补偿

    任务异常如何捕获

    • execute submit
    • 方式 1:任务内部自己 try-catch
    • 方式 2:submit + Future.get()
    • 方式 3:重写线程池 afterExecute() - 统一日志;统一告警;对 execute/submit 都能兜底

    数据结构

    • ConcurrentHashMap 并发原理 1.7 Segment 1.8 不支持null key/value,无法从返回值稳定地推断状态,get containsKey中间可put remove
    • HashMap非并发安全 | ConcurrentHashMap - put覆盖数据 1.7头插成环

    设计模式

    • 代理 AOP的动态代理 - cglib jdk
    • 策略 支付
    • 单例 Bean 双重校验
    • 工厂 三层 循环依赖
    • 模板 AQS

    JDK

    • 值传递 引用传递 - 值传递,基本类型,对象引用
    • 面向对象 封装 继承|组合 多态

    异常

    受检异常(Checked Exception)

    编译器强制你处理的异常,比如:
    • IOException
    • SQLException
    • ClassNotFoundException
    你必须:
    • try-catch 捕获,或者
    • 在方法上 throws 声明继续往外抛

    非受检异常(Unchecked Exception)

    运行时异常,不强制处理,比如:
    • NullPointerException
    • ArithmeticException
    • IllegalArgumentException
    它们属于 RuntimeException 及其子类。

    IO

    • BIO AIO NIO

    数据结构

    HashMap

    • 底层 - 数组 链表 红黑
    • put:算 hash 扰动 高 16 ^ 低 16 → 定位桶(n - 1) & hash → 无冲突直接放→有冲突链表追加;当64链表长度8时可能树化→扩容容量一般按 2 倍扩,阈值 = capacity * 0.75

    Spring

    bean生命周期

    1. 实例化
    1. 属性填充 / 依赖注入
    1. Aware 回调
    1. BeanPostProcessor#postProcessBeforeInitialization
    1. 初始化方法
    1. BeanPostProcessor#postProcessAfterInitialization
    1. Bean 可用
    1. 容器关闭时执行销毁回调(单例)
    • 初始化方法顺序
      • @PostConstruct
      • InitializingBean.afterPropertiesSet()
      • 自定义 init-method

    循环依赖

    IOC

    • 原理

    自动装配

    • 核心链路:
      • @SpringBootApplication
      • → 包含 @EnableAutoConfiguration
      • → 导入 AutoConfigurationImportSelector
      • → 加载候选自动配置类
      • → 根据条件注解决定是否生效
      • → 注册 Bean
    • Spring Boot 3
      • 候选自动配置类主要来自META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
      • 老版本常问的是 spring.factories,要区分开。
    • 自动装配的核心不是“自动”,而是条件装配
      • 典型条件:
        • @ConditionalOnClass
        • @ConditionalOnMissingBean
        • @ConditionalOnProperty
        • @ConditionalOnWebApplication
    • 一句话总结
      • Spring Boot 自动装配 =“把一堆可能需要的配置类先准备好,再根据当前 classpath、配置项、已有 Bean 按条件决定装不装。”
    • 怎么自定义 starter?
      • 写自动配置类;
      • 注册到 AutoConfiguration.imports
      • 配条件注解。

    注解

    • 原理
    • 常用注解
     
    Spring的架构原理

    其他

    如果你的第一个项目qps × 10或者100,你会有哪些优化?
    2.操作系统基础:线程调度的算法。
    5.数据库:分布式数据库如何分表
    6.了解编译器优化指令重排吗
    说说对 DDD 架构的理解
    滑动窗口限流和令牌桶限流有什么区别,各自的优劣
    4.HashMap线程不安全的原因及CurrentHashMap线程安全的原因
    9.redis哈希槽
    8.简单介绍ES
    3. 讲讲 HashMap 的扩容机制,还有 ConcurrentHashMap 的原理和线程安全是怎么保证的?
    5. 注解的实现原理是啥?
    6. 一个类调用自己内部类上的注解,这个注解会生效吗?
    9. 遇到高并发页面访问,有哪些解决方案?

    Web

    3.http和tcp在tcp\ip模型的哪一层
    4.tcp的三次握手过程
    5.浏览器的跨域访问,跨域限制,原因

    TCP | UDP

    • TCP - 面向连接 | 可靠传输 | 有序 | 有重传、确认、流量控制、拥塞控制 | 面向字节流
    • UDP - 无连接 | 不保证可靠 | 不保证顺序 | 没有重传/确认 | 面向报文

    OS

    进程、线程、协程

    • 区别

    死锁

    • 条件
    • 避免
     
    rpc如果发送超时怎么解决
    怎么保证数据一致性
    分布式事务怎么实现的
    线上jvm是怎么设置的
    4.红黑树特性
    5.红黑树使用场景、b树使用场景
    3. 抽象类和接口的应用场景
    java中sort用的是什么排序
    快排
    Redis 和数据库的更新策略是啥?怎么保证数据一致性?
    问了实习中用到的设计模式(责任链和策略模式有啥区别)
    4. 如何设计银行存取款和转账业务的具体实现,除了加锁还有什么?
    5. 本地测试没问题,上线之后出问题了,怎么排查是哪方面的问题
    6. 索引优化
    1、你怎么理解Java和Go这两种语言的区别?
    2、你个人更喜欢哪种语言?
    3、谈谈Java和Go在GC(垃圾回收)方面的区别?
    4、Java为什么要设计成分代回收这种机制?
    5、新生代和老年代分别用的是什么清除算法?
    6、新生代和老年代的默认比例是多少?
    7、xx项目中,任务切片的具体细节是怎样的?
    8、分库分表的分表键是怎么设计的?为什么分128张表?
    9、为什么使用RocketMQ而不是Kafka?
    10、除了异步和削峰,使用MQ还有什么考量?
    11、关于自研限流器:为什么公司没有现成的组件需要自己写?
    12、设置令牌桶参数时,有没有考虑“预热”?
    13、限流和熔断的区别是什么?分别作用在服务端还是客户端?
    14、本地缓存(LocalCache)如何保证集群一致性?(即怎么通知所有机器清除缓存)雪花算法(Snowflake)生成的ID结构?存在什么问题?
    15、分布式锁的超时时间设为多少?为什么?
    16、锁超时了怎么办?
    17、看门狗(Watchdog)机制,如果有1000个线程,需要开1000个守护线程吗?
    18、乐观锁和悲观锁的区别?乐观锁(CAS)有什么问题?
    19、Java中如何在不重启JVM的情况下修改一个类的结构?(HotSwap)关于热更新:
    21、Java线程的状态有哪些?IO操作时线程处于什么状态?
    22、数据库聚簇索引和非聚簇索引的区别?
    23、MySQL有哪些日志?Redo Log是在存储引擎层还是服务层?
    redis大key是什么,你有什么解决方案吗,你认为多大是大,会有什么影响,如何拆分呢,(完全不会)
    redis实现滑动窗口的方法,做什么的知道吗
    使用mq的注意事项,幂等性的实现方法(要两种以上)
    策略模式的演化,是从什么模式演变过来的
    Kafka的消息重平衡
    explain怎么分析,看什么关键指标
    springboot使用到的设计模式,哪里用到了设计模式
    1 aop是怎么做的
    2 zset的底层数据结构是什么样 跳表如何完成一次查询? 时间复杂度?
    3 你这里说点赞流程加锁控制并发加的是什么锁 答基于redis的分布式锁  问 那这样不会有什么问题么 再答这种实现的缺点 然后介绍后面采用了redission 顺便说了redission源码
    4 @async有什么问题 和自定义线程池怎么选 你用过线程池么 一般如何考虑参数 异步返回值如何处理
    1 spring用到了哪些设计模式?责任链设计模式介绍下?
    2 redis的常用数据结构和底层实现
    1.怎么删除redis的大key
    2.分布式锁是怎么实现的
    3.消息队列是否支持读写分离?
    4.mysql的事务和并发控制,mvcc是怎么实现的
    5.如果服务器中有大量的time_wait状态,是怎么引起的,要怎么解决
    6.怎么防止sql注入
    7.负载均衡算法有哪些
    8.cpu使用率飙升怎么排查
    9.数据库和缓存一致性要怎么保证
    10.如何设计一个短链系统
    11.联合索引设计题,有A、B、C三个字段,有两个查询语句(select * from XXX where B = 200 and C > 100,select * from XXX where A = 300 and B = 200 and C > 100)大量 执行,问怎么设计联合索引?
    12.4TB的文件中全是int32的数值,如何在2GB的内存中快速找出某一个数是否存在?用bitmap的话,需要占用多少内存
    13.2GB的文件中全是int64的数值,如何在只有128MB的内存中找出前100大的数字
     
    3.redis 大key问题 如何在不拆分大key的情况下读取key scan命令
    4.审批流程 A->B->C ABC可以互换 适合用什么设计模式设计 责任链模式
    5.线程池八股
    6.caffeine原理
    7.数据库缓存一致性
     
    第三次挥手后客户端是什么状态?为什么?
    Redis数据不一致的问题
    用Redis分布式锁做了什么
    如果使用分布式锁的客户端挂掉了,会发生什么
    Redis分布式锁底层是怎样的
    Redission原理
    HashMap
    如果HashMap非常大,扩容时候要耗费长时间,你自己设计一种方案来解决这个问题
    Redis集群了解过吗,让你设计一个Redis集群,怎样做
    2.RAG有哪些复杂索引?有哪些类型,原理是什么 3.大模型微调技术有哪些,LoRA的原理是什么,为什么可以降秩 4.虚拟内存是什么 5.哲学家就餐问题是什么,如何解决这个问题 6.计算机执行1+1打印出2背后做了些什么 7. 怎么保证发出一个文件,就是最终能够发送成功,而且能够恢复,且所有的数据都不丢失 8.Go协程和线程本质区别 9.索引为什么用B+树 10.B+树与红黑树的区别
    1. 🔍 慢查询定位与优化 线上遇到过慢查询吗?怎么定位问题的?怎么优化的?
    1. 📂 MySQL索引建立原则 一般你们怎么建Mysql索引,基于什么原则,遇到过索引失效的情况么,怎么优化的?
    1. 🔄 自增ID设计 你们建表会定义自增ID吗?为什么?自增ID用完了怎么办?
    1. 📝 MySQL写入流程 介绍一下Mysql写入数据的流程,越详细越好。
    1. 💾 Redis持久化策略 Redis线上的持久化策略是怎么样的?你们是多久同步一次的?
    1. 📊 Redis Set与ZSet Redis的Set有了解过么?底层的数据结构是怎么样的?和Zset有啥差别?
    1. ⏳ Redis崩溃与数据恢复 系统在11:05 设置一个值,并给出5分钟的过期时间,系统刚刚Set完之后redis集群崩溃,11:11分系统重启成功,那么Redis中Set的值是否还存在?
    1. 📦 消息队列模型对比 项目中用到的消息队列的消息模型是怎么样的?Kafka、RabbitMQ有啥区别么?
    1. 🚀 消息队列必要性 项目中这些场景不用队列行不行?会有什么问题吗?
    1. 🔍 Kafka高吞吐与一致性 Kafka一致性、可靠性,为什么能做到高吞吐,消息积压怎么处理,如何保证消费有序?
    1. 🛠️ RPC调用流程 RPC框架调用的流程是怎么样的?讲一下核心步骤。
    1. 🔥 热榜功能设计 一个热榜功能怎么设计,怎么设计缓存,如何保证缓存和数据库的一致性?
    1. 🎨 工厂模式实现 写一个工厂模式。
    1. 💡 四则运算求值 口述算法,四则运算表达式怎么求值。
      1. 前后端如何交互
      1. 服务之间如何交互
      1. 登录业务怎么做的
      1. 高并发怎么做的
      1. mysql索引依然很慢怎么办
      1. MySQL的一页怎么在Redis里面
      1. 从前端url到显示的整个流程
      1. jvm回收策略,设置过参数吗?
      1. spring的自动装配等注解
      1. springAOP
      1. 乐观锁分布式锁讲一讲
      1. 实习时遇到的项目难点如何解决?
      1. 实习时遇到的同事压力甚至刁难如何应对?
      1. 库存不足怎么解决的
      1. 还有更好的办法吗
      1. 分库分表的思路
      1. 为什么会有缓存击穿的问题?如何解决
      1. ArrayList扩容机制,存在哪些问题
      1. contains方法的执行原理
      1. 多线程你平时怎么使用
      1. mysql清空一张表有几种方式
      1. 遍历分页查询一个非常大的表,有几种比较快的
      1. 联合索引怎么用
      1. 强制使用索引的关键字
      1. 乐观锁的sql
      1. 用redis做分布式锁一般怎么用
      1. hashmap是怎么执行contains的
      1. 16 多线程场景下,主线程需要同步所有子线程执行结果需要怎么做
      1. 写sql语句的注意事项
      1. mysql的事务特性
      4、Redis的基础数据结构 5、如何解决秒杀系统异步下单导致redis和MySQL数据不一致的问题(我答的是秒杀系统主要关注的是超卖和一人一单问题,对Redis和MySQL的强一致性要求不高,只需要最终结果保持一致性就行。然后他又问如果高并发下kafka消息堆积导致CPU飙升怎么办 ,我就答调整kafka配置或者优化MySQL扣库存语句,但是他好像不是很满意) 6、介绍一下本地缓存 (答caffine 但是因为我技术栈没用到所以没太看本地缓存的相关知识 所以他也没有追问) 7、介绍一下RPC协议(因为技术栈没用到分布式 所以也没看)
      问我是否了解GC(新生代/老年代,标记清除算法,Minor/Full GC) 问我了解java内存模型吗?(这块没说清除,应该回答JMM那一套) CAS(我说了下原理) 本地缓存(我大概了解caffeine) 问我了解哪些ai技术(我说了RAG\Function call\MCP,然后让我说下RAG,我说了下RAG的原理)
      • ==和 equals 的区别 - 常见字符串操作集合有哪些,有什么区别 - hashmap 底层 - set list map 区别,顺序和能否元素重复 - nio bio aio 区别 - bio:同步阻塞 IO 模型,对 于 IO 读写操作必须阻塞在一个线程中完成 - nio:同步非阻塞 IO 模型,NIO中引入了Channel(通道)和Buffer(缓冲区)的概念。面向缓冲区的读取和写入,都是与Buffer进行交互,多用于高并发高负载的网络 - aio:异步非阻塞 IO 模型,基于事件和回调机制实现,IO 处理后会直接返回不会阻塞,当后台操作结束后,操作系统通知相应线程进行后续处理 - 保证线程安全的集合 - currenthashmap - vector - CopyOnWriteArrayList - 读操作不加锁,写操作加锁 - ConcurrentLinkedQueue - 非阻塞队列,通过 cas 实现线程安全 - BlockingQueue - 实现类ArrayBlockingQueue(容量不可变)、LinkedBlockingQueue(单向链表容量可变)、PriorityBlockingQueue - sleep 和 wait 的区别 - spring 中 bean 的作用域 - 异常的类型 - 1/0 什么异常 ArithmeticException
      TCP连接泄露有什么现象
      1. (项目相关)动态刷新线程池有什么需要注意的吗
      1. 创建一个线程要多少内存
      1. 如果是虚拟线程的话,做动态线程池设置参数要考虑什么
      1. Redis怎么设计更新与失效策略
      1. 缓存与数据库的一致性设计方案
      1. 说一下延迟双删
      1. ES 的倒排索引
      1. 给定一个关键词进行ES查询,结果不好,怎么优化查询

      MQ

      消息堆积

      消息丢失

       
      打包一系列SQL语句为一个整体,关注原子性、一致性、隔离性和持久性
      IOC/AOP、自动配置快速开发、web应用开发和微服务管理
      url从输入到响应的全流程
      http、DNS、TCP/UDP、IP、ARP和FCS
      电商场景的秒杀库存系统设计一下
      前端请求拦截/CDN、网关限流/身份验证、Redis缓存热点数据和库存进行预扣减、MQ异步、乐观锁更新数据库数据
      跨平台运行、内存管理优化;虚拟机栈、本地方法栈、程序计数器、堆和元空间
      JVM垃圾回收机制
      G1分代垃圾回收
      6、讲一下JUC并发编程 7、谈谈synchronized 和reentrantlock 的它的一个核心区别 8、Redis 的那个缓存雪崩,就是缓存穿透、缓存击穿 9、你熟悉那个 spring boot 那个执行流程吗?就是能说一下 spring boot 启动时它的一些核心的步骤,了解不? 10、自己实现一个 spring boot 的那个 start 该如何做? 11、spring 的这个 AOP 跟 IOC 这一块了解吗?那它的应用场景一般有哪些容器?就是什么情况下会用到这个项目里面? 12、Tomcat的线程池执行流程是怎么样的? 13、k8s了解吗? 14、如何来设计实现一个短链接系统 15、RAG了解吗?工作流程是什么? 16、Function call、MCP了解么 17、谈谈你对agent的了解和看法 解释一下什么是缓存击穿? 为什么“商户详情”这类数据容易出现缓存击穿问题? 解决缓存击穿时,为什么不直接使用 Redis 的物理过期(TTL),而是采用逻辑过期?

      项目

      notion image
      • 防止超卖 - 条件更新原子SQL
      • 当系统真正去执行“超时取消订单”这个逻辑时,需要校验哪些事情才能最终取消?
      • 你的项目中使用了延迟队列来实现订单超时取消,相比于轮询方案,它的优点在哪里?
      • 轮询方案除了增大数据库压力外,还有什么缺点?
      • 如果用 Redis 实现互斥锁,具体可以使用什么命令? 使用 SET NX 命令实现分布式锁会有什么弊端?(涉及主从一致性等问题)

      snowflake

      • 1 bit 符号位
      • 41 bits 时间戳差值 69年
      • 10 bits workerId 1024节点
      • 12 bits sequence 4096/ms/节点
      • (timestamp,workerId,sequence)
      • 时间不能倒退节点不能撞号同一毫秒内序号不能溢出
      • 回拨幅度很小,比如 <= 5ms<= 10ms,那就直接等待到 lastTimestamp
      • 回拨较大:直接报错,不发号,报警,把节点摘掉
      • 预留“回拨标识位

      dubbo

      • 长连接复用
      • 二进制协议/高效序列化
      7.分布式锁怎么实现的?锁的过期时间设置?下游接口响应慢锁过期怎么办?超时时间有考虑过full gc吗?(goland特性stw时间极短,没考虑gc) 8.其他的分布式锁方案?(mysql,Zookeeper) 9.ZK做分布式锁了解吗? 11.SpringBoot常见注解?
      声明式事务失效
      编程式事务 12.Transaction注解失效情况? 13.Ioc和aop通俗易懂描述一下? 14.哪些注解实现aop了? 16.是否遇到mysql主从延迟情况? 17.主从延迟如何获取的?(没测过) 19.三次握手是否可以改成两次或四次? 20.Tcp和udp使用场景 21.Docker和虚拟机的区别? 22.为什么虚拟机启动慢而docker快?
      如何保证一致性更新 5. 联合索引的结构 6. 联合索引的最左匹配原则 7. Redis 多大算大key 8. Redis 大key 会带来什么问题 9. Redis 数据结构 10. Redis zset 结构 和 应用场景
      3.什么是快照读,什么是当前读
      4.为什么不能全用快照读,或者不能全用当前读
      6.一个事务还没提交,其他事务能看见吗
      7.varchar(20)和varchar(10000)都存”woshishabi“的时候会发生什么区别
      8.用violatile是怎么避免指令重排的,举个代码例子说明下,这段代码的字节码是怎么样的,执行顺序是怎么样的,用了只会,顺序可能会变成什么样
      9.你设计一个服务,你会涉及成rpc,还是涉及成mq,怎么权衡
      10.手撕,判断一个数组中,有没有一个元素是另外一个元素的两倍
      2. Object类有哪些方法
      3. 责任链模式使用场景
      4. 线程池怎么使用?
      5. 线程池,实现1加到100
      Redis主要使用过哪些数据结构,常用的指令有哪些
      你在项目中使用的淘汰策略是什么
      Mysql的优化有哪些
      Mysql的底层的数据结构
      手写一下简单工厂
      如何保证不超卖?
      消息队列使用场景,消息队列流量削峰值原理,
      nginx原理
      redis过期底层原理实现
      一人一单的下单实现 set key lua脚本,订单id
      JVM调优会不会,CPU爆掉了怎么排查?
      线程池参数和怎么分配
      rag,transformer
      mysql索引数据结构
      redis类型和使用业务场景
      怎么aicoding
      多个mq怎么保证有序性传输
      redis持久化
       
      折腾博客表里站复盘MiniMind学习流程
      Loading...
      CamelliaV
      CamelliaV
      Java;前端;AI;ACGN;
      公告
      UI未显示/数据未更新/无图 → 刷新/等待异步加载
      主入口Netlify:
      备用入口Cloudflare:
       
      2024-2026CamelliaV.

      CamelliaV | Java;前端;AI;ACGN;