高途后端一面:JVM、权限系统与 LRU
- 轮次
- 一面
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- 实习与个人项目有哪些独立完成的部分?
- v-if 和 v-show 有什么区别?
- JVM 内存区域、栈帧、对象回收判定和垃圾收集器如何工作?
- B+ 树、聚簇索引、二级索引与覆盖索引有什么关系?
- 事务的 ACID、隔离级别和 MVCC 如何理解?
- Redis Lua 脚本为什么适合原子操作,释放锁为什么也要原子校验?
- RBAC 与 ABAC 怎样用于数据权限系统?
- OAuth2 登录中的 state 和一次性 ticket 分别有什么作用?
- Session 与 JWT 有什么区别,如何校验签名和过期时间?
- 开发需求时怎样使用 Rules、Skills、Agent 和 MCP?
- 如何用 HashMap 与双向链表实现 LRU?
《参考解析》
锁释放
先读锁再删除是两个动作,读取后锁可能已经过期并被别人获取。应在同一次原子执行中比较持有者标识并删除,防止误删新持有者的锁。脚本的原子执行不等于出错后自动回滚所有已执行写入。
LRU 的两个结构
哈希表负责按键找到节点,双向链表维护最近使用顺序。读取命中和更新都把节点移到表头;容量满时删除表尾,同时清理哈希表。要单独处理容量为零、更新已有键和只有一个节点的情况。
登录凭证
state 把回调和发起登录的会话关联起来,一次性 ticket 则在兑换后失效。JWT 的签名用于验证完整性,通常不隐藏载荷;服务端仍需校验有效期、签发者和目标受众,不能只看解码后的字段。