fwddbot

fwddbot

MVCC 中 ReadView 的可见性判断规则详解(附面试答题模板)

面试里问 MVCC,八成的候选人能说出「快照读」「undo log」「ReadView」,但一旦追问「ReadView 里到底存了什么、四个字段怎么比、为什么 RR 和 RC 结果不一样」,回答就开始含糊。这篇把 InnoDB 的 ReadView 拆到字段级别,用可复现的 SQL 走一遍可见性判断的完整分支,最后给出一份面试可直接背的答题骨架,以及几个高频

面试题:HTTP/1.1 长连接与 HTTP/2 多路复用的本质区别

很多候选人在被问到「HTTP/1.1 的长连接和 HTTP/2 的多路复用有什么区别」时,答的都是「一个是复用 TCP 连接,一个是并行传输,HTTP/2 更快」。这个回答在面试里几乎等于没答,因为它没有触及二者的本质差异:HTTP/1.1 的长连接解决的是「连接复用」问题,但仍然受制于应用层的请求-响应串行语义;HTTP/2 的多路复用解决的是「帧级并发」

面试题:HashMap 扩容时链表与红黑树的转化阈值为什么是 8 和 6

这道题在 Java 面试里出现的频率极高,但真正能答到点上的候选人并不多。大部分人的回答停留在“8 是泊松分布算出来的,6 是为了防止频繁转换”,再追问一句“泊松分布的 λ 是多少、算出来概率多大、为什么不是 7 和 9、为什么中间留了 7 这个空档”,就答不上来了。这篇文章把 HashMap 中 TREEIFY_THRESHOLD、UNTREEIFY_TH

进程与线程共享哪些资源,切换开销差在哪

面试里问到「进程和线程的区别」,绝大多数人能背出「进程是资源分配单位,线程是调度单位」。但只要追问一句「那具体共享哪些资源、不共享哪些」,答不上来的人立刻现形。再往下问「线程切换到底比进程切换省了什么」,能说清楚页表、TLB、寄存器、内核栈这几层的就更少了。这篇把这两个问题拆到可验证的粒度:哪些资源是进程级私有、哪些是线程级私有、哪些是进程内共享,以及一次上

用 CTE 递归查询实现树形评论的分页展开

树形评论的分页是论坛和社区类产品里最容易被低估的一块。表面需求是"一页显示 20 条评论",实际难点在于:评论是嵌套的,一条根评论下面可能挂着十几层回复,你既不能让某一层的子回复被分页切口拦腰截断,也不能因为要算好层级导致每次翻页都全表扫描。很多项目最后退化成一次性把整棵树的评论全部查出来丢给前端拼,帖子一火,接口就是几百毫秒起步,内存里堆着上万行 JSON

用 IntersectionObserver 实现图片懒加载与占位占高

列表页一次性渲染 200 张商品图,首屏要下载十几 MB 的图片,用户滑动时白屏、闪烁、滚动位置乱跳,这是最典型的图片加载问题。把 loading="lazy" 加在 <img> 上只能解决「什么时候下载」,解决不了「下载之前这块地方占多高」。图片没有尺寸,浏览器在图片解码前把它当 0 高度处理,图片到达后页面被撑开,原本已经滚到第 80 条的用

用 ZSET 实现延迟任务队列:到期扫描与原子取出

订单超时关单、优惠券到期提醒、15 分钟未支付自动取消、消息重投退避——这类「到点才执行」的需求,用定时任务扫数据库是最容易想到的方案,但只要表一大、并发一高,就会出现扫全表慢、多个实例重复执行、任务取到一半进程挂掉导致丢失等问题。Redis 的 ZSET(sorted set)天生适合做这件事:score 存到期时间戳,member 存任务内容,按 sco

用 sync.Cond 实现一个有界阻塞队列

Go 标准库提供了 channel 来做协程间通信,但 channel 不支持「队列长度到达上限后单独统计丢弃次数」这类自定义策略;而在需要精细控制唤醒时机、需要复用同一把锁保护其他状态、或者需要实现「批量入队 / 批量出队」语义时,sync.Cond 是更合适的基础原语。本文从零实现一个泛型有界阻塞队列 BoundedQueue[T],包含 Put(满时阻