[{"data":1,"prerenderedAt":1665},["ShallowReactive",2],{"post-\u002Fposts\u002Fbytedance-recommendation-architecture-intern-interview":3,"all-posts-nav":1381},{"id":4,"title":5,"body":6,"categories":1365,"date":1367,"description":1368,"draft":1369,"extension":1370,"hidden":1369,"meta":1371,"navigation":1372,"path":1373,"published":1369,"seo":1374,"stem":1375,"tags":1376,"__hash__":1380},"posts\u002Fposts\u002Fbytedance-recommendation-architecture-intern-interview.md","字节推荐架构实习生 Data 面试准备：推荐系统、实时特征与高并发八股",{"type":7,"value":8,"toc":1316},"minimark",[9,13,20,24,27,52,55,58,126,129,132,135,146,149,158,161,165,168,171,232,235,241,244,247,250,273,276,282,285,291,294,297,300,317,320,374,377,382,385,388,391,405,407,412,415,435,438,441,444,464,467,472,476,481,484,508,511,516,520,523,529,533,536,545,549,553,556,562,565,569,572,575,580,584,588,638,642,711,714,717,762,765,768,776,779,793,797,800,817,820,825,828,831,834,882,886,888,901,904,906,935,938,943,946,950,953,956,970,973,975,980,984,989,993,996,1002,1005,1007,1011,1014,1025,1028,1031,1036,1039,1042,1045,1051,1054,1057,1060,1063,1069,1072,1098,1101,1104,1107,1133,1136,1171,1174,1177,1180,1186,1189,1195,1198,1201,1212,1216,1219,1289,1292,1298,1301,1304,1310,1313],[10,11,12],"p",{},"这篇文章整理的是字节跳动「推荐架构实习生-Data-抖音\u002F直播\u002F电商\u002F剪映」岗位的面试准备路线。这个岗位不是纯推荐算法岗，更像是推荐场景下的后端架构、数据基础设施和 ML Infra 岗。",[10,14,15,16],{},"如果用一句话概括准备方向：",[17,18,19],"strong",{},"不要只把自己包装成会调模型的推荐算法同学，而要展示成懂推荐业务、能做高并发架构和数据基础设施的工程型候选人。",[21,22,23],"h2",{"id":23},"岗位画像",[10,25,26],{},"岗位描述里反复出现几个关键词：",[28,29,30,34,37,40,43,46,49],"ul",{},[31,32,33],"li",{},"推荐系统开发",[31,35,36],{},"架构优化",[31,38,39],{},"大规模机器学习在线预估",[31,41,42],{},"实时计算系统",[31,44,45],{},"推荐特征中台",[31,47,48],{},"高并发、高吞吐、稳定性、可扩展性",[31,50,51],{},"多数据中心、全球化一体推荐系统",[10,53,54],{},"所以它重点考的不是单点知识，而是你能不能把推荐业务背后的在线链路、数据链路和工程稳定性串起来。",[10,56,57],{},"可以按下面六块准备：",[59,60,61,74],"table",{},[62,63,64],"thead",{},[65,66,67,71],"tr",{},[68,69,70],"th",{},"模块",[68,72,73],{},"要准备到什么程度",[75,76,77,86,94,102,110,118],"tbody",{},[65,78,79,83],{},[80,81,82],"td",{},"编程与算法",[80,84,85],{},"至少一门语言熟练，算法题要有手感",[65,87,88,91],{},[80,89,90],{},"计算机基础",[80,92,93],{},"数据结构、操作系统、网络、数据库",[65,95,96,99],{},[80,97,98],{},"后端架构",[80,100,101],{},"RPC、缓存、限流、熔断、降级、服务治理",[65,103,104,107],{},[80,105,106],{},"推荐系统",[80,108,109],{},"召回、粗排、精排、重排、特征、样本、模型服务",[65,111,112,115],{},[80,113,114],{},"数据链路",[80,116,117],{},"Kafka、Flink、Spark、实时特征、离线特征",[65,119,120,123],{},[80,121,122],{},"分布式系统",[80,124,125],{},"分片、副本、一致性哈希、多机房容灾",[21,127,128],{"id":128},"推荐系统整体链路",[10,130,131],{},"最基础的问题是：一个推荐请求从进来到返回，中间发生了什么？",[10,133,134],{},"标准链路可以这样讲：",[136,137,143],"pre",{"className":138,"code":140,"language":141,"meta":142},[139],"language-text","请求进入推荐服务\n  -> 用户画像 \u002F 上下文特征获取\n  -> 多路召回\n  -> 粗排\n  -> 精排模型打分\n  -> 重排 \u002F 多样性 \u002F 去重 \u002F 业务规则\n  -> 返回结果\n  -> 曝光点击行为回流\n  -> 日志进入 Kafka\n  -> 实时 \u002F 离线计算特征\n  -> 训练样本生成\n  -> 模型训练与发布\n","text","",[144,145,140],"code",{"__ignoreMap":142},[10,147,148],{},"面试时要强调两条线：",[150,151,152,155],"ol",{},[31,153,154],{},"在线链路：低延迟、高并发、高可用。",[31,156,157],{},"数据链路：行为日志回流、特征更新、训练样本构造、模型迭代。",[10,159,160],{},"推荐架构岗最关心的是两者如何协同。比如线上打分依赖特征服务，特征服务又依赖实时计算和离线计算，模型效果又依赖样本和特征口径的一致性。",[21,162,164],{"id":163},"召回粗排精排重排","召回、粗排、精排、重排",[10,166,167],{},"为什么推荐系统要拆成这么多阶段？",[10,169,170],{},"因为候选物品规模太大，不能对所有内容都用复杂模型打分。分阶段本质上是在效果、延迟和成本之间做权衡。",[59,172,173,186],{},[62,174,175],{},[65,176,177,180,183],{},[68,178,179],{},"阶段",[68,181,182],{},"目标",[68,184,185],{},"特点",[75,187,188,199,210,221],{},[65,189,190,193,196],{},[80,191,192],{},"召回",[80,194,195],{},"从海量物品中快速取回几百到几千个候选",[80,197,198],{},"追求覆盖率，速度要快",[65,200,201,204,207],{},[80,202,203],{},"粗排",[80,205,206],{},"用轻量模型过滤候选",[80,208,209],{},"平衡效果和延迟",[65,211,212,215,218],{},[80,213,214],{},"精排",[80,216,217],{},"用复杂模型做精细打分",[80,219,220],{},"追求排序效果",[65,222,223,226,229],{},[80,224,225],{},"重排",[80,227,228],{},"处理多样性、去重、频控、业务规则",[80,230,231],{},"让结果更适合最终展示",[10,233,234],{},"可以这样回答：",[236,237,238],"blockquote",{},[10,239,240],{},"召回阶段解决从海量 item 中找候选的问题，追求召回率；粗排阶段用更便宜的模型做快速过滤；精排阶段使用复杂模型提升排序效果；重排阶段结合多样性、去重、频控和业务约束，保证最终列表既有效果也有体验。",[21,242,243],{"id":243},"在线推荐服务如何优化性能",[10,245,246],{},"推荐在线链路一般会有严格的 P99 延迟要求。一个请求里可能要访问用户画像、物品特征、多个召回服务、模型预估服务、规则服务。如果串行调用，很容易超时。",[10,248,249],{},"常见优化方向：",[28,251,252,255,258,261,264,267,270],{},[31,253,254],{},"缓存：用户特征缓存、物品特征缓存、召回结果缓存、模型结果缓存。",[31,256,257],{},"并行：多路召回并发执行，特征并发拉取，下游 RPC 并发调用。",[31,259,260],{},"超时控制：每个下游设置 timeout，超时后走降级。",[31,262,263],{},"批量化：模型预估 batch 推理，减少单次调用开销。",[31,265,266],{},"索引优化：倒排索引、向量索引、embedding 检索。",[31,268,269],{},"模型优化：蒸馏、量化、特征裁剪、轻重模型分层。",[31,271,272],{},"服务治理：限流、熔断、降级、负载均衡、灰度发布。",[10,274,275],{},"回答时最好带上指标：",[136,277,280],{"className":278,"code":279,"language":141,"meta":142},[139],"QPS\nP95 \u002F P99 latency\n缓存命中率\n下游超时率\n模型预估耗时\n召回耗时\n特征拉取耗时\n",[144,281,279],{"__ignoreMap":142},[10,283,284],{},"面试官如果追问「P99 延迟突然升高怎么排查」，可以按链路拆：",[136,286,289],{"className":287,"code":288,"language":141,"meta":142},[139],"入口网关\n  -> 推荐主服务排队耗时\n  -> 用户特征服务耗时\n  -> 召回服务耗时\n  -> 排序模型服务耗时\n  -> Redis \u002F KV \u002F DB 耗时\n  -> 下游 RPC 超时和重试\n",[144,290,288],{"__ignoreMap":142},[10,292,293],{},"先看监控和 trace，把总耗时拆到每个阶段，再定位是单个下游慢、缓存失效、网络抖动、负载不均，还是重试导致流量放大。",[21,295,296],{"id":296},"推荐系统如何去重",[10,298,299],{},"推荐场景的去重通常有几层：",[28,301,302,305,308,311,314],{},[31,303,304],{},"曝光去重：用户近期看过的内容不再推荐。",[31,306,307],{},"内容去重：相似视频、重复商品、搬运内容降权或过滤。",[31,309,310],{},"作者去重：同一作者短时间内不连续出现太多。",[31,312,313],{},"类目去重：同类内容控制频次，保证多样性。",[31,315,316],{},"业务去重：广告、直播、电商商品等有额外规则。",[10,318,319],{},"实现方式：",[59,321,322,332],{},[62,323,324],{},[65,325,326,329],{},[68,327,328],{},"方式",[68,330,331],{},"适用场景",[75,333,334,342,350,358,366],{},[65,335,336,339],{},[80,337,338],{},"Redis Set",[80,340,341],{},"小规模准确去重",[65,343,344,347],{},[80,345,346],{},"Bitmap",[80,348,349],{},"用户行为是否发生过，空间效率高",[65,351,352,355],{},[80,353,354],{},"Bloom Filter",[80,356,357],{},"大规模快速判断，允许少量误判",[65,359,360,363],{},[80,361,362],{},"用户历史行为表",[80,364,365],{},"长周期曝光、点击、购买记录",[65,367,368,371],{},[80,369,370],{},"实时特征",[80,372,373],{},"最近 N 分钟 \u002F N 小时行为统计",[10,375,376],{},"Bloom Filter 可以这样讲：",[236,378,379],{},[10,380,381],{},"Bloom Filter 空间效率高，适合判断一个 item 是否可能出现过。它有误判但没有漏判，因此适合大规模曝光过滤这类场景。如果误判导致少量未曝光内容被过滤，通常业务可以接受。",[21,383,384],{"id":384},"特征服务是什么",[10,386,387],{},"特征服务是推荐系统里非常核心的中台能力。",[10,389,390],{},"它负责为在线推荐链路提供：",[28,392,393,396,399,402],{},[31,394,395],{},"用户特征：年龄、兴趣、历史行为、长期偏好、短期偏好。",[31,397,398],{},"物品特征：内容类目、作者、商品价格、embedding、质量分。",[31,400,401],{},"上下文特征：时间、位置、设备、网络、场景入口。",[31,403,404],{},"交叉特征：用户与物品之间的匹配关系，比如用户对某类内容的点击率。",[10,406,234],{},[236,408,409],{},[10,410,411],{},"特征服务连接离线计算、实时计算和在线预估服务。它的核心要求是低延迟、高吞吐、特征口径一致、可回溯、可监控。推荐链路的模型效果很依赖特征质量，而在线服务的稳定性也很依赖特征服务的可用性。",[10,413,414],{},"特征服务常见难点：",[28,416,417,420,423,426,429,432],{},[31,418,419],{},"在线和离线特征不一致。",[31,421,422],{},"特征延迟过高，影响推荐实时性。",[31,424,425],{},"热点用户或热点物品访问量过大。",[31,427,428],{},"特征维度多，存储和拉取成本高。",[31,430,431],{},"特征版本变更影响模型兼容性。",[31,433,434],{},"缺失值、异常值、分布漂移难以及时发现。",[21,436,437],{"id":437},"实时特征和离线特征如何保证一致",[10,439,440],{},"这是推荐架构岗很容易加分的问题。",[10,442,443],{},"核心答案：",[28,445,446,449,452,455,458,461],{},[31,447,448],{},"统一特征定义，避免训练和线上各写一套逻辑。",[31,450,451],{},"统一样本口径，曝光、点击、转化等事件定义要一致。",[31,453,454],{},"特征版本管理，模型依赖的特征版本要可追踪。",[31,456,457],{},"离线回放校验，用历史日志回放实时计算逻辑。",[31,459,460],{},"监控特征分布漂移，比如均值、方差、缺失率、Top 值变化。",[31,462,463],{},"训练和在线尽量复用同一套 feature transform 逻辑。",[10,465,466],{},"可以总结成一句：",[236,468,469],{},[10,470,471],{},"推荐系统里最怕 training-serving skew，也就是训练时看到的特征和线上服务时使用的特征口径不一致。解决思路是统一特征定义、统一计算逻辑、做版本管理，并通过离线回放和线上监控持续校验。",[21,473,475],{"id":474},"kafka-高频八股","Kafka 高频八股",[477,478,480],"h3",{"id":479},"kafka-为什么快","Kafka 为什么快",[10,482,483],{},"Kafka 快主要靠：",[28,485,486,489,492,499,502,505],{},[31,487,488],{},"顺序写磁盘。",[31,490,491],{},"利用 Page Cache。",[31,493,494,495,498],{},"零拷贝 ",[144,496,497],{},"sendfile","。",[31,500,501],{},"分区并行。",[31,503,504],{},"批量发送。",[31,506,507],{},"追加写日志结构。",[10,509,510],{},"标准回答：",[236,512,513],{},[10,514,515],{},"Kafka 并不是完全不落盘，而是通过顺序写把磁盘写入变成高吞吐操作。同时它充分利用操作系统 Page Cache，消费时可以通过零拷贝减少用户态和内核态之间的数据拷贝。再加上分区并行和批量发送，所以吞吐很高。",[477,517,519],{"id":518},"kafka-如何保证消息不丢","Kafka 如何保证消息不丢",[10,521,522],{},"按生产者、Broker、消费者三段回答：",[136,524,527],{"className":525,"code":526,"language":141,"meta":142},[139],"Producer:\n  acks=all\n  开启重试\n  开启幂等生产者\n\nBroker:\n  多副本机制\n  min.insync.replicas\n  合理配置 replication.factor\n\nConsumer:\n  处理完成后再提交 offset\n  业务侧幂等消费\n  必要时使用事务或去重表\n",[144,528,526],{"__ignoreMap":142},[477,530,532],{"id":531},"kafka-如何保证顺序","Kafka 如何保证顺序",[10,534,535],{},"一句话：",[236,537,538],{},[10,539,540,541,544],{},"Kafka 只能保证单分区内有序，多分区之间不保证全局顺序。如果要保证某个用户维度有序，可以用 ",[144,542,543],{},"user_id"," 作为 key，让同一用户的消息进入同一个分区。",[21,546,548],{"id":547},"flink-高频八股","Flink 高频八股",[477,550,552],{"id":551},"flink-exactly-once-怎么实现","Flink Exactly Once 怎么实现",[10,554,555],{},"核心是 checkpoint 和 sink 语义。",[136,557,560],{"className":558,"code":559,"language":141,"meta":142},[139],"Flink 定期做 checkpoint\n  -> 保存算子状态和 source offset\n  -> 失败后从最近一次 checkpoint 恢复\n  -> sink 端通过两阶段提交或幂等写入保证不重复生效\n",[144,561,559],{"__ignoreMap":142},[10,563,564],{},"面试时要补一句：Exactly Once 不是 Flink 单方面就能保证的，sink 也必须配合。",[477,566,568],{"id":567},"watermark-是什么","Watermark 是什么",[10,570,571],{},"Watermark 用来处理乱序事件时间。",[10,573,574],{},"可以这样讲：",[236,576,577],{},[10,578,579],{},"Watermark 表示系统认为某个事件时间之前的数据基本已经到齐，可以触发窗口计算。由于实际数据可能乱序到达，所以 watermark 一般会允许一定延迟。如果迟到数据超过了 watermark，可以结合 allowed lateness 或侧输出流处理。",[21,581,583],{"id":582},"redis-和缓存八股","Redis 和缓存八股",[477,585,587],{"id":586},"缓存穿透击穿雪崩","缓存穿透、击穿、雪崩",[59,589,590,603],{},[62,591,592],{},[65,593,594,597,600],{},[68,595,596],{},"问题",[68,598,599],{},"含义",[68,601,602],{},"解决方案",[75,604,605,616,627],{},[65,606,607,610,613],{},[80,608,609],{},"缓存穿透",[80,611,612],{},"查询不存在的数据，请求直接打到 DB",[80,614,615],{},"Bloom Filter、空值缓存、参数校验",[65,617,618,621,624],{},[80,619,620],{},"缓存击穿",[80,622,623],{},"热点 key 失效，大量请求打到 DB",[80,625,626],{},"互斥锁、逻辑过期、热点预热",[65,628,629,632,635],{},[80,630,631],{},"缓存雪崩",[80,633,634],{},"大量 key 同时失效",[80,636,637],{},"过期时间加随机值、多级缓存、限流降级",[477,639,641],{"id":640},"redis-常见数据结构","Redis 常见数据结构",[59,643,644,654],{},[62,645,646],{},[65,647,648,651],{},[68,649,650],{},"数据结构",[68,652,653],{},"推荐场景中的用法",[75,655,656,664,672,680,688,695,703],{},[65,657,658,661],{},[80,659,660],{},"String",[80,662,663],{},"普通缓存、计数器",[65,665,666,669],{},[80,667,668],{},"Hash",[80,670,671],{},"用户画像、物品属性",[65,673,674,677],{},[80,675,676],{},"Set",[80,678,679],{},"去重、兴趣集合",[65,681,682,685],{},[80,683,684],{},"ZSet",[80,686,687],{},"排行榜、按时间排序",[65,689,690,692],{},[80,691,346],{},[80,693,694],{},"曝光记录、签到、布尔状态",[65,696,697,700],{},[80,698,699],{},"HyperLogLog",[80,701,702],{},"UV 粗略估算",[65,704,705,708],{},[80,706,707],{},"Stream",[80,709,710],{},"轻量消息流",[21,712,713],{"id":713},"高并发服务治理",[477,715,716],{"id":716},"限流算法",[59,718,719,728],{},[62,720,721],{},[65,722,723,726],{},[68,724,725],{},"算法",[68,727,185],{},[75,729,730,738,746,754],{},[65,731,732,735],{},[80,733,734],{},"固定窗口",[80,736,737],{},"简单，但窗口边界可能突刺",[65,739,740,743],{},[80,741,742],{},"滑动窗口",[80,744,745],{},"更平滑，统计更准确",[65,747,748,751],{},[80,749,750],{},"漏桶",[80,752,753],{},"稳定流出，削峰效果好",[65,755,756,759],{},[80,757,758],{},"令牌桶",[80,760,761],{},"允许短时间突发，工程中很常用",[477,763,764],{"id":764},"熔断和降级",[10,766,767],{},"熔断和降级经常一起出现，但含义不一样：",[28,769,770,773],{},[31,771,772],{},"熔断：下游持续异常时，主动切断调用，避免故障扩散。",[31,774,775],{},"降级：返回兜底结果，牺牲部分效果保证核心服务可用。",[10,777,778],{},"推荐系统的降级例子：",[28,780,781,784,787,790],{},[31,782,783],{},"精排模型超时，退化为粗排结果。",[31,785,786],{},"个性化召回失败，退化为热门召回。",[31,788,789],{},"实时特征不可用，使用离线特征或默认特征。",[31,791,792],{},"重排服务异常，直接返回精排 TopN。",[477,794,796],{"id":795},"rpc-超时和重试","RPC 超时和重试",[10,798,799],{},"核心原则：",[28,801,802,805,808,811,814],{},[31,803,804],{},"所有下游调用必须设置超时。",[31,806,807],{},"重试只适合幂等请求。",[31,809,810],{},"重试要限制次数，并使用退避策略。",[31,812,813],{},"避免重试放大流量导致雪崩。",[31,815,816],{},"核心链路要结合限流、熔断、降级。",[10,818,819],{},"面试可以这样说：",[236,821,822],{},[10,823,824],{},"在推荐主链路里，一个请求可能 fan-out 到多个下游服务。如果没有超时和重试控制，慢下游会拖垮整个链路；如果盲目重试，又会把流量放大。因此我会给每个下游设置独立 timeout，只对幂等请求做有限重试，并配合熔断和降级保证主链路可用。",[21,826,827],{"id":827},"操作系统必背",[10,829,830],{},"推荐架构岗虽然偏业务系统，但 OS 基础仍然会问。",[10,832,833],{},"重点清单：",[28,835,836,839,842,845,848,851,854,857,860,863,876,879],{},[31,837,838],{},"进程和线程区别。",[31,840,841],{},"用户态和内核态。",[31,843,844],{},"上下文切换。",[31,846,847],{},"虚拟内存。",[31,849,850],{},"分页和分段。",[31,852,853],{},"缺页中断。",[31,855,856],{},"堆和栈区别。",[31,858,859],{},"锁、互斥量、信号量、条件变量。",[31,861,862],{},"死锁四个条件。",[31,864,865,868,869,868,872,875],{},[144,866,867],{},"select"," \u002F ",[144,870,871],{},"poll",[144,873,874],{},"epoll"," 区别。",[31,877,878],{},"同步、异步、阻塞、非阻塞。",[31,880,881],{},"零拷贝。",[477,883,885],{"id":884},"epoll-怎么讲","epoll 怎么讲",[10,887,510],{},[236,889,890],{},[10,891,892,894,895,897,898,900],{},[144,893,867],{}," 和 ",[144,896,871],{}," 每次都要把 fd 集合从用户态传到内核态，并线性遍历所有 fd，连接数大时开销很高。",[144,899,874],{}," 把 fd 注册到内核，事件就绪后加入就绪队列，应用只需要取就绪事件，更适合大规模连接场景。",[21,902,903],{"id":903},"计算机网络必背",[10,905,833],{},[28,907,908,911,914,917,920,923,926,929,932],{},[31,909,910],{},"TCP 三次握手、四次挥手。",[31,912,913],{},"TCP 如何保证可靠传输。",[31,915,916],{},"拥塞控制：慢启动、拥塞避免、快重传、快恢复。",[31,918,919],{},"TIME_WAIT 为什么存在。",[31,921,922],{},"HTTP\u002F1.1、HTTP\u002F2、HTTP\u002F3 区别。",[31,924,925],{},"HTTPS 握手过程。",[31,927,928],{},"DNS 解析过程。",[31,930,931],{},"长连接和短连接。",[31,933,934],{},"负载均衡策略。",[10,936,937],{},"推荐服务里可以这样关联：",[236,939,940],{},[10,941,942],{},"推荐链路涉及多个下游 RPC 调用，网络延迟会直接影响整体 P99。因此工程上需要连接池、超时控制、并发请求、服务发现、负载均衡和降级策略。",[21,944,945],{"id":945},"数据库与存储",[477,947,949],{"id":948},"mysql-索引为什么快","MySQL 索引为什么快",[10,951,952],{},"InnoDB 使用 B+ 树索引。",[10,954,955],{},"核心点：",[28,957,958,961,964,967],{},[31,959,960],{},"B+ 树层高低，磁盘 IO 次数少。",[31,962,963],{},"非叶子节点只存 key，扇出高。",[31,965,966],{},"叶子节点有序，适合范围查询。",[31,968,969],{},"InnoDB 聚簇索引叶子节点存整行数据。",[477,971,972],{"id":972},"聚簇索引和非聚簇索引",[10,974,234],{},[236,976,977],{},[10,978,979],{},"InnoDB 的主键索引是聚簇索引，叶子节点存整行数据。二级索引的叶子节点存主键值，如果查询字段不在二级索引里，需要根据主键再查一次聚簇索引，这个过程叫回表。",[477,981,983],{"id":982},"mvcc-是什么","MVCC 是什么",[236,985,986],{},[10,987,988],{},"MVCC 通过版本链和 Read View 实现并发读写。读操作可以读取历史版本，减少读写锁冲突。InnoDB 在可重复读隔离级别下通过 MVCC 保证同一个事务内多次快照读结果一致。",[477,990,992],{"id":991},"lsm-tree-适合什么场景","LSM Tree 适合什么场景",[10,994,995],{},"LSM Tree 常见于 RocksDB、LevelDB，也经常出现在高吞吐写入、特征存储、状态后端里。",[136,997,1000],{"className":998,"code":999,"language":141,"meta":142},[139],"写入先进入 MemTable\n  -> 刷盘成 SSTable\n  -> 后台 Compaction 合并\n",[144,1001,999],{"__ignoreMap":142},[10,1003,1004],{},"优点是写入性能高，缺点是读可能需要查多层结构，所以通常配合 Bloom Filter、索引块和 Compaction 优化。",[21,1006,122],{"id":122},[477,1008,1010],{"id":1009},"cap","CAP",[10,1012,1013],{},"CAP 分别是：",[28,1015,1016,1019,1022],{},[31,1017,1018],{},"C：一致性。",[31,1020,1021],{},"A：可用性。",[31,1023,1024],{},"P：分区容错性。",[10,1026,1027],{},"分布式系统必须考虑网络分区，所以通常是在 CP 和 AP 之间权衡。",[10,1029,1030],{},"面试时不要只背定义，要能落到场景：",[236,1032,1033],{},[10,1034,1035],{},"推荐系统里，用户曝光去重、计数、特征更新很多时候可以接受最终一致性；但账户、支付、权限这类数据就更偏强一致。不同数据要按业务后果选择一致性模型。",[477,1037,1038],{"id":1038},"一致性哈希",[10,1040,1041],{},"一致性哈希解决节点变化导致大量 key 迁移的问题。",[10,1043,1044],{},"普通 hash：",[136,1046,1049],{"className":1047,"code":1048,"language":141,"meta":142},[139],"hash(key) % N\n",[144,1050,1048],{"__ignoreMap":142},[10,1052,1053],{},"当节点数 N 改变，大量 key 都会重新映射。",[10,1055,1056],{},"一致性哈希把节点和 key 映射到同一个 hash 环上，节点增删时主要影响相邻区间。虚拟节点可以缓解数据倾斜。",[477,1058,1059],{"id":1059},"多机房推荐系统",[10,1061,1062],{},"岗位描述里提到「多数据中心」和「全球化一体推荐系统」，可以准备一版回答：",[136,1064,1067],{"className":1065,"code":1066,"language":141,"meta":142},[139],"用户请求就近接入\n  -> 本地机房提供在线推荐服务\n  -> 用户近期行为本地实时写入\n  -> 关键数据跨机房同步\n  -> 非关键特征最终一致\n  -> 故障时流量切换到其他机房\n",[144,1068,1066],{"__ignoreMap":142},[10,1070,1071],{},"关键词：",[28,1073,1074,1077,1080,1083,1086,1089,1092,1095],{},[31,1075,1076],{},"就近访问。",[31,1078,1079],{},"多活部署。",[31,1081,1082],{},"流量调度。",[31,1084,1085],{},"数据同步。",[31,1087,1088],{},"跨机房延迟。",[31,1090,1091],{},"故障切换。",[31,1093,1094],{},"最终一致性。",[31,1096,1097],{},"核心数据强一致，非核心数据最终一致。",[21,1099,1100],{"id":1100},"算法题准备方向",[10,1102,1103],{},"字节实习很看算法，不能只背八股。",[10,1105,1106],{},"重点题型：",[28,1108,1109,1112,1115,1118,1121,1124,1127,1130],{},[31,1110,1111],{},"数组：双指针、滑动窗口、前缀和。",[31,1113,1114],{},"链表：反转、合并、环检测。",[31,1116,1117],{},"栈队列：单调栈、括号匹配。",[31,1119,1120],{},"二叉树：DFS、BFS、最近公共祖先。",[31,1122,1123],{},"图：拓扑排序、最短路、并查集。",[31,1125,1126],{},"堆：TopK、合并 K 路。",[31,1128,1129],{},"动态规划：背包、子序列、区间 DP。",[31,1131,1132],{},"字符串：滑动窗口、哈希，KMP 可了解。",[10,1134,1135],{},"推荐必刷：",[28,1137,1138,1141,1144,1147,1150,1153,1156,1159,1162,1165,1168],{},[31,1139,1140],{},"LRU Cache。",[31,1142,1143],{},"Top K 高频元素。",[31,1145,1146],{},"合并 K 个有序链表。",[31,1148,1149],{},"最长无重复子串。",[31,1151,1152],{},"接雨水。",[31,1154,1155],{},"岛屿数量。",[31,1157,1158],{},"课程表。",[31,1160,1161],{},"二叉树层序遍历。",[31,1163,1164],{},"最长递增子序列。",[31,1166,1167],{},"编辑距离。",[31,1169,1170],{},"买卖股票。",[21,1172,1173],{"id":1173},"项目包装模板",[10,1175,1176],{},"推荐架构岗很喜欢听系统性表达。讲项目时不要只说「我实现了某功能」，要讲清楚背景、架构、难点、优化和结果。",[10,1178,1179],{},"模板：",[136,1181,1184],{"className":1182,"code":1183,"language":141,"meta":142},[139],"项目背景：解决什么业务问题？\n系统架构：有哪些模块？数据怎么流动？\n我的职责：负责哪块？\n技术难点：高并发、延迟、数据一致性、存储压力、可用性？\n优化方案：用了什么缓存、异步、批处理、索引、分片、降级？\n结果指标：延迟降低多少、吞吐提升多少、资源节省多少？\n复盘：如果重做，会怎么改？\n",[144,1185,1183],{"__ignoreMap":142},[10,1187,1188],{},"推荐架构岗加分词：",[136,1190,1193],{"className":1191,"code":1192,"language":141,"meta":142},[139],"P99 延迟\nQPS\n吞吐\n缓存命中率\n数据一致性\n实时性\n幂等\n可观测性\n降级\n灰度发布\nA\u002FB 实验\n特征回流\n样本构造\n",[144,1194,1192],{"__ignoreMap":142},[21,1196,1197],{"id":1197},"自我介绍模板",[10,1199,1200],{},"可以按这个版本改：",[236,1202,1203,1206,1209],{},[10,1204,1205],{},"面试官您好，我是 XXX，目前是 2027 届计算机相关专业学生。",[10,1207,1208],{},"我主要熟悉 XXX 语言，基础方面比较重视数据结构、操作系统、网络和数据库。项目上我做过 XXX，涉及到高并发服务 \u002F 数据处理 \u002F 推荐相关模块。在这个项目中，我主要负责 XXX，重点解决了 XXX 问题，比如通过缓存、异步处理、批量写入、限流降级等方式优化系统性能。",[10,1210,1211],{},"我对推荐系统背后的工程架构比较感兴趣，尤其是在线预估、实时特征、数据回流和高可用服务这些方向。这个岗位和我的兴趣比较匹配，所以希望有机会深入参与大规模推荐系统架构的研发。",[21,1213,1215],{"id":1214},"_7-天冲刺路线","7 天冲刺路线",[10,1217,1218],{},"如果时间只有一周，可以这样安排：",[59,1220,1221,1231],{},[62,1222,1223],{},[65,1224,1225,1228],{},[68,1226,1227],{},"时间",[68,1229,1230],{},"重点",[75,1232,1233,1241,1249,1257,1265,1273,1281],{},[65,1234,1235,1238],{},[80,1236,1237],{},"Day 1",[80,1239,1240],{},"算法高频题 + 复杂度分析",[65,1242,1243,1246],{},[80,1244,1245],{},"Day 2",[80,1247,1248],{},"操作系统 + 网络",[65,1250,1251,1254],{},[80,1252,1253],{},"Day 3",[80,1255,1256],{},"MySQL + Redis + 缓存问题",[65,1258,1259,1262],{},[80,1260,1261],{},"Day 4",[80,1263,1264],{},"Kafka + Flink + 实时计算",[65,1266,1267,1270],{},[80,1268,1269],{},"Day 5",[80,1271,1272],{},"推荐系统架构 + 特征平台",[65,1274,1275,1278],{},[80,1276,1277],{},"Day 6",[80,1279,1280],{},"分布式系统 + 高可用设计",[65,1282,1283,1286],{},[80,1284,1285],{},"Day 7",[80,1287,1288],{},"项目复盘 + 模拟面试",[10,1290,1291],{},"如果还要进一步压缩优先级，最值得押注的是：",[136,1293,1296],{"className":1294,"code":1295,"language":141,"meta":142},[139],"推荐系统链路\n特征服务\nKafka \u002F Flink 实时数据链路\nRedis 缓存与去重\n高并发服务治理\n操作系统和网络基础\n算法题手感\n",[144,1297,1295],{"__ignoreMap":142},[21,1299,1300],{"id":1300},"最后总结",[10,1302,1303],{},"这个岗位的核心不是「我懂推荐算法」，而是：",[136,1305,1308],{"className":1306,"code":1307,"language":141,"meta":142},[139],"我理解推荐系统的在线链路和数据链路；\n我知道大规模特征、样本、模型服务怎么支撑推荐业务；\n我能从高并发、高可用、低延迟、可扩展的角度设计系统；\n我能把业务逻辑抽象成稳定的工程组件。\n",[144,1309,1307],{"__ignoreMap":142},[10,1311,1312],{},"面试表达上，要尽量把答案从单点八股提升到系统语境里。比如讲 Redis 不只讲数据结构，也讲曝光去重和特征缓存；讲 Kafka 不只讲消息队列，也讲行为日志回流；讲 Flink 不只讲 watermark，也讲实时特征；讲限流降级不只讲概念，也讲推荐主链路怎么兜底。",[10,1314,1315],{},"这就是推荐架构团队最想看到的工程能力。",{"title":142,"searchDepth":1317,"depth":1318,"links":1319},2,3,[1320,1321,1322,1323,1324,1325,1326,1327,1332,1336,1340,1345,1348,1349,1355,1360,1361,1362,1363,1364],{"id":23,"depth":1317,"text":23},{"id":128,"depth":1317,"text":128},{"id":163,"depth":1317,"text":164},{"id":243,"depth":1317,"text":243},{"id":296,"depth":1317,"text":296},{"id":384,"depth":1317,"text":384},{"id":437,"depth":1317,"text":437},{"id":474,"depth":1317,"text":475,"children":1328},[1329,1330,1331],{"id":479,"depth":1318,"text":480},{"id":518,"depth":1318,"text":519},{"id":531,"depth":1318,"text":532},{"id":547,"depth":1317,"text":548,"children":1333},[1334,1335],{"id":551,"depth":1318,"text":552},{"id":567,"depth":1318,"text":568},{"id":582,"depth":1317,"text":583,"children":1337},[1338,1339],{"id":586,"depth":1318,"text":587},{"id":640,"depth":1318,"text":641},{"id":713,"depth":1317,"text":713,"children":1341},[1342,1343,1344],{"id":716,"depth":1318,"text":716},{"id":764,"depth":1318,"text":764},{"id":795,"depth":1318,"text":796},{"id":827,"depth":1317,"text":827,"children":1346},[1347],{"id":884,"depth":1318,"text":885},{"id":903,"depth":1317,"text":903},{"id":945,"depth":1317,"text":945,"children":1350},[1351,1352,1353,1354],{"id":948,"depth":1318,"text":949},{"id":972,"depth":1318,"text":972},{"id":982,"depth":1318,"text":983},{"id":991,"depth":1318,"text":992},{"id":122,"depth":1317,"text":122,"children":1356},[1357,1358,1359],{"id":1009,"depth":1318,"text":1010},{"id":1038,"depth":1318,"text":1038},{"id":1059,"depth":1318,"text":1059},{"id":1100,"depth":1317,"text":1100},{"id":1173,"depth":1317,"text":1173},{"id":1197,"depth":1317,"text":1197},{"id":1214,"depth":1317,"text":1215},{"id":1300,"depth":1317,"text":1300},[1366],"技术","2026-06-09","面向字节跳动推荐架构团队实习岗位的八股准备清单，覆盖推荐系统链路、实时数据、特征服务、高并发后端、分布式系统与项目包装。",false,"md",{},true,"\u002Fposts\u002Fbytedance-recommendation-architecture-intern-interview",{"title":5,"description":1368},"posts\u002Fbytedance-recommendation-architecture-intern-interview",[1377,106,98,1378,1379],"面试","实时计算","字节跳动","aBNJa08LLddY33ljj9szsiVkx-Y5eFjbsRUv4QJ8udU",[1382,1396,1409,1416,1420,1430,1440,1450,1461,1470,1480,1492,1505,1516,1525,1535,1548,1559,1569,1577,1588,1595,1601,1607,1616,1626,1634,1640,1648,1656],{"slug":1383,"path":1384,"title":1385,"date":1386,"tags":1387,"description":142,"draft":1369,"hidden":1369,"published":1372,"readingTime":1395},"multimodal-rag-from-scratch","\u002Fposts\u002Fmultimodal-rag-from-scratch","从零实现多模态 RAG：BM25、Dense 检索、RRF 融合、MMR 重排全部手写","2026-06-30 18:00:00",[1388,1389,1390,1391,1392,1393,1394],"RAG","多模态","AI Infra","BM25","向量检索","混合检索","实习求职",9,{"slug":1397,"path":1398,"title":1399,"date":1400,"tags":1401,"description":142,"draft":1369,"hidden":1369,"published":1372,"readingTime":1408},"mini-llm-engine-deep-dive","\u002Fposts\u002Fmini-llm-engine-deep-dive","讲透 mini-llm-engine：从显存碎片到六大推理优化","2026-06-30 14:00:00",[1402,1390,1403,1404,1405,1406,1407,1394],"LLM","vLLM","PagedAttention","KV Cache","推理优化","投机解码",11,{"slug":1410,"path":1411,"title":1412,"date":1413,"tags":1414,"description":142,"draft":1369,"hidden":1369,"published":1372,"readingTime":1415},"mini-llm-engine-from-scratch","\u002Fposts\u002Fmini-llm-engine-from-scratch","从零实现 LLM 推理引擎：深挖 vLLM 的六大核心优化","2026-06-30 10:00:00",[1402,1390,1403,1404,1406,1407,1394],10,{"slug":1417,"path":1373,"title":5,"date":1367,"tags":1418,"description":1368,"draft":1369,"hidden":1369,"published":1372,"readingTime":1419},"bytedance-recommendation-architecture-intern-interview",[1377,106,98,1378,1379],18,{"slug":1421,"path":1422,"title":1423,"date":1367,"tags":1424,"description":1428,"draft":1369,"hidden":1369,"published":1372,"readingTime":1429},"high-concurrency-rate-limiting-algorithms","\u002Fposts\u002Fhigh-concurrency-rate-limiting-algorithms","高并发限流算法：固定窗口、滑动窗口、漏桶与令牌桶",[1425,1426,98,1427,1377],"高并发","限流","系统设计","面试和工程都常见的限流算法总结，讲清楚固定窗口、滑动窗口、漏桶、令牌桶、并发数限制以及分布式限流如何落地。",12,{"slug":1431,"path":1432,"title":1433,"date":1367,"tags":1434,"description":1438,"draft":1369,"hidden":1369,"published":1372,"readingTime":1439},"kafka-producer-broker-consumer","\u002Fposts\u002Fkafka-producer-broker-consumer","Kafka 入门：生产者、Broker、消费者和“消费”到底是什么意思",[1435,1436,1437,1377,106],"Kafka","消息队列","后端","用推荐系统里的用户行为日志为例，讲清楚 Kafka 的作用、Producer、Broker、Consumer、Topic、Partition、Offset 和消费语义。",8,{"slug":1441,"path":1442,"title":1443,"date":1367,"tags":1444,"description":1448,"draft":1369,"hidden":1369,"published":1372,"readingTime":1449},"leetcode-lru-merge-k-reverse-list","\u002Fposts\u002Fleetcode-lru-merge-k-reverse-list","链表与缓存高频题：LRU Cache、合并 K 个有序链表、反转链表",[725,1445,1446,1447,1377],"链表","LRU","LeetCode","面试高频算法题速记，整理 LRU Cache、合并 K 个有序链表、反转链表的核心思路、复杂度和 C++ 代码。",6,{"slug":1451,"path":1452,"title":1453,"date":1454,"tags":1455,"description":142,"draft":1369,"hidden":1369,"published":1372,"readingTime":1460},"meddococr-interpreter-source-analysis","\u002Fposts\u002Fmeddococr-interpreter-source-analysis","MedDocOCR-Interpreter 源码导读：医疗文档 OCR、结构化抽取与报告解读原型","2026-05-22 10:30:00",[1456,1389,1457,1388,1458,1459],"OCR","医疗 AI","Python","源码分析",16,{"slug":1462,"path":1463,"title":1464,"date":1465,"tags":1466,"description":142,"draft":1369,"hidden":1369,"published":1372,"readingTime":1415},"cet6-writing-model-essays","\u002Fposts\u002Fcet6-writing-model-essays","六级写作范文背诵包：10 个高频话题","2026-05-20 09:00:00",[1467,1468,1469],"English","CET6","Writing",{"slug":1471,"path":1472,"title":1473,"date":1474,"tags":1475,"description":142,"draft":1369,"hidden":1369,"published":1372,"readingTime":1479},"claude-code-context-management","\u002Fposts\u002Fclaude-code-context-management","Claude Code 上下文管理机制：从 Microcompact 到 Auto Compact","2026-05-19 10:00:00",[1476,1477,1402,1390,1478],"Claude Code","Agent","上下文工程",27,{"slug":1481,"path":1482,"title":1483,"date":1484,"tags":1485,"description":142,"draft":1369,"hidden":1369,"published":1372,"readingTime":1491},"nanotron-llm-pretraining-framework-analysis","\u002Fposts\u002Fnanotron-llm-pretraining-framework-analysis","Nanotron 项目详解：Hugging Face 的大模型预训练框架怎么做分布式训练","2026-05-10 12:10:00",[1402,1486,1487,1488,1489,1390,1490],"大模型训练","分布式训练","Nanotron","Hugging Face","PyTorch",19,{"slug":1493,"path":1494,"title":1495,"date":1496,"tags":1497,"description":142,"draft":1369,"hidden":1369,"published":1372,"readingTime":1504},"gofoundry-go-backend-foundation-framework","\u002Fposts\u002Fgofoundry-go-backend-foundation-framework","GoFoundry 项目详解：基于 Go 的后端基础框架套件设计","2026-05-10 11:20:00",[1498,1499,1500,1501,1502,1436,1503],"Go","后端框架","ORM","分布式缓存","分布式锁","项目架构",25,{"slug":1506,"path":1507,"title":1508,"date":1509,"tags":1510,"description":142,"draft":1369,"hidden":1369,"published":1372,"readingTime":1479},"cloudvault-go-cloud-storage-system","\u002Fposts\u002Fcloudvault-go-cloud-storage-system","CloudVault 项目详解：基于 Go 的云端存储与网盘系统架构设计","2026-05-10 10:30:00",[1498,1511,1512,122,1503,1513,1514,1515],"云存储","网盘系统","Redis","RabbitMQ","Elasticsearch",{"slug":1517,"path":1518,"title":1519,"date":1520,"tags":1521,"description":142,"draft":1369,"hidden":1369,"published":1372,"readingTime":1524},"openclaw-source-code-analysis","\u002Fposts\u002Fopenclaw-source-code-analysis","OpenClaw 源码导读：个人 AI 助手的网关、通道、插件与运行时架构","2026-05-08 16:30:00",[1522,1477,1390,1523,1459],"OpenClaw","TypeScript",20,{"slug":1526,"path":1527,"title":1528,"date":1529,"tags":1530,"description":142,"draft":1369,"hidden":1369,"published":1372,"readingTime":1415},"flow-matching-generative-models","\u002Fposts\u002Fflow-matching-generative-models","Flow Matching：从噪声到数据的连续流生成模型","2026-05-07 00:00:00",[1531,1532,1533,1534],"生成模型","Diffusion","Flow Matching","深度学习",{"slug":1536,"path":1537,"title":1538,"date":1539,"tags":1540,"description":142,"draft":1369,"hidden":1369,"published":1372,"readingTime":1547},"database-ai-week4","\u002Fposts\u002Fdatabase-ai-week4","Week 4：数据库速成——从 Storage、Index、Query Optimization 到 Vector DB 与 RAG","2026-05-05 12:00:00",[1541,1542,1543,1388,1544,1545,1546],"数据库","CMU 15-445","Vector DB","LLM Memory","Query Optimization","Caching",15,{"slug":1549,"path":1550,"title":1551,"date":1552,"tags":1553,"description":142,"draft":1369,"hidden":1369,"published":1372,"readingTime":1460},"distributed-systems-week3","\u002Fposts\u002Fdistributed-systems-week3","Week 3：分布式系统速成——MapReduce、Raft、容错与 Distributed KV Store","2026-05-05 11:00:00",[122,1554,1555,1556,1557,1558,1477],"MIT 6.824","MapReduce","Raft","KV Store","Ray",{"slug":1560,"path":1561,"title":1562,"date":1563,"tags":1564,"description":142,"draft":1369,"hidden":1369,"published":1372,"readingTime":1547},"gpu-inference-acceleration-week2","\u002Fposts\u002Fgpu-inference-acceleration-week2","Week 2：GPU 与推理加速——从 Kernel、算子融合到 LLM Serving","2026-05-05 10:00:00",[1534,1565,1566,1402,1567,1403,1568],"GPU","推理加速","CMU 10-414","TensorRT",{"slug":1570,"path":1571,"title":1572,"date":1573,"tags":1574,"description":142,"draft":1369,"hidden":1369,"published":1372,"readingTime":1419},"dl-framework-autograd-mini","\u002Fposts\u002Fdl-framework-autograd-mini","Week 1：DL 框架与 Autograd——从计算图、反向传播到 Mini Autograd 实现","2026-05-05 09:00:00",[1534,1575,1490,1567,1576],"Autograd","Mini Framework",{"slug":1578,"path":1579,"title":1580,"date":1581,"tags":1582,"description":142,"draft":1369,"hidden":1369,"published":1372,"readingTime":1429},"lock-free-concurrency-notes","\u002Fposts\u002Flock-free-concurrency-notes","无锁并发入门：从 CAS 到 Atomic Ring Buffer","2026-04-25",[1583,1584,1585,1586,1587],"C++","并发","无锁编程","性能优化","量化开发",{"slug":1589,"path":1590,"title":1591,"date":1592,"tags":1593,"description":142,"draft":1369,"hidden":1369,"published":1372,"readingTime":1594},"agent-memory","\u002Fposts\u002Fagent-memory","Agent 对话记忆化：从原理到实现","2026-04-24",[1402,1477,1388,1377],5,{"slug":1596,"path":1597,"title":1598,"date":1592,"tags":1599,"description":142,"draft":1369,"hidden":1369,"published":1372,"readingTime":1449},"llm-context-compression","\u002Fposts\u002Fllm-context-compression","LLM 上下文五层压缩机制详解",[1402,1477,1600,1377],"上下文压缩",{"slug":1602,"path":1603,"title":1604,"date":1605,"tags":1606,"description":142,"draft":1369,"hidden":1369,"published":1372,"readingTime":1395},"cpp-concurrency-basics","\u002Fposts\u002Fcpp-concurrency-basics","C++ 并发编程入门：从数据竞争到线程池","2026-04-15",[1583,1584,1377,1587],{"slug":1608,"path":1609,"title":1610,"date":1611,"tags":1612,"description":142,"draft":1369,"hidden":1369,"published":1372,"readingTime":1615},"travel-in-shenzhen","\u002Fposts\u002Ftravel-in-shenzhen","XCPC 深圳游记","2026-04-13",[1613,1583,1614],"XCPC","比赛",1,{"slug":1617,"path":1618,"title":1619,"date":1620,"tags":1621,"description":142,"draft":1369,"hidden":1369,"published":1372,"readingTime":1625},"backend-stack-deep-dive","\u002Fposts\u002Fbackend-stack-deep-dive","后端五件套：FastAPI \u002F Node.js \u002F SQLAlchemy async \u002F PostgreSQL \u002F Docker 面试速通","2026-04-07",[1437,1622,1623,1624,1377],"FastAPI","PostgreSQL","Docker",7,{"slug":1627,"path":1628,"title":1629,"date":1630,"tags":1631,"description":142,"draft":1369,"hidden":1369,"published":1372,"readingTime":1449},"deepscientist-tech-stack","\u002Fposts\u002Fdeepscientist-tech-stack","DeepScientist 技术栈全解析：一个 AI 科研平台的架构设计","2026-04-06",[1632,1622,1633,1623,1377],"全栈","Next.js",{"slug":1635,"path":1636,"title":1637,"date":1630,"tags":1638,"description":142,"draft":1369,"hidden":1369,"published":1372,"readingTime":1439},"minicode-source-analysis","\u002Fposts\u002Fminicode-source-analysis","MiniCode 源码解析：用 5000 行 TypeScript 实现一个 AI 编程助手",[1523,1639,1402,1459,1377],"CLI",{"slug":1641,"path":1642,"title":1643,"date":1630,"tags":1644,"description":142,"draft":1369,"hidden":1369,"published":1372,"readingTime":1594},"nova-theme-implementation","\u002Fposts\u002Fnova-theme-implementation","我是怎么从零实现 Nova 主题的",[1645,1646,1647],"Hexo","前端","开源",{"slug":1649,"path":1650,"title":1651,"date":1652,"tags":1653,"description":142,"draft":1369,"hidden":1369,"published":1372,"readingTime":1317},"git-cheatsheet","\u002Fposts\u002Fgit-cheatsheet","Git 常用操作备忘","2026-04-05 14:00:00",[1654,1655],"Git","工具",{"slug":1657,"path":1658,"title":1659,"date":1660,"tags":1661,"description":142,"draft":1369,"hidden":1369,"published":1372,"readingTime":1318},"github-actions-intro","\u002Fposts\u002Fgithub-actions-intro","GitHub Actions 入门：自动化你的工作流","2026-04-04 09:00:00",[1662,1663,1664],"GitHub Actions","CI\u002FCD","自动化",1782796011451]