[{"content":"一句话结论 纳指100 从 10 月 13 日的 30569.48 回落到 10 月 15 日的 29935.59，跌回 30000 关口下方。现在的问题不是趋势坏了，而是支撑这轮上涨的两个前提——低成本资金、AI 叙事无摩擦——同时开始松动。\n短期我偏向高位宽幅震荡（约 28500–31000）；中期方向不取决于「AI 是不是泡沫」，而取决于两个可验证的变量：加息是否真的止步、AI 资本开支能否继续上修并兑现。\n下面这张图是纳斯达克100（NDX）的实时走势（打开页面时现取，不是静态快照）：\n行情加载中… 一、先定位：我们现在站在哪 指标 数值 含义 纳指100（NDX100） 29935.59 已跌破 30000 整数关 近期高点 30569.48（10-13） 距高点约 -2.1% 纳指综合 26713.03 距 10-06 历史新高 -3.2%，年内 +14.9% 10 年期美债收益率 5.100% 30 年期曾触及 5.53%，2004 年以来最高 联邦基金利率 3.75%–4.00% 9 月 16 日加息 25bp，2023 年 7 月以来首次 通胀 PCE 3.7% / 核心 3.4% 高于预期，黏性没有解除 纳指100 动态市盈率 约 29–30 倍（PB 约 9.5 倍） PE 分位不高，但 PB 分位已明显偏高 黄金 / 原油 / 美元指数 4208 / 95 / 101.8 黄金创新高、油价高企 一句话概括坐标：指数还在高位、回撤很浅，但它的两个前提都已经松动了。\n二、分析框架：分子、分母、风险偏好 指数可以拆成三件事：盈利（分子）、利率（分母）、风险偏好（权重）。三者当前的处境并不一样。\n分子——目前仍是最强的一根支柱。 超大规模云厂商 2026 年的 AI 资本开支预计同比增长约 34% 至 4400 亿美元；英伟达上一财年营收 2159 亿美元、净利润约 1200 亿美元（均同比 +65%）；谷歌云单季同比 +82%、经营利润率 35.6%。卖方也在上修纳指的盈利增速预期。这不是纯故事，是真金白银的现金流。\n分母——正在系统性恶化。 加息周期重启、通胀黏性、油价站上 95–100 美元（地缘因素），共同推高贴现率。30 年期美债一度触及 5.53%，是 2004 年以来的最高水平；而成长股对长端利率的敏感度是所有板块里最高的。市场对政策路径的定价，也已从「还会降几次」翻转成「可能还要加」。\n风险偏好——最脆弱的一环。 涨幅宽度极窄：过去一年纳指100 中涨幅前十的个股平均上涨约 784%，集中度已接近历史极值。同时「AI 泡沫」这个说法被交易化了——它不再是学术讨论，而是可以直接下注的题材。日内振幅从 1.7% 放大到 1.93%，这是分歧在放大，而不是趋势在延续。\n三、情景推演：三个情景 情景 主观权重 触发条件 NDX100 目标 基准：高位宽幅震荡 约 50% FOMC 措辞偏「观察期」，云厂商 capex 维持上修；10 年期在 5.0–5.3% 反复 区间 28500–31000，重心 29500–30000 乐观：软着陆 + AI 兑现 约 25% 不再加息且措辞转温和 / 10 年期回落到 4.7% 下方 / 龙头财报「超预期 + 上调指引」 重上 30569，指向 31500–31900 悲观：二次通胀或叙事破裂 约 25% 年内再加息 / 10 年期有效站上 5.3% / 某龙头下修 capex 或财报暴雷 / 市场宽度继续恶化 跌破 28125 → 27000–27500；极端情形 25000 区间 权重的依据： 分子端还在向上走，所以不给太高的悲观权重；分母端在恶化，所以也不给太高的乐观权重。在基准情景内部，我略偏向「震荡之后向下试探」——因为分母的变化是已经发生的事实，而分子的兑现是尚未验证的预期。预期被证伪的代价，通常比事实被确认的收益更大。\n四、需要盯住的六个信号 按重要性排序：\n10 月 27–28 日 FOMC 的措辞，而不是加不加。 市场已经把 10 月加息的概率压到两成以下，所以「按兵不动」本身不是利好；声明里有没有保留「进一步加息选项」这句话，才是关键。 10 年期美债在 5.10% 这个位置怎么走。 有效站上 5.3%，估值端会再挨一刀；回落到 4.7% 以下，风险偏好会立刻修复。这是整个逻辑的总开关。 云厂商 capex 指引的方向。 上修意味着分子端有支撑；下修则意味着半导体与 AI 硬件链会先杀估值。这是 AI 叙事的燃料表。 市值加权与等权指数的背离。 如果指数还在新高而等权不跟，说明上涨越来越依赖少数几只股票——背离越大，回撤的触发点就越集中在几家公司身上。 波动率与日内振幅。 振幅持续放大，通常先于趋势变化出现，而不是之后。这是这篇分析里最「早期」的一个信号。 黄金与美元同步走强。 金价创新高、美元同时偏强，说明市场在同时定价「通胀不下来」和「政策不确定」，这对风险资产是逆风。 五、结论 短期（约 1 个月）：高位宽幅震荡，偏中性略向下，区间大致 28500–31000。向上需要 FOMC 措辞转温和与财报给力同时发生；向下只需要通胀再来一个超预期的数据。 中期（3–6 个月）：决定方向的只有两件事——① 加息是否真的止步（10 年期能否稳定在 5.3% 以下）；② AI 资本开支能否继续上修并被财报验证。 最大的风险不是估值高，而是「利率天花板」被再次抬高。 29–30 倍的 PE 在 3.75% 的政策利率下并不算离谱，但如果 10 年期站上 5.3%、30 年期突破 5.5%，这个估值就必须重定价。 和 2000 年最本质的区别：那时龙头没有盈利；现在纳指成分股的 ROE 约 31.6%，英伟达一年净赚约 1200 亿美元。相似之处只有一条——涨幅的集中度与「叙事定价」。所以更可能的路径是剧烈回撤 + 较快修复，而不是 2000 年那种持续数年的漫长熊市。 风险提示：以上是基于当前数据的概率化情景推演，不是预测，也不构成任何投资建议。情景权重是主观加权的结果，不是精确数字；市场有风险，决策请独立判断。\n","permalink":"/posts/nasdaq-scenario-forecast/","summary":"\u003ch2 id=\"一句话结论\"\u003e一句话结论\u003c/h2\u003e\n\u003cp\u003e纳指100 从 10 月 13 日的 \u003cstrong\u003e30569.48\u003c/strong\u003e 回落到 10 月 15 日的 \u003cstrong\u003e29935.59\u003c/strong\u003e，跌回 30000 关口下方。\u003cstrong\u003e现在的问题不是趋势坏了，而是支撑这轮上涨的两个前提——低成本资金、AI 叙事无摩擦——同时开始松动。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e短期我偏向\u003cstrong\u003e高位宽幅震荡\u003c/strong\u003e（约 \u003cstrong\u003e28500–31000\u003c/strong\u003e）；中期方向不取决于「AI 是不是泡沫」，而取决于两个可验证的变量：\u003cstrong\u003e加息是否真的止步\u003c/strong\u003e、\u003cstrong\u003eAI 资本开支能否继续上修并兑现\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003e下面这张图是\u003cstrong\u003e纳斯达克100（NDX）\u003cstrong\u003e的\u003c/strong\u003e实时\u003c/strong\u003e走势（打开页面时现取，不是静态快照）：\u003c/p\u003e\n\u003cdiv class=\"mq-card\" data-mq-chart data-secid=\"100.NDX100\" data-name=\"纳斯达克100\" data-height=\"360\"\u003e\n  \u003cdiv class=\"mq-head\"\u003e\u003cspan class=\"mq-loading\"\u003e行情加载中…\u003c/span\u003e\u003c/div\u003e\n  \u003cdiv class=\"mq-controls\"\u003e\n    \u003cdiv class=\"mq-range mq-periods\" data-mq-periods\u003e\u003c/div\u003e\n    \u003cdiv class=\"mq-range mq-ranges\" data-mq-ranges\u003e\u003c/div\u003e\n  \u003c/div\u003e\n  \u003cdiv class=\"mq-chart\"\u003e\u003c/div\u003e\n\u003c/div\u003e\u003cscript src=\"/js/market.13aeafcd8b6e42e70a439e724b31db04cc7771a070f2fdab7c9a088eac63d24d.js\" integrity=\"sha256-E66vzYtuQucKQ55ySzHbBMx3caBw8v2rfJoIjqxj0k0=\" defer\u003e\u003c/script\u003e\n\u003ch2 id=\"一先定位我们现在站在哪\"\u003e一、先定位：我们现在站在哪\u003c/h2\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e指标\u003c/th\u003e\n          \u003cth\u003e数值\u003c/th\u003e\n          \u003cth\u003e含义\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e纳指100（NDX100）\u003c/td\u003e\n          \u003ctd\u003e\u003cstrong\u003e29935.59\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003e已跌破 30000 整数关\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e近期高点\u003c/td\u003e\n          \u003ctd\u003e30569.48（10-13）\u003c/td\u003e\n          \u003ctd\u003e距高点约 \u003cstrong\u003e-2.1%\u003c/strong\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e纳指综合\u003c/td\u003e\n          \u003ctd\u003e26713.03\u003c/td\u003e\n          \u003ctd\u003e距 10-06 历史新高 \u003cstrong\u003e-3.2%\u003c/strong\u003e，年内 \u003cstrong\u003e+14.9%\u003c/strong\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e10 年期美债收益率\u003c/td\u003e\n          \u003ctd\u003e\u003cstrong\u003e5.100%\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003e30 年期曾触及 5.53%，2004 年以来最高\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e联邦基金利率\u003c/td\u003e\n          \u003ctd\u003e3.75%–4.00%\u003c/td\u003e\n          \u003ctd\u003e9 月 16 日加息 25bp，2023 年 7 月以来首次\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e通胀\u003c/td\u003e\n          \u003ctd\u003ePCE 3.7% / 核心 3.4%\u003c/td\u003e\n          \u003ctd\u003e高于预期，黏性没有解除\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e纳指100 动态市盈率\u003c/td\u003e\n          \u003ctd\u003e约 \u003cstrong\u003e29–30 倍\u003c/strong\u003e（PB 约 9.5 倍）\u003c/td\u003e\n          \u003ctd\u003ePE 分位不高，但 PB 分位已明显偏高\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e黄金 / 原油 / 美元指数\u003c/td\u003e\n          \u003ctd\u003e4208 / 95 / 101.8\u003c/td\u003e\n          \u003ctd\u003e黄金创新高、油价高企\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e一句话概括坐标：\u003cstrong\u003e指数还在高位、回撤很浅，但它的两个前提都已经松动了。\u003c/strong\u003e\u003c/p\u003e","title":"纳指情景推演：三个情景、六个信号、一个总开关"},{"content":" 纳斯达克100 — 加载中… 今开— 最高— 最低— 昨收— 振幅— 量比— 成交量— 行情加载中… 相关资产 市值涨跌榜 ","permalink":"/market/","summary":"\u003cdiv class=\"mq-index\" data-mq-index data-secid=\"100.NDX100\" data-name=\"纳斯达克100\"\u003e\n  \u003cdiv class=\"mq-idx-top\"\u003e\n    \u003cspan class=\"mq-idx-name\"\u003e纳斯达克100\u003c/span\u003e\n    \u003cspan class=\"mq-idx-price\" data-mq-price\u003e—\u003c/span\u003e\n    \u003cspan class=\"mq-idx-chg\" data-mq-chg\u003e加载中…\u003c/span\u003e\n    \u003cspan class=\"mq-idx-time\" data-mq-meta\u003e\u003c/span\u003e\n  \u003c/div\u003e\n  \u003cul class=\"mq-idx-facts\"\u003e\n    \u003cli\u003e\u003cspan\u003e今开\u003c/span\u003e\u003cb data-mq-f=\"open\"\u003e—\u003c/b\u003e\u003c/li\u003e\n    \u003cli\u003e\u003cspan\u003e最高\u003c/span\u003e\u003cb data-mq-f=\"high\"\u003e—\u003c/b\u003e\u003c/li\u003e\n    \u003cli\u003e\u003cspan\u003e最低\u003c/span\u003e\u003cb data-mq-f=\"low\"\u003e—\u003c/b\u003e\u003c/li\u003e\n    \u003cli\u003e\u003cspan\u003e昨收\u003c/span\u003e\u003cb data-mq-f=\"prev\"\u003e—\u003c/b\u003e\u003c/li\u003e\n    \u003cli\u003e\u003cspan\u003e振幅\u003c/span\u003e\u003cb data-mq-f=\"amp\"\u003e—\u003c/b\u003e\u003c/li\u003e\n    \u003cli\u003e\u003cspan\u003e量比\u003c/span\u003e\u003cb data-mq-f=\"vr\"\u003e—\u003c/b\u003e\u003c/li\u003e\n    \u003cli\u003e\u003cspan\u003e成交量\u003c/span\u003e\u003cb data-mq-f=\"vol\"\u003e—\u003c/b\u003e\u003c/li\u003e\n  \u003c/ul\u003e\n\u003c/div\u003e\u003cscript src=\"/js/market.13aeafcd8b6e42e70a439e724b31db04cc7771a070f2fdab7c9a088eac63d24d.js\" integrity=\"sha256-E66vzYtuQucKQ55ySzHbBMx3caBw8v2rfJoIjqxj0k0=\" defer\u003e\u003c/script\u003e\n\u003cdiv class=\"mq-card\" data-mq-chart data-secid=\"100.NDX100\" data-name=\"纳斯达克100\" data-height=\"440\"\u003e\n  \u003cdiv class=\"mq-head\"\u003e\u003cspan class=\"mq-loading\"\u003e行情加载中…\u003c/span\u003e\u003c/div\u003e\n  \u003cdiv class=\"mq-controls\"\u003e\n    \u003cdiv class=\"mq-range mq-periods\" data-mq-periods\u003e\u003c/div\u003e\n    \u003cdiv class=\"mq-range mq-ranges\" data-mq-ranges\u003e\u003c/div\u003e\n  \u003c/div\u003e\n  \u003cdiv class=\"mq-chart\"\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003ch2 id=\"相关资产\"\u003e相关资产\u003c/h2\u003e\n\u003cdiv class=\"mq-peers\" data-mq-peers\u003e\u003c/div\u003e\n\u003ch2 id=\"市值涨跌榜\"\u003e市值涨跌榜\u003c/h2\u003e\n\u003cdiv class=\"mq-movers\" data-mq-movers data-market=\"105\" data-limit=\"20\"\u003e\u003c/div\u003e","title":"市场行情"},{"content":"一句话总结 10 月 6 日纳指收于 27599.89 点，创历史新高；到 10 月 15 日收于 26713.03 点，7 个交易日回撤约 -3.2%。回撤幅度不算深，但过程剧烈——期间出现过单日 -1.88% 的杀跌，也出现过“开盘跌 1.4%、尾盘翻红”的深 V。\n下面这张图是纳斯达克100（NDX）的实时走势（打开页面时现取，不是文章里的静态快照；正文里的点位均为纳指综合口径）：\n行情加载中… 节奏：先冲高，再连跌 日期 纳指综合收盘 备注 10-02 27190.86 +319.27 10-05 27477.31 +286.45 10-06 27599.89 历史新高（收盘） 10-07 27538.69 -61.20 10-14 26692.87 -1.88% 10-15 26713.03 +0.08%，盘中 26308.85 → 26754.02 同期，纳斯达克 100 指数（NDX）从 10 月 13 日的 30569.48 回落到 10 月 15 日的 29935.59，跌回 30000 整数关下方，两天回撤约 -2.1%——比综合指数更“贵”，也更脆弱。\n跌的三个直接触发因素 AI 泡沫论被“交易化”。10 月以来“AI 泡沫临近破裂”的讨论快速升温，英伟达股价连续四个交易日回调，到 10 月 9 日已自高点回撤 5.8%。龙头一动，指数的“分子端”预期就跟着动。 加息周期重启。9 月 16 日美联储一致投票加息 25bp 至 3.75%–4.00%，是三年多来首次加息；点阵图显示多数官员预计年内还会再加一次。利率“天花板”抬高，长久期资产（成长股）最敏感。 通胀黏性。9 月 CPI 同比 +3.7%，高于预期的 +3.6%。“宽松确认”的剧本没出现，反而强化了“利率更高更久”。 一个容易被忽略的信号：振幅 10 月 14 日是“一致性下跌”，10 月 15 日却是“开盘再杀、尾盘翻红”——盘中最低 26308.85、最高 26754.02，日内振幅约 1.7%。\n这种“大振幅 + 收平”的组合，通常说明多空分歧在放大，而不是单边趋势。它同时意味着：追涨的人在被反复“洗”，而指数定投的人看到的更多是噪音。\n数据速查 纳指综合：26713.03（10-15 收盘），年内约 +14.9% 纳斯达克 100：29935.59（10-15），已回落至 30000 下方 标普 500：7744.06 ；道指：52177.69 历史新高：27599.89（10-06 收盘） 距高点：约 -3.2% 小结 这轮回撤目前仍属“高位剧烈震荡”，还够不上“趋势反转”的定义（跌幅、市场广度、量能都不支持）。但它提醒了一件事：当指数的涨幅高度依赖少数几个 AI 龙头时，回撤的触发点也会来自这几家公司本身。\n本文仅为市场数据复盘，不构成任何投资建议。\n","permalink":"/posts/nasdaq-october-2026-review/","summary":"\u003ch2 id=\"一句话总结\"\u003e一句话总结\u003c/h2\u003e\n\u003cp\u003e10 月 6 日纳指收于 \u003cstrong\u003e27599.89\u003c/strong\u003e 点，创历史新高；到 10 月 15 日收于 \u003cstrong\u003e26713.03\u003c/strong\u003e 点，7 个交易日回撤约 \u003cstrong\u003e-3.2%\u003c/strong\u003e。回撤幅度不算深，但过程剧烈——期间出现过单日 -1.88% 的杀跌，也出现过“开盘跌 1.4%、尾盘翻红”的深 V。\u003c/p\u003e\n\u003cp\u003e下面这张图是\u003cstrong\u003e纳斯达克100（NDX）\u003cstrong\u003e的\u003c/strong\u003e实时\u003c/strong\u003e走势（打开页面时现取，不是文章里的静态快照；正文里的点位均为纳指综合口径）：\u003c/p\u003e\n\u003cdiv class=\"mq-card\" data-mq-chart data-secid=\"100.NDX100\" data-name=\"纳斯达克100\" data-height=\"360\"\u003e\n  \u003cdiv class=\"mq-head\"\u003e\u003cspan class=\"mq-loading\"\u003e行情加载中…\u003c/span\u003e\u003c/div\u003e\n  \u003cdiv class=\"mq-controls\"\u003e\n    \u003cdiv class=\"mq-range mq-periods\" data-mq-periods\u003e\u003c/div\u003e\n    \u003cdiv class=\"mq-range mq-ranges\" data-mq-ranges\u003e\u003c/div\u003e\n  \u003c/div\u003e\n  \u003cdiv class=\"mq-chart\"\u003e\u003c/div\u003e\n\u003c/div\u003e\u003cscript src=\"/js/market.13aeafcd8b6e42e70a439e724b31db04cc7771a070f2fdab7c9a088eac63d24d.js\" integrity=\"sha256-E66vzYtuQucKQ55ySzHbBMx3caBw8v2rfJoIjqxj0k0=\" defer\u003e\u003c/script\u003e\n\u003ch2 id=\"节奏先冲高再连跌\"\u003e节奏：先冲高，再连跌\u003c/h2\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e日期\u003c/th\u003e\n          \u003cth\u003e纳指综合收盘\u003c/th\u003e\n          \u003cth\u003e备注\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e10-02\u003c/td\u003e\n          \u003ctd\u003e27190.86\u003c/td\u003e\n          \u003ctd\u003e+319.27\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e10-05\u003c/td\u003e\n          \u003ctd\u003e27477.31\u003c/td\u003e\n          \u003ctd\u003e+286.45\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e10-06\u003c/td\u003e\n          \u003ctd\u003e\u003cstrong\u003e27599.89\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003e\u003cstrong\u003e历史新高（收盘）\u003c/strong\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e10-07\u003c/td\u003e\n          \u003ctd\u003e27538.69\u003c/td\u003e\n          \u003ctd\u003e-61.20\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e10-14\u003c/td\u003e\n          \u003ctd\u003e26692.87\u003c/td\u003e\n          \u003ctd\u003e\u003cstrong\u003e-1.88%\u003c/strong\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e10-15\u003c/td\u003e\n          \u003ctd\u003e26713.03\u003c/td\u003e\n          \u003ctd\u003e+0.08%，盘中 26308.85 → 26754.02\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e同期，纳斯达克 100 指数（NDX）从 10 月 13 日的 30569.48 回落到 10 月 15 日的 \u003cstrong\u003e29935.59\u003c/strong\u003e，跌回 30000 整数关下方，两天回撤约 \u003cstrong\u003e-2.1%\u003c/strong\u003e——比综合指数更“贵”，也更脆弱。\u003c/p\u003e","title":"纳指10月复盘：创下 27599.89 的历史新高后，7 天回撤 3%"},{"content":"核心矛盾：盈利向上，利率也向上 当前纳指的多空分歧，本质是两股相反方向的力：\n向上的力：AI 相关资本开支仍在加速，半导体与 AI 硬件链的盈利兑现度高。机构对 2026 年美股的盈利增速预期普遍在两位数。 向下的力：美联储 9 月重启加息（3.75%–4.00%），CPI 同比 +3.7% 未见明显回落，“利率更高更久”压制估值；同时 AI 板块的集中度与涨幅已接近历史极值。 下面三个变量，决定了未来一两个月纳指的重心往哪边偏。\n先看纳指 100 的实时走势，心里有个位置感：\n行情加载中… 变量一：10 月 27–28 日 FOMC 9 月已加息 25bp，点阵图显示年内“或再加一次”。 但最新非农数据降温后，市场对 10 月再加息的概率明显回落（CME FedWatch 口径一度降到两成以下），“按兵不动”成为主流预期。 真正的看点不是加不加，而是措辞：若声明强调“通胀黏性、保留进一步加息选项”，成长股承压；若强调“数据依赖、进入观察期”，风险偏好可能修复。 变量二：三季报与 AI 资本开支 财报季刚开局。市场想确认的核心是：AI 的资本开支能不能继续转化为收入与利润。 要盯的不是“超预期几个点”，而是指引：云厂商 capex 上修还是下修，直接决定半导体与 AI 硬件链的景气叙事。 若“卖铲人”（算力、存储、网络）继续上修指引，指数的分子端就有支撑；反之，估值端会先杀。 变量三：估值与集中度 有卖方测算，纳指动态市盈率近期回到 约 29 倍，低于 2023–2024 年约 33 倍的高点——这是“还不算典型泡沫”的核心论据。 但另一面：过去一年纳斯达克 100 中表现最好的 10 只股票平均上涨约 784%，已超过 2000 年互联网泡沫见顶前一年的水平。涨的宽度极窄。 机构目标价一览（仅供参照） 标的 机构 目标 / 区间 纳斯达克 100 PrimeXBT 2026 基准区间 28125–31861，年末约 30200 纳斯达克 100 Kalshi 预测市场 2026 年末约 30000 标普 500 华尔街 13 家大行 7100–8000（中位数约 7650） 标普 500 UBS 上调至 8100 美股整体 贝莱德（Q4 展望） 继续超配，聚焦 AI“瓶颈环节” 这些多是年初或季初给出的目标，指数已涨过一轮，参考价值在于共识区间，而不是精确点位。\n我会盯什么 10/27–28 FOMC 的措辞，以及 10 年期美债收益率能否稳住。 三季报中云厂商的 capex 指引——这是 AI 叙事的“燃料表”。 市值加权 vs 等权指数的背离：指数新高而等权不跟，说明上涨越来越依赖少数股票。 波动率：VIX 与日内振幅持续放大，通常先于趋势变化出现。 本文为市场信息整理，不构成投资建议；市场有风险，决策请独立判断。\n","permalink":"/posts/nasdaq-outlook-fomc-earnings/","summary":"\u003ch2 id=\"核心矛盾盈利向上利率也向上\"\u003e核心矛盾：盈利向上，利率也向上\u003c/h2\u003e\n\u003cp\u003e当前纳指的多空分歧，本质是两股相反方向的力：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e向上的力\u003c/strong\u003e：AI 相关资本开支仍在加速，半导体与 AI 硬件链的盈利兑现度高。机构对 2026 年美股的盈利增速预期普遍在两位数。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e向下的力\u003c/strong\u003e：美联储 9 月重启加息（\u003cstrong\u003e3.75%–4.00%\u003c/strong\u003e），CPI 同比 +3.7% 未见明显回落，“利率更高更久”压制估值；同时 AI 板块的集中度与涨幅已接近历史极值。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e下面三个变量，决定了未来一两个月纳指的重心往哪边偏。\u003c/p\u003e\n\u003cp\u003e先看纳指 100 的\u003cstrong\u003e实时\u003c/strong\u003e走势，心里有个位置感：\u003c/p\u003e\n\u003cdiv class=\"mq-card\" data-mq-chart data-secid=\"100.NDX100\" data-name=\"纳斯达克100\" data-height=\"360\"\u003e\n  \u003cdiv class=\"mq-head\"\u003e\u003cspan class=\"mq-loading\"\u003e行情加载中…\u003c/span\u003e\u003c/div\u003e\n  \u003cdiv class=\"mq-controls\"\u003e\n    \u003cdiv class=\"mq-range mq-periods\" data-mq-periods\u003e\u003c/div\u003e\n    \u003cdiv class=\"mq-range mq-ranges\" data-mq-ranges\u003e\u003c/div\u003e\n  \u003c/div\u003e\n  \u003cdiv class=\"mq-chart\"\u003e\u003c/div\u003e\n\u003c/div\u003e\u003cscript src=\"/js/market.13aeafcd8b6e42e70a439e724b31db04cc7771a070f2fdab7c9a088eac63d24d.js\" integrity=\"sha256-E66vzYtuQucKQ55ySzHbBMx3caBw8v2rfJoIjqxj0k0=\" defer\u003e\u003c/script\u003e\n\u003ch2 id=\"变量一10-月-2728-日-fomc\"\u003e变量一：10 月 27–28 日 FOMC\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e9 月已加息 25bp，点阵图显示年内“或再加一次”。\u003c/li\u003e\n\u003cli\u003e但最新非农数据降温后，市场对 10 月再加息的概率明显回落（CME FedWatch 口径一度降到两成以下），“按兵不动”成为主流预期。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e真正的看点不是加不加，而是措辞\u003c/strong\u003e：若声明强调“通胀黏性、保留进一步加息选项”，成长股承压；若强调“数据依赖、进入观察期”，风险偏好可能修复。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"变量二三季报与-ai-资本开支\"\u003e变量二：三季报与 AI 资本开支\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e财报季刚开局。市场想确认的核心是：\u003cstrong\u003eAI 的资本开支能不能继续转化为收入与利润\u003c/strong\u003e。\u003c/li\u003e\n\u003cli\u003e要盯的不是“超预期几个点”，而是\u003cstrong\u003e指引\u003c/strong\u003e：云厂商 capex 上修还是下修，直接决定半导体与 AI 硬件链的景气叙事。\u003c/li\u003e\n\u003cli\u003e若“卖铲人”（算力、存储、网络）继续上修指引，指数的分子端就有支撑；反之，估值端会先杀。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"变量三估值与集中度\"\u003e变量三：估值与集中度\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e有卖方测算，纳指动态市盈率近期回到 \u003cstrong\u003e约 29 倍\u003c/strong\u003e，低于 2023–2024 年约 33 倍的高点——这是“还不算典型泡沫”的核心论据。\u003c/li\u003e\n\u003cli\u003e但另一面：过去一年纳斯达克 100 中表现最好的 10 只股票\u003cstrong\u003e平均上涨约 784%\u003c/strong\u003e，已超过 2000 年互联网泡沫见顶前一年的水平。\u003cstrong\u003e涨的宽度极窄\u003c/strong\u003e。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"机构目标价一览仅供参照\"\u003e机构目标价一览（仅供参照）\u003c/h2\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e标的\u003c/th\u003e\n          \u003cth\u003e机构\u003c/th\u003e\n          \u003cth\u003e目标 / 区间\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e纳斯达克 100\u003c/td\u003e\n          \u003ctd\u003ePrimeXBT\u003c/td\u003e\n          \u003ctd\u003e2026 基准区间 28125–31861，年末约 30200\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e纳斯达克 100\u003c/td\u003e\n          \u003ctd\u003eKalshi 预测市场\u003c/td\u003e\n          \u003ctd\u003e2026 年末约 30000\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e标普 500\u003c/td\u003e\n          \u003ctd\u003e华尔街 13 家大行\u003c/td\u003e\n          \u003ctd\u003e7100–8000（中位数约 7650）\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e标普 500\u003c/td\u003e\n          \u003ctd\u003eUBS\u003c/td\u003e\n          \u003ctd\u003e上调至 8100\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e美股整体\u003c/td\u003e\n          \u003ctd\u003e贝莱德（Q4 展望）\u003c/td\u003e\n          \u003ctd\u003e继续超配，聚焦 AI“瓶颈环节”\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cblockquote\u003e\n\u003cp\u003e这些多是年初或季初给出的目标，指数已涨过一轮，参考价值在于\u003cstrong\u003e共识区间\u003c/strong\u003e，而不是精确点位。\u003c/p\u003e","title":"纳指后市怎么看：10 月 27 日 FOMC、三季报与机构目标价"},{"content":"争论为什么突然升温 10 月以来，“AI 泡沫临近破裂”的讨论快速升温：英伟达自高点回撤约 5.8%，纳指从 10 月 6 日的历史新高回落约 3%；同时有卖方策略师公开警示——美股与全球市场的偏离度，已超过 2000 年互联网泡沫前夕的水平。\n到底是“健康的估值消化”，还是“泡沫见顶”？先把两边论据摆清楚。\n空方：三个论据 涨幅极端。过去一年纳斯达克 100 表现最好的 10 只股票平均上涨 约 784%，高于 2000 年 3 月见顶前一年的 622%。这是“历史级”的集中度。 市场在变窄。指数创新高，但上涨高度依赖少数 AI 龙头；龙头一回调，指数立刻失去支撑——10 月这轮回撤就是例子。 利率不再帮忙。美联储 9 月重启加息，通胀（CPI +3.7%）黏性仍在，“靠估值扩张推动上涨”的空间被压缩。 多方：三个反驳 这次的利润是真的。2000 年的“互联网公司”大多没有盈利；这轮 AI 龙头有实打实的现金流，云与算力的订单可见性较高。 估值没到 2000 年的水平。有卖方测算，纳指动态市盈率约 29 倍，低于 2023–2024 年约 33 倍的高点，更不用说 2000 年的极端读数。 资本开支仍在加速。主要云厂商的 AI 资本开支指引整体仍在走高，AI 相关收入兑现度较高。 一张对照表 维度 2000 年 2026 年（当前） 领涨股涨幅（前一年） 约 +622%（NDX 前十） 约 +784%（NDX 前十） 盈利基础 多数公司无盈利 龙头现金流强劲 估值水平 极端 NDX 动态 PE 约 29x 利率环境 加息周期末段 加息周期刚重启（3.75%–4.00%） 集中度 高 更高 怎么用这两个视角 判断“是不是泡沫”本身没有太大意义——有意义的是：如果是，什么时候破；如果不是，回调到哪里可以接。\n可以跟踪的“泡沫温度计”：\n龙头股的回撤幅度与修复速度； 市值加权指数 vs 等权指数的背离； 一级市场 / IPO 的狂热程度； 云厂商 capex 指引的方向； 波动率（VIX、日内振幅）是否持续抬升。 一个不那么极端的结论 领涨股的涨幅确实“超过 2000 年”，但盈利基础也更扎实。这意味着：更可能是“剧烈震荡 + 板块内部均值回归”，而不是 2000 年式的整体崩塌。对普通投资者，结论不是“清仓”或“梭哈”，而是——控制仓位、避免追高、用时间换空间。\n本文为市场分析，不构成投资建议。\n","permalink":"/posts/ai-bubble-2026-vs-2000/","summary":"\u003ch2 id=\"争论为什么突然升温\"\u003e争论为什么突然升温\u003c/h2\u003e\n\u003cp\u003e10 月以来，“AI 泡沫临近破裂”的讨论快速升温：英伟达自高点回撤约 5.8%，纳指从 10 月 6 日的历史新高回落约 3%；同时有卖方策略师公开警示——美股与全球市场的偏离度，已超过 2000 年互联网泡沫前夕的水平。\u003c/p\u003e\n\u003cp\u003e到底是“健康的估值消化”，还是“泡沫见顶”？先把两边论据摆清楚。\u003c/p\u003e\n\u003ch2 id=\"空方三个论据\"\u003e空方：三个论据\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003e涨幅极端\u003c/strong\u003e。过去一年纳斯达克 100 表现最好的 10 只股票平均上涨 \u003cstrong\u003e约 784%\u003c/strong\u003e，高于 2000 年 3 月见顶前一年的 622%。这是“历史级”的集中度。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e市场在变窄\u003c/strong\u003e。指数创新高，但上涨高度依赖少数 AI 龙头；龙头一回调，指数立刻失去支撑——10 月这轮回撤就是例子。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e利率不再帮忙\u003c/strong\u003e。美联储 9 月重启加息，通胀（CPI +3.7%）黏性仍在，“靠估值扩张推动上涨”的空间被压缩。\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"多方三个反驳\"\u003e多方：三个反驳\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003e这次的利润是真的\u003c/strong\u003e。2000 年的“互联网公司”大多没有盈利；这轮 AI 龙头有实打实的现金流，云与算力的订单可见性较高。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e估值没到 2000 年的水平\u003c/strong\u003e。有卖方测算，纳指动态市盈率约 \u003cstrong\u003e29 倍\u003c/strong\u003e，低于 2023–2024 年约 33 倍的高点，更不用说 2000 年的极端读数。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e资本开支仍在加速\u003c/strong\u003e。主要云厂商的 AI 资本开支指引整体仍在走高，AI 相关收入兑现度较高。\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"一张对照表\"\u003e一张对照表\u003c/h2\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e维度\u003c/th\u003e\n          \u003cth\u003e2000 年\u003c/th\u003e\n          \u003cth\u003e2026 年（当前）\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e领涨股涨幅（前一年）\u003c/td\u003e\n          \u003ctd\u003e约 +622%（NDX 前十）\u003c/td\u003e\n          \u003ctd\u003e约 +784%（NDX 前十）\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e盈利基础\u003c/td\u003e\n          \u003ctd\u003e多数公司无盈利\u003c/td\u003e\n          \u003ctd\u003e龙头现金流强劲\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e估值水平\u003c/td\u003e\n          \u003ctd\u003e极端\u003c/td\u003e\n          \u003ctd\u003eNDX 动态 PE 约 29x\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e利率环境\u003c/td\u003e\n          \u003ctd\u003e加息周期末段\u003c/td\u003e\n          \u003ctd\u003e加息周期刚重启（3.75%–4.00%）\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e集中度\u003c/td\u003e\n          \u003ctd\u003e高\u003c/td\u003e\n          \u003ctd\u003e更高\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"怎么用这两个视角\"\u003e怎么用这两个视角\u003c/h2\u003e\n\u003cp\u003e判断“是不是泡沫”本身没有太大意义——有意义的是：\u003cstrong\u003e如果是，什么时候破；如果不是，回调到哪里可以接\u003c/strong\u003e。\u003c/p\u003e","title":"AI 泡沫之争：这次和 2000 年有什么不同？"},{"content":"背景 手头有一台 4核4G 的轻量云服务器（Debian 13），想搭一个纯静态的技术博客。要求很简单：低资源占用、HTTPS、自动续期证书、页脚挂备案号。\n方案选型 服务器上已经装了 1Panel 面板和 Docker 版 OpenResty，所以不再额外安装 Nginx，直接复用现有的 OpenResty 容器做反向代理和静态文件服务。静态博客不需要数据库、不需要 PHP，资源占用几乎为零。\nWeb 服务：复用 1Panel 的 OpenResty（Docker 容器，宿主机目录挂载进容器） 证书：acme.sh 申请 Let’s Encrypt 证书，HTTP-01 验证，自动续期 站点文件：纯 HTML/CSS，放 /opt/1panel/www/sites/域名/index/ 关键配置 站点配置放在 /opt/1panel/www/conf.d/ 下，这个目录被挂载到容器内 /usr/local/openresty/nginx/conf/conf.d/，主配置会自动 include 它：\nserver { listen 80; server_name example.com www.example.com; # 保留 ACME 验证路径，续期时要用 location ~ /.well-known/acme-challenge { allow all; root /www/sites/example.com/index; } # 其余请求全部跳转 HTTPS location / { return 301 https://example.com$request_uri; } } server { listen 443 ssl; http2 on; server_name example.com www.example.com; root /www/sites/example.com/index; ssl_certificate /usr/local/openresty/nginx/conf/ssl/example/fullchain.pem; ssl_certificate_key /usr/local/openresty/nginx/conf/ssl/example/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; } 证书自动续期 acme.sh 安装证书时通过 --reloadcmd 指定续期后的重载命令，之后完全无需人工干预：\n~/.acme.sh/acme.sh --install-cert -d example.com --ecc \\ --fullchain-file .../fullchain.pem \\ --key-file .../privkey.pem \\ --reloadcmd \u0026#34;docker exec openresty容器名 nginx -s reload\u0026#34; 踩过的坑 Fish shell：Debian 默认 shell 是 fish，不支持 bash 的命令替换语法，SSH 执行命令要显式包一层 bash -c。 SSL session cache：ssl_session_cache shared:SSL:10m 里 zone 名不能带空格，写错直接 nginx -t 报错。 DNS 缓存：域名换解析后，本机代理软件（TUN 模式）的 DNS 缓存还指向旧 IP，表现为\u0026quot;服务器上一切正常但本地 404\u0026quot;。ipconfig /flushdns 解决。 总结：复用现有设施 \u0026gt; 重新造轮子。整站资源占用接近零，证书自动续期，备案号挂在页脚，一次配置长期免维护。\n","permalink":"/posts/deploy-blog/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e手头有一台 4核4G 的轻量云服务器（Debian 13），想搭一个纯静态的技术博客。要求很简单：低资源占用、HTTPS、自动续期证书、页脚挂备案号。\u003c/p\u003e\n\u003ch2 id=\"方案选型\"\u003e方案选型\u003c/h2\u003e\n\u003cp\u003e服务器上已经装了 1Panel 面板和 Docker 版 OpenResty，所以不再额外安装 Nginx，直接复用现有的 OpenResty 容器做反向代理和静态文件服务。静态博客不需要数据库、不需要 PHP，资源占用几乎为零。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eWeb 服务\u003c/strong\u003e：复用 1Panel 的 OpenResty（Docker 容器，宿主机目录挂载进容器）\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e证书\u003c/strong\u003e：acme.sh 申请 Let’s Encrypt 证书，HTTP-01 验证，自动续期\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e站点文件\u003c/strong\u003e：纯 HTML/CSS，放 \u003ccode\u003e/opt/1panel/www/sites/域名/index/\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"关键配置\"\u003e关键配置\u003c/h2\u003e\n\u003cp\u003e站点配置放在 \u003ccode\u003e/opt/1panel/www/conf.d/\u003c/code\u003e 下，这个目录被挂载到容器内 \u003ccode\u003e/usr/local/openresty/nginx/conf/conf.d/\u003c/code\u003e，主配置会自动 include 它：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-nginx\" data-lang=\"nginx\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003eserver\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003elisten\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e80\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003eserver_name\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003eexample.com\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003ewww.example.com\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#75715e\"\u003e# 保留 ACME 验证路径，续期时要用\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e\u003c/span\u003e    \u003cspan style=\"color:#f92672\"\u003elocation\u003c/span\u003e ~ \u003cspan style=\"color:#e6db74\"\u003e/.well-known/acme-challenge\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#f92672\"\u003eallow\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003eall\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#f92672\"\u003eroot\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e/www/sites/example.com/index\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#75715e\"\u003e# 其余请求全部跳转 HTTPS\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e\u003c/span\u003e    \u003cspan style=\"color:#f92672\"\u003elocation\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e/\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#f92672\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e301\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003ehttps://example.com\u003c/span\u003e$request_uri;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003eserver\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003elisten\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e443\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003essl\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003ehttp2\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eon\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003eserver_name\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003eexample.com\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003ewww.example.com\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003eroot\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e/www/sites/example.com/index\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003essl_certificate\u003c/span\u003e     \u003cspan style=\"color:#e6db74\"\u003e/usr/local/openresty/nginx/conf/ssl/example/fullchain.pem\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003essl_certificate_key\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e/usr/local/openresty/nginx/conf/ssl/example/privkey.pem\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003essl_protocols\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003eTLSv1.2\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003eTLSv1.3\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"证书自动续期\"\u003e证书自动续期\u003c/h2\u003e\n\u003cp\u003eacme.sh 安装证书时通过 \u003ccode\u003e--reloadcmd\u003c/code\u003e 指定续期后的重载命令，之后完全无需人工干预：\u003c/p\u003e","title":"从零搭建：轻量服务器博客部署实录"},{"content":"现象 一个长驻的后端服务运行三四天后内存从 200MB 涨到 1.8GB，最终被 OOM Killer 杀掉。重启后一切正常，然后周而复始。\n排查过程 第一步：确认是泄漏还是缓存 先看监控曲线。如果内存是\u0026quot;锯齿状\u0026quot;（涨上去又掉下来）多半是缓存策略问题；如果是\u0026quot;楼梯状\u0026quot;只涨不跌，基本就是泄漏。我们的曲线是典型的楼梯状，确认泄漏。\n第二步：抓内存快照对比 在服务运行 1 小时和 24 小时分别抓堆快照，diff 对比对象数量的增长：\n# 运行 1 小时 jmap -dump:live,format=b,file=heap1.hprof \u0026lt;pid\u0026gt; # 运行 24 小时 jmap -dump:live,format=b,file=heap2.hprof \u0026lt;pid\u0026gt; 用 MAT 打开两个快照对比，发现 EventListenerRegistry 里的监听器对象 24 小时增长了 4 万多个——每个都持有外部对象的引用。\n第三步：定位到代码 查看注册监听器的调用点，发现问题代码：\n// 每次请求都会 new 一个监听器注册进去，但从不注销 public void handle(Request req) { bus.subscribe(new MetricsListener(req.getSessionId()), req.getTopic()); ... } 事件总线是全局单例，监听器以强引用形式存在，请求结束后监听器及其持有的 SessionId 等对象永远无法被回收。\n修复方案 短期：把强引用订阅改成弱引用（WeakReference 包装），对象无其他引用时可被回收 长期：明确订阅生命周期，请求结束时在 finally 里注销： Listener l = new MetricsListener(req.getSessionId()); bus.subscribe(l, req.getTopic()); try { ... } finally { bus.unsubscribe(l, req.getTopic()); } 经验总结 “只注册、不注销\u0026quot;是内存泄漏最常见的形态之一，事件总线、定时任务、回调注册都要检查配对的注销逻辑 泄漏排查的关键是两个时间点的快照对比，而不是盯着单个快照看 上线前用压测工具模拟持续请求流，几小时内就能暴露这类问题，不用等线上跑四天 ","permalink":"/posts/memory-leak/","summary":"\u003ch2 id=\"现象\"\u003e现象\u003c/h2\u003e\n\u003cp\u003e一个长驻的后端服务运行三四天后内存从 200MB 涨到 1.8GB，最终被 OOM Killer 杀掉。重启后一切正常，然后周而复始。\u003c/p\u003e\n\u003ch2 id=\"排查过程\"\u003e排查过程\u003c/h2\u003e\n\u003ch3 id=\"第一步确认是泄漏还是缓存\"\u003e第一步：确认是泄漏还是缓存\u003c/h3\u003e\n\u003cp\u003e先看监控曲线。如果内存是\u0026quot;锯齿状\u0026quot;（涨上去又掉下来）多半是缓存策略问题；如果是\u0026quot;楼梯状\u0026quot;只涨不跌，基本就是泄漏。我们的曲线是典型的楼梯状，确认泄漏。\u003c/p\u003e\n\u003ch3 id=\"第二步抓内存快照对比\"\u003e第二步：抓内存快照对比\u003c/h3\u003e\n\u003cp\u003e在服务运行 1 小时和 24 小时分别抓堆快照，diff 对比对象数量的增长：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# 运行 1 小时\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ejmap -dump:live,format\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003eb,file\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003eheap1.hprof \u0026lt;pid\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# 运行 24 小时\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ejmap -dump:live,format\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003eb,file\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003eheap2.hprof \u0026lt;pid\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e用 MAT 打开两个快照对比，发现 \u003ccode\u003eEventListenerRegistry\u003c/code\u003e 里的监听器对象 24 小时增长了 4 万多个——每个都持有外部对象的引用。\u003c/p\u003e\n\u003ch3 id=\"第三步定位到代码\"\u003e第三步：定位到代码\u003c/h3\u003e\n\u003cp\u003e查看注册监听器的调用点，发现问题代码：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-java\" data-lang=\"java\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e// 每次请求都会 new 一个监听器注册进去，但从不注销\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003epublic\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003evoid\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003ehandle\u003c/span\u003e(Request req) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    bus.\u003cspan style=\"color:#a6e22e\"\u003esubscribe\u003c/span\u003e(\u003cspan style=\"color:#66d9ef\"\u003enew\u003c/span\u003e MetricsListener(req.\u003cspan style=\"color:#a6e22e\"\u003egetSessionId\u003c/span\u003e()), req.\u003cspan style=\"color:#a6e22e\"\u003egetTopic\u003c/span\u003e());\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e事件总线是全局单例，监听器以强引用形式存在，请求结束后监听器及其持有的 SessionId 等对象永远无法被回收。\u003c/p\u003e\n\u003ch2 id=\"修复方案\"\u003e修复方案\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e短期：把强引用订阅改成弱引用（\u003ccode\u003eWeakReference\u003c/code\u003e 包装），对象无其他引用时可被回收\u003c/li\u003e\n\u003cli\u003e长期：明确订阅生命周期，请求结束时在 finally 里注销：\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-java\" data-lang=\"java\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eListener l \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003enew\u003c/span\u003e MetricsListener(req.\u003cspan style=\"color:#a6e22e\"\u003egetSessionId\u003c/span\u003e());\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebus.\u003cspan style=\"color:#a6e22e\"\u003esubscribe\u003c/span\u003e(l, req.\u003cspan style=\"color:#a6e22e\"\u003egetTopic\u003c/span\u003e());\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003etry\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e} \u003cspan style=\"color:#66d9ef\"\u003efinally\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    bus.\u003cspan style=\"color:#a6e22e\"\u003eunsubscribe\u003c/span\u003e(l, req.\u003cspan style=\"color:#a6e22e\"\u003egetTopic\u003c/span\u003e());\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"经验总结\"\u003e经验总结\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e“只注册、不注销\u0026quot;是内存泄漏最常见的形态之一，事件总线、定时任务、回调注册都要检查配对的注销逻辑\u003c/li\u003e\n\u003cli\u003e泄漏排查的关键是\u003cstrong\u003e两个时间点的快照对比\u003c/strong\u003e，而不是盯着单个快照看\u003c/li\u003e\n\u003cli\u003e上线前用压测工具模拟持续请求流，几小时内就能暴露这类问题，不用等线上跑四天\u003c/li\u003e\n\u003c/ul\u003e","title":"一次诡异的内存泄漏排查记录"},{"content":"背景 订单列表接口在数据量上来后 P99 响应达到 800ms，用户明显感知卡顿。目标：压到 100ms 以内，不升级硬件。\n第一步：慢查询定位（800ms → 300ms） 开启慢查询日志，发现列表页的统计子查询没走索引：\nEXPLAIN SELECT o.*, (SELECT COUNT(*) FROM order_item i WHERE i.order_id = o.id) AS item_count FROM orders o WHERE o.user_id = ? ORDER BY created_at DESC LIMIT 20; order_item.order_id 没有索引，子查询对每行订单做全表扫描。加上索引后接口降到 300ms。\n第一刀永远先看慢查询日志。大部分\u0026quot;接口慢\u0026quot;的本质是\u0026quot;SQL 慢\u0026quot;。\n第二步：消灭 N+1 查询（300ms → 120ms） ORM 的懒加载在序列化时触发了 N+1：列表 20 条订单，每条又单独查一次用户信息和商品快照，一次请求实际执行了 40+ 条 SQL。改成批量查询 + 内存组装：\norders = orderRepo.findByUser(userId, 20); userMap = userRepo.findByIds(orders.map(o =\u0026gt; o.userId)); itemMap = itemRepo.findByOrderIds(orders.map(o =\u0026gt; o.id)); // 内存里组装，总共 3 条 SQL 第三步：缓存热点数据（120ms → 80ms） 用户信息、商品快照这类读多写少的数据加 Redis 缓存，TTL 5 分钟 + 更新时主动失效。注意缓存 key 里带上版本号，避免出现\u0026quot;删了缓存但旧值又被写回\u0026quot;的竞态。\n优化效果 优 基 + + + 化 线 项 索 批 R 引 量 e 修 查 d 复 询 i 消 s 灭 热 N 点 + 缓 1 存 3 1 耗 0 2 8 时 8 0 0 0 变 0 m m m 化 0 s s s m s 经验总结 优化顺序：先定位（慢日志）→ 再减量（N+1、无用字段）→ 最后加缓存。反过来做等于掩盖问题 不要 SELECT *，只取序列化需要的字段，IO 和网络开销都会显著下降 加缓存前先想清楚失效策略，缓存不一致造成的线上事故比慢接口更难排查 ","permalink":"/posts/api-optimization/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e订单列表接口在数据量上来后 P99 响应达到 800ms，用户明显感知卡顿。目标：压到 100ms 以内，不升级硬件。\u003c/p\u003e\n\u003ch2 id=\"第一步慢查询定位800ms--300ms\"\u003e第一步：慢查询定位（800ms → 300ms）\u003c/h2\u003e\n\u003cp\u003e开启慢查询日志，发现列表页的统计子查询没走索引：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-sql\" data-lang=\"sql\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003eEXPLAIN\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eSELECT\u003c/span\u003e o.\u003cspan style=\"color:#f92672\"\u003e*\u003c/span\u003e, (\u003cspan style=\"color:#66d9ef\"\u003eSELECT\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eCOUNT\u003c/span\u003e(\u003cspan style=\"color:#f92672\"\u003e*\u003c/span\u003e) \u003cspan style=\"color:#66d9ef\"\u003eFROM\u003c/span\u003e order_item i\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#66d9ef\"\u003eWHERE\u003c/span\u003e i.order_id \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e o.id) \u003cspan style=\"color:#66d9ef\"\u003eAS\u003c/span\u003e item_count\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003eFROM\u003c/span\u003e orders o \u003cspan style=\"color:#66d9ef\"\u003eWHERE\u003c/span\u003e o.user_id \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e?\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eORDER\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eBY\u003c/span\u003e created_at \u003cspan style=\"color:#66d9ef\"\u003eDESC\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eLIMIT\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e20\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003eorder_item.order_id\u003c/code\u003e 没有索引，子查询对每行订单做全表扫描。加上索引后接口降到 300ms。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e第一刀永远先看慢查询日志。大部分\u0026quot;接口慢\u0026quot;的本质是\u0026quot;SQL 慢\u0026quot;。\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch2 id=\"第二步消灭-n1-查询300ms--120ms\"\u003e第二步：消灭 N+1 查询（300ms → 120ms）\u003c/h2\u003e\n\u003cp\u003eORM 的懒加载在序列化时触发了 N+1：列表 20 条订单，每条又单独查一次用户信息和商品快照，一次请求实际执行了 40+ 条 SQL。改成批量查询 + 内存组装：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-js\" data-lang=\"js\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003eorders\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eorderRepo\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efindByUser\u003c/span\u003e(\u003cspan style=\"color:#a6e22e\"\u003euserId\u003c/span\u003e, \u003cspan style=\"color:#ae81ff\"\u003e20\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003euserMap\u003c/span\u003e  \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003euserRepo\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efindByIds\u003c/span\u003e(\u003cspan style=\"color:#a6e22e\"\u003eorders\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003emap\u003c/span\u003e(\u003cspan style=\"color:#a6e22e\"\u003eo\u003c/span\u003e =\u0026gt; \u003cspan style=\"color:#a6e22e\"\u003eo\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003euserId\u003c/span\u003e));\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003eitemMap\u003c/span\u003e  \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eitemRepo\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003efindByOrderIds\u003c/span\u003e(\u003cspan style=\"color:#a6e22e\"\u003eorders\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003emap\u003c/span\u003e(\u003cspan style=\"color:#a6e22e\"\u003eo\u003c/span\u003e =\u0026gt; \u003cspan style=\"color:#a6e22e\"\u003eo\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003eid\u003c/span\u003e));\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e// 内存里组装，总共 3 条 SQL\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"第三步缓存热点数据120ms--80ms\"\u003e第三步：缓存热点数据（120ms → 80ms）\u003c/h2\u003e\n\u003cp\u003e用户信息、商品快照这类读多写少的数据加 Redis 缓存，TTL 5 分钟 + 更新时主动失效。注意缓存 key 里带上版本号，避免出现\u0026quot;删了缓存但旧值又被写回\u0026quot;的竞态。\u003c/p\u003e\n\u003ch2 id=\"优化效果\"\u003e优化效果\u003c/h2\u003e\n\n\n\n\u003cdiv class=\"goat svg-container \"\u003e\n  \n    \u003csvg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      font-family=\"Menlo,Lucida Console,monospace\"\n      \n        viewBox=\"0 0 176 89\"\n      \u003e\n      \u003cg transform='translate(8,16)'\u003e\n\u003ctext text-anchor='middle' x='0' y='4' fill='currentColor' style='font-size:1em'\u003e优\u003c/text\u003e\n\u003ctext text-anchor='middle' x='0' y='20' fill='currentColor' style='font-size:1em'\u003e基\u003c/text\u003e\n\u003ctext text-anchor='middle' x='0' y='36' fill='currentColor' style='font-size:1em'\u003e+\u003c/text\u003e\n\u003ctext text-anchor='middle' x='0' y='52' fill='currentColor' style='font-size:1em'\u003e+\u003c/text\u003e\n\u003ctext text-anchor='middle' x='0' y='68' fill='currentColor' style='font-size:1em'\u003e+\u003c/text\u003e\n\u003ctext text-anchor='middle' x='8' y='4' fill='currentColor' style='font-size:1em'\u003e化\u003c/text\u003e\n\u003ctext text-anchor='middle' x='8' y='20' fill='currentColor' style='font-size:1em'\u003e线\u003c/text\u003e\n\u003ctext text-anchor='middle' x='16' y='4' fill='currentColor' style='font-size:1em'\u003e项\u003c/text\u003e\n\u003ctext text-anchor='middle' x='16' y='36' fill='currentColor' style='font-size:1em'\u003e索\u003c/text\u003e\n\u003ctext text-anchor='middle' x='16' y='52' fill='currentColor' style='font-size:1em'\u003e批\u003c/text\u003e\n\u003ctext text-anchor='middle' x='16' y='68' fill='currentColor' style='font-size:1em'\u003eR\u003c/text\u003e\n\u003ctext text-anchor='middle' x='24' y='36' fill='currentColor' style='font-size:1em'\u003e引\u003c/text\u003e\n\u003ctext text-anchor='middle' x='24' y='52' fill='currentColor' style='font-size:1em'\u003e量\u003c/text\u003e\n\u003ctext text-anchor='middle' x='24' y='68' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='32' y='36' fill='currentColor' style='font-size:1em'\u003e修\u003c/text\u003e\n\u003ctext text-anchor='middle' x='32' y='52' fill='currentColor' style='font-size:1em'\u003e查\u003c/text\u003e\n\u003ctext text-anchor='middle' x='32' y='68' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='40' y='36' fill='currentColor' style='font-size:1em'\u003e复\u003c/text\u003e\n\u003ctext text-anchor='middle' x='40' y='52' fill='currentColor' style='font-size:1em'\u003e询\u003c/text\u003e\n\u003ctext text-anchor='middle' x='40' y='68' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='48' y='52' fill='currentColor' style='font-size:1em'\u003e消\u003c/text\u003e\n\u003ctext text-anchor='middle' x='48' y='68' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='56' y='52' fill='currentColor' style='font-size:1em'\u003e灭\u003c/text\u003e\n\u003ctext text-anchor='middle' x='64' y='68' fill='currentColor' style='font-size:1em'\u003e热\u003c/text\u003e\n\u003ctext text-anchor='middle' x='72' y='52' fill='currentColor' style='font-size:1em'\u003eN\u003c/text\u003e\n\u003ctext text-anchor='middle' x='72' y='68' fill='currentColor' style='font-size:1em'\u003e点\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='52' fill='currentColor' style='font-size:1em'\u003e+\u003c/text\u003e\n\u003ctext text-anchor='middle' x='80' y='68' fill='currentColor' style='font-size:1em'\u003e缓\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='52' fill='currentColor' style='font-size:1em'\u003e1\u003c/text\u003e\n\u003ctext text-anchor='middle' x='88' y='68' fill='currentColor' style='font-size:1em'\u003e存\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='36' fill='currentColor' style='font-size:1em'\u003e3\u003c/text\u003e\n\u003ctext text-anchor='middle' x='112' y='52' fill='currentColor' style='font-size:1em'\u003e1\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='4' fill='currentColor' style='font-size:1em'\u003e耗\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='36' fill='currentColor' style='font-size:1em'\u003e0\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='52' fill='currentColor' style='font-size:1em'\u003e2\u003c/text\u003e\n\u003ctext text-anchor='middle' x='120' y='68' fill='currentColor' style='font-size:1em'\u003e8\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='4' fill='currentColor' style='font-size:1em'\u003e时\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='20' fill='currentColor' style='font-size:1em'\u003e8\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='36' fill='currentColor' style='font-size:1em'\u003e0\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='52' fill='currentColor' style='font-size:1em'\u003e0\u003c/text\u003e\n\u003ctext text-anchor='middle' x='128' y='68' fill='currentColor' style='font-size:1em'\u003e0\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='4' fill='currentColor' style='font-size:1em'\u003e变\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='20' fill='currentColor' style='font-size:1em'\u003e0\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='36' fill='currentColor' style='font-size:1em'\u003em\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='52' fill='currentColor' style='font-size:1em'\u003em\u003c/text\u003e\n\u003ctext text-anchor='middle' x='136' y='68' fill='currentColor' style='font-size:1em'\u003em\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='4' fill='currentColor' style='font-size:1em'\u003e化\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='20' fill='currentColor' style='font-size:1em'\u003e0\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='36' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='52' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='68' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='20' fill='currentColor' style='font-size:1em'\u003em\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='20' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003c/g\u003e\n\n    \u003c/svg\u003e\n  \n\u003c/div\u003e\n\u003ch2 id=\"经验总结\"\u003e经验总结\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e优化顺序：\u003cstrong\u003e先定位（慢日志）→ 再减量（N+1、无用字段）→ 最后加缓存\u003c/strong\u003e。反过来做等于掩盖问题\u003c/li\u003e\n\u003cli\u003e不要 SELECT *，只取序列化需要的字段，IO 和网络开销都会显著下降\u003c/li\u003e\n\u003cli\u003e加缓存前先想清楚失效策略，缓存不一致造成的线上事故比慢接口更难排查\u003c/li\u003e\n\u003c/ul\u003e","title":"接口响应从 800ms 到 80ms 的优化之路"},{"content":"写在前面 以下每一条都来自真实的踩坑教训，按\u0026quot;违反时的代价\u0026quot;从高到低排列。\n正文 配置与代码分离。数据库地址、密钥永远不进代码仓库，环境变量或配置中心管理。泄漏一次就足够致命。 所有外部调用必须设超时。HTTP 客户端、数据库驱动、Redis 客户端，默认不设超时的库都会在对方卡死时拖垮你。 日志要能定位问题。关键链路打 traceId；日志带上下文（参数、耗时、结果状态）；ERROR 只留给需要人工介入的事。 重试要配合幂等。网络抖动重试是应该的，但下游接口必须幂等，否则一次超时重试就是两笔订单。 分支合并前必须过 CI。编译、单测、lint 三件套卡在合并前，而不是部署后。坏代码进 main 的成本是卡在分支上的十倍。 数据库变更走迁移脚本。手动改表结构的环境，迟早和代码版本不一致导致无法回滚。 命名宁可长而清楚。retryCountForPaymentGateway 好过 n。代码写一次，读很多次。 删掉的代码就删干净。注释掉的旧代码放两周就没人敢删了，Git 历史本来就是备份。 上线变更要可回滚。每次发布前问自己一句：出问题怎么退？回答不了的发布不上。 文档跟着代码走。接口文档、部署步骤过时比没有更糟。CI 里加文档检查或用代码即文档的工具。 一条隐藏规则 规范本身不重要，重要的是全组用同一套。风格不一致的代码库，维护成本比任何单个坏习惯都高。\n","permalink":"/posts/best-practices/","summary":"\u003ch2 id=\"写在前面\"\u003e写在前面\u003c/h2\u003e\n\u003cp\u003e以下每一条都来自真实的踩坑教训，按\u0026quot;违反时的代价\u0026quot;从高到低排列。\u003c/p\u003e\n\u003ch2 id=\"正文\"\u003e正文\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003e配置与代码分离\u003c/strong\u003e。数据库地址、密钥永远不进代码仓库，环境变量或配置中心管理。泄漏一次就足够致命。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e所有外部调用必须设超时\u003c/strong\u003e。HTTP 客户端、数据库驱动、Redis 客户端，默认不设超时的库都会在对方卡死时拖垮你。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e日志要能定位问题\u003c/strong\u003e。关键链路打 traceId；日志带上下文（参数、耗时、结果状态）；ERROR 只留给需要人工介入的事。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e重试要配合幂等\u003c/strong\u003e。网络抖动重试是应该的，但下游接口必须幂等，否则一次超时重试就是两笔订单。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e分支合并前必须过 CI\u003c/strong\u003e。编译、单测、lint 三件套卡在合并前，而不是部署后。坏代码进 main 的成本是卡在分支上的十倍。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e数据库变更走迁移脚本\u003c/strong\u003e。手动改表结构的环境，迟早和代码版本不一致导致无法回滚。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e命名宁可长而清楚\u003c/strong\u003e。\u003ccode\u003eretryCountForPaymentGateway\u003c/code\u003e 好过 \u003ccode\u003en\u003c/code\u003e。代码写一次，读很多次。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e删掉的代码就删干净\u003c/strong\u003e。注释掉的旧代码放两周就没人敢删了，Git 历史本来就是备份。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e上线变更要可回滚\u003c/strong\u003e。每次发布前问自己一句：出问题怎么退？回答不了的发布不上。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e文档跟着代码走\u003c/strong\u003e。接口文档、部署步骤过时比没有更糟。CI 里加文档检查或用代码即文档的工具。\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"一条隐藏规则\"\u003e一条隐藏规则\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003e规范本身不重要，重要的是\u003cstrong\u003e全组用同一套\u003c/strong\u003e。风格不一致的代码库，维护成本比任何单个坏习惯都高。\u003c/p\u003e\u003c/blockquote\u003e","title":"工程实践中最值得遵守的 10 条规范"}]