腾讯音乐 面经
一面
- 多级缓存下,它的这个跟数据库一致性它怎么做去保证的?
- (关于 mget 改成 get 的优化)那其实我这里有点好奇是说,因为其实 mget 是一个批处理的获取命令。它如果在全部改成 get 的话,现在网络开销会增加不少。那为什么的 RT 时间会减少呢?
- (针对简历描述“减少每日 53K 批量操作”)减少每日 53K,其实我感觉好像这个 KP(QPS?) 的不是很高... 这个 S 的这个操作好像也对不上。(质疑/要求澄清优化效果与描述的关联)
- 那权益卡那边有做一些,比如说超发了一些防护吗?就是一些问题吗?
- 对于你负责的那个业务模块里面,有没有遇到什么一些服务问题?就你遇到这个问题到当时是怎么解决的?(要求举例说明遇到的棘手问题及解决方案)
- 有遇到一些缓存的一些集中性的一些问题吗?... 热 key 的一些问题有没有遇到过?
- 原本有考虑过用布隆过滤器那些东西吗?
系统运维 & 监控 & 压测
- 你写的服务有对自己服务进行一个压测吗?
- (服务)有做一些监控吗?就是怎么发现一些异常。
数据库 (MySQL)
- 假设某一天... mysql... 它的负载变高了,你觉得它可能是什么问题引起的?
- (针对 MySQL 负载高)让你的排查的一个思路跟流程... 你会怎么去去定位这种问题,然后去解决这种问题。
- (MySQL CPU 升高)怎么看呢?(指用什么命令或工具)
- 慢查询,你觉得有可能有些什么情况会导致一些索引失效,这种情况?
- 假设我要减少一些回表的话,我所以(索引)应该怎么设计?(覆盖索引相关)
- 你刚说的 B 加数,它跟 B 数的区别在哪里?
- B 数它的有什么适用的一种场景吗?(相对 B+树)
- 日常有用到(的)数据库是用到 B 树了吗?(确认 MongoDB 是否使用 B 树)
- 怎么避免长事务呢?
- (关于事务开始时间)但一个事物真正开始可能不是 start 这句话就开始。(暗示/引导思考)
缓存 (Redis)
- (项目里有提到)防止缓存雪崩的一些问题吗?
- 你能讲一讲 redis 那个数据淘汰的一些策略吗?
- (项目里)有用到一个 sorted set 的一个 set 结构吗?你知道它底层数据结构是什么这种结构吗?(跳表/压缩列表)
Linux & 网络
- 假设我要向(想)看一下网络端口的一个占用情况的话,你会下什么命令。
- 假设我想看一下端口那个网络状态... 到底处于比如说 TCP 哪种阶段。
- 假设我看到通过 netstat 那个命令,看到很多端口处于那种 time_wait 的那种状态,你觉得是什么问题引起的?
- 怎么怎么避免这种情况(大量 TIME_WAIT)?
- 有了解过 TCP 里面的一个快速重传机制吗?
- 有了解 TCP 粘包的一些问题吗?
Go 语言
- (项目里有用 Go 吗?)能能解说一下够(Go)的那个(GC)的一个鸡翅(机制)吗?
算法 & 数据结构
- 比如说我有一个 10 亿个整数,对我要快速找到最大 100 个。对你怎么做?(Top K 问题)
- 你能说一下快速排序跟归并排序的它的一个时间复杂度吗?
- 这两者(快速排序和归并排序)的区别在哪里?
二面
- 一般这个(活动接口)QPS 会有多高?
- 你是说 Redis 的 QPS 不是整个业务的 QPS 是吧?就不是一个接口的 API 的 QPS。
- 这两者(API QPS vs Redis QPS)有看过差距会有多大吗?
- 当时为什么关注更更关注 Redis QPS,而不是 API 的 QPS?
- 那 Redis 后面是 7 万(QPS),然后就要做什么优化吗?
- 那那本地缓存优化之后,Redis 的 QPS 降了多少?
- 之前是没有本地缓存是吗?
- 然后本地缓存是用什么?也是用什么做的?(确认是 Caffeine)
- 那这个二级缓存会跟 Redis 的缓存...可能会有在某些瞬间不一致,会有什么业务损失吗?
- 这个就是那这一个维护缓存的是一个独立的服务吗?
- 那有那个比如说那有操作失败(缓存更新/删除)的情况吗?会怎么样?
- 然后这个 Redis...本身你是第一级缓存,它底层的数据是有 MySQL 的吗?还是就是靠刚说那个一个服务来更新的。
- 然后 Redis...假使断电丢失了会怎么样?断电重启了会怎么样?
- 你前面说说从 MySQL 里面找,然后这个找是有现成程序的,还是到时候可能假设发生情况了,可能是要重新看怎么去重新去 load 数据...还是什么。它是自然而然的。(追问缓存加载/恢复机制)
- 那你前面是说那个可能是运营人员在后台操作上上下线的时候才会更新 Redis 是吧?还是说就前端有读取的时候,也会从 MySQL 里面去读,然后读到更新到 Redis。(追问缓存更新触发机制)
- 但就像你刚才说的,像 AOF 这些,其实平常都是运维管,你们不管的对吗?还是你们会参与?
- 比如说(Redis 抖动)什么意思?(要求解释技术术语/现象)
- 然后这种(Redis 抖动)会认为健康还是需要什么处理吗?(监控与应对)
- 最终在整个活动模块上...过程中还还你还有碰到什么其他问题,或者觉得比较不合理的地方吗?哪怕可能还没来得及做的优化的。
- 比如说一个用户命中 100 个活动,然后你预期它的这个存储消耗大概是多大。
- 那看上去就是可能说这部分,你是认为这部分关联关系的存储成本大,还是那个活动详情的那部分存储成本的?
- (针对候选人回答活动详情占用内存大)但是那个活动详情他可能总共也就 100 或者说最多几百个活动。他可能就在这台机器上总共也占不了多少空间...总共可能也就只有一兆数据。(质疑/挑战候选人关于内存消耗的判断)
- 怎么会 GC 呢?如果说占的那个内存空间不是很大的话,那为什么会 GC 呢?(追问 GC 触发原因)
技术栈 & 设计能力
- 其实像你现在这些技术栈,整个 Spring 或者 MySQL 或者这些...你觉得其实你用哪一个,其实你觉得用的是比较好,比较有优势。
- 你一般你自己的你习惯性的思考的数据的方式,你觉得会偏 Redis 这样 KV 的还是 MySQL 这种关系型数据库的。
- MySQL,那在一些具体的 MySQL 的那些表的设计上,你觉得有哪个案例是你你过去的哪个实习案例是比较能体现这种 MySQL 的一些设计或者理解能力的。
- 那你一般会怎么去梳理(数据库设计)吗?是会怎么写文档,或者写一个什么样的文档,或者画一个什么样的图。
- 然后一般实现会按 ER 图来实现,还是说可能经常会有什么样的妥协。
- (针对 MySQL 存储 JSON)你是是你会直接存个字符串,还是用它本身现在支持的 JSON 的一个字段能实现。
- (针对使用 Text 存 JSON 的妥协)并(频繁变更的列)刚才是因为要频繁读写。(确认妥协原因)