[{"data":1,"prerenderedAt":6456},["ShallowReactive",2],{"content-/topics/engineering/cache-layering-local-redis-cdn-guide":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"category":5,"tags":11,"author":17,"featured":18,"series":19,"seriesOrder":20,"readingTime":21,"image":22,"body":23,"_type":6450,"_id":6451,"_source":6452,"_file":6453,"_stem":6454,"_extension":6455},"/topics/engineering/cache-layering-local-redis-cdn-guide","engineering",false,"","缓存分层策略完全指南：本地缓存、Redis、CDN 到底该怎么配","缓存不是‘加个 Redis’就结束。本文从真实高并发场景出发，系统拆解本地缓存、Redis、CDN 的职责边界、回源策略、失效治理、热点保护与成本权衡，帮你建立一套可落地的多层缓存体系。","2026-03-07",[12,13,14,15,16],"缓存策略","Redis","CDN","高并发","系统设计","小明",true,"large-scale-application-architecture",4,18,"/images/articles/cache-layering-local-redis-cdn-guide-cover.jpg",{"type":24,"children":25,"toc":6363},"root",[26,34,40,49,54,62,67,75,80,91,96,126,138,143,172,177,181,188,193,198,203,222,227,234,239,345,350,373,378,389,395,400,423,428,431,437,443,448,453,471,476,492,503,508,514,540,545,551,556,579,584,589,607,612,618,623,628,656,661,1184,1189,1202,1214,1220,1225,1253,1258,1263,1271,1274,1280,1285,1390,1396,1402,1407,1425,1435,1441,1445,1468,1477,1483,1487,1510,1519,1525,1529,1552,1561,1566,1569,1575,1580,1586,1591,1614,1619,1624,1722,1728,2551,2556,2579,2582,2594,2607,2625,2630,2636,2967,2972,2985,2991,2996,3001,3014,3019,3032,3038,3043,3048,3066,3071,3079,3085,3090,3094,3112,3115,3121,3127,3132,3137,3142,3160,3540,3546,3551,3556,3579,3928,3934,3939,3944,3949,3972,3978,3983,4001,4006,4024,4029,4032,4038,4043,4049,4054,4072,4077,4091,4097,4626,4631,4649,4655,4678,4681,4687,4692,4697,4703,4731,4737,4742,4747,4765,4775,4781,4795,4800,4818,4823,4841,4844,4850,4855,4861,4867,4872,4877,4895,4901,4906,4910,4928,5101,5106,5124,5134,5140,5145,5159,5164,5169,5187,5192,5198,5203,5226,5230,5269,5274,5277,5283,5288,5293,5299,5303,5326,5332,5337,5437,5443,5448,5583,5588,5611,5616,5619,5625,5630,5635,5641,5646,5652,5657,5663,5668,5701,5706,5712,5717,5745,5750,5755,5758,5764,5769,5775,5780,5919,5925,5930,5935,5963,5969,5974,5997,6002,6008,6013,6018,6041,6046,6049,6055,6061,6105,6111,6151,6157,6206,6211,6260,6263,6268,6273,6326,6331,6339,6344,6349,6357],{"type":27,"tag":28,"props":29,"children":31},"element","h1",{"id":30},"缓存分层策略完全指南本地缓存rediscdn-到底该怎么配",[32],{"type":33,"value":8},"text",{"type":27,"tag":35,"props":36,"children":37},"p",{},[38],{"type":33,"value":39},"很多团队第一次遇到高并发，脑子里冒出来的第一句往往是：",{"type":27,"tag":41,"props":42,"children":43},"blockquote",{},[44],{"type":27,"tag":35,"props":45,"children":46},{},[47],{"type":33,"value":48},"上 Redis。",{"type":27,"tag":35,"props":50,"children":51},{},[52],{"type":33,"value":53},"第二次再出问题，会说：",{"type":27,"tag":41,"props":55,"children":56},{},[57],{"type":27,"tag":35,"props":58,"children":59},{},[60],{"type":33,"value":61},"再加一层 CDN。",{"type":27,"tag":35,"props":63,"children":64},{},[65],{"type":33,"value":66},"第三次故障复盘时，会议室里通常会出现一句更诚实的话：",{"type":27,"tag":41,"props":68,"children":69},{},[70],{"type":27,"tag":35,"props":71,"children":72},{},[73],{"type":33,"value":74},"为什么我们明明有缓存，系统还是被打穿了？",{"type":27,"tag":35,"props":76,"children":77},{},[78],{"type":33,"value":79},"这句话很关键。",{"type":27,"tag":35,"props":81,"children":82},{},[83,85],{"type":33,"value":84},"因为缓存从来不是“有”或“没有”的问题，而是：",{"type":27,"tag":86,"props":87,"children":88},"strong",{},[89],{"type":33,"value":90},"你的每一层缓存，到底在拦截什么流量，承受什么一致性要求，以及在失效时会把压力转嫁给谁。",{"type":27,"tag":35,"props":92,"children":93},{},[94],{"type":33,"value":95},"很多线上事故都不是因为没有缓存，而是因为缓存体系不成体系：",{"type":27,"tag":97,"props":98,"children":99},"ul",{},[100,106,111,116,121],{"type":27,"tag":101,"props":102,"children":103},"li",{},[104],{"type":33,"value":105},"浏览器缓存、CDN、网关缓存、应用本地缓存、Redis 各自为战",{"type":27,"tag":101,"props":107,"children":108},{},[109],{"type":33,"value":110},"缓存 key 命名混乱，删不干净",{"type":27,"tag":101,"props":112,"children":113},{},[114],{"type":33,"value":115},"热点 key 失效后瞬间回源，把数据库打满",{"type":27,"tag":101,"props":117,"children":118},{},[119],{"type":33,"value":120},"静态资源明明适合长缓存，却每次都重新请求",{"type":27,"tag":101,"props":122,"children":123},{},[124],{"type":33,"value":125},"本地缓存命中率很高，但实例扩容后一致性全乱了",{"type":27,"tag":35,"props":127,"children":128},{},[129,131,136],{"type":33,"value":130},"缓存真正难的地方，不在于 API 调用，而在于",{"type":27,"tag":86,"props":132,"children":133},{},[134],{"type":33,"value":135},"边界设计",{"type":33,"value":137},"。",{"type":27,"tag":35,"props":139,"children":140},{},[141],{"type":33,"value":142},"这篇文章想解决的，不是“Redis 怎么 set/get”，而是更接近真实系统的几个问题：",{"type":27,"tag":144,"props":145,"children":146},"ol",{},[147,152,157,162,167],{"type":27,"tag":101,"props":148,"children":149},{},[150],{"type":33,"value":151},"什么数据该放浏览器 / CDN，什么该放本地缓存，什么该放 Redis",{"type":27,"tag":101,"props":153,"children":154},{},[155],{"type":33,"value":156},"多层缓存的职责怎么拆，才不会互相打架",{"type":27,"tag":101,"props":158,"children":159},{},[160],{"type":33,"value":161},"怎样处理热点 key、缓存穿透、击穿、雪崩",{"type":27,"tag":101,"props":163,"children":164},{},[165],{"type":33,"value":166},"怎样设计失效、预热、回源和降级策略",{"type":27,"tag":101,"props":168,"children":169},{},[170],{"type":33,"value":171},"什么时候缓存值得做，什么时候只是在掩盖底层设计问题",{"type":27,"tag":35,"props":173,"children":174},{},[175],{"type":33,"value":176},"如果你正在做一个访问量持续上涨的系统，这篇比“缓存面试八股”更接近实际战场。",{"type":27,"tag":178,"props":179,"children":180},"hr",{},[],{"type":27,"tag":182,"props":183,"children":185},"h2",{"id":184},"一先把问题说透缓存不是优化插件而是流量分流系统",[186],{"type":33,"value":187},"一、先把问题说透：缓存不是优化插件，而是流量分流系统",{"type":27,"tag":35,"props":189,"children":190},{},[191],{"type":33,"value":192},"很多人把缓存理解成“让数据读取更快”。",{"type":27,"tag":35,"props":194,"children":195},{},[196],{"type":33,"value":197},"这句话不能算错，但不够完整。",{"type":27,"tag":35,"props":199,"children":200},{},[201],{"type":33,"value":202},"在工程上，缓存最核心的价值其实是两件事：",{"type":27,"tag":144,"props":204,"children":205},{},[206,214],{"type":27,"tag":101,"props":207,"children":208},{},[209],{"type":27,"tag":86,"props":210,"children":211},{},[212],{"type":33,"value":213},"把重复请求挡在更靠前的地方",{"type":27,"tag":101,"props":215,"children":216},{},[217],{"type":27,"tag":86,"props":218,"children":219},{},[220],{"type":33,"value":221},"把昂贵依赖保护在更靠后的地方",{"type":27,"tag":35,"props":223,"children":224},{},[225],{"type":33,"value":226},"所谓“更靠前”，是离用户更近；所谓“更靠后”，是离数据库、搜索引擎、对象存储这些昂贵资源更近。",{"type":27,"tag":228,"props":229,"children":231},"h3",{"id":230},"_11-一个直观的分层视角",[232],{"type":33,"value":233},"1.1 一个直观的分层视角",{"type":27,"tag":35,"props":235,"children":236},{},[237],{"type":33,"value":238},"你可以把一次请求理解成一条向后传播的压力链：",{"type":27,"tag":240,"props":241,"children":244},"pre",{"className":242,"code":243,"language":33,"meta":7,"style":7},"language-text shiki shiki-themes github-dark","用户浏览器\n  ↓\nCDN / Edge\n  ↓\n网关 / BFF\n  ↓\n应用实例本地缓存\n  ↓\nRedis\n  ↓\n数据库 / 搜索 / 下游服务\n",[245],{"type":27,"tag":246,"props":247,"children":248},"code",{"__ignoreMap":7},[249,260,269,278,285,294,302,311,319,328,336],{"type":27,"tag":250,"props":251,"children":254},"span",{"class":252,"line":253},"line",1,[255],{"type":27,"tag":250,"props":256,"children":257},{},[258],{"type":33,"value":259},"用户浏览器\n",{"type":27,"tag":250,"props":261,"children":263},{"class":252,"line":262},2,[264],{"type":27,"tag":250,"props":265,"children":266},{},[267],{"type":33,"value":268},"  ↓\n",{"type":27,"tag":250,"props":270,"children":272},{"class":252,"line":271},3,[273],{"type":27,"tag":250,"props":274,"children":275},{},[276],{"type":33,"value":277},"CDN / Edge\n",{"type":27,"tag":250,"props":279,"children":280},{"class":252,"line":20},[281],{"type":27,"tag":250,"props":282,"children":283},{},[284],{"type":33,"value":268},{"type":27,"tag":250,"props":286,"children":288},{"class":252,"line":287},5,[289],{"type":27,"tag":250,"props":290,"children":291},{},[292],{"type":33,"value":293},"网关 / BFF\n",{"type":27,"tag":250,"props":295,"children":297},{"class":252,"line":296},6,[298],{"type":27,"tag":250,"props":299,"children":300},{},[301],{"type":33,"value":268},{"type":27,"tag":250,"props":303,"children":305},{"class":252,"line":304},7,[306],{"type":27,"tag":250,"props":307,"children":308},{},[309],{"type":33,"value":310},"应用实例本地缓存\n",{"type":27,"tag":250,"props":312,"children":314},{"class":252,"line":313},8,[315],{"type":27,"tag":250,"props":316,"children":317},{},[318],{"type":33,"value":268},{"type":27,"tag":250,"props":320,"children":322},{"class":252,"line":321},9,[323],{"type":27,"tag":250,"props":324,"children":325},{},[326],{"type":33,"value":327},"Redis\n",{"type":27,"tag":250,"props":329,"children":331},{"class":252,"line":330},10,[332],{"type":27,"tag":250,"props":333,"children":334},{},[335],{"type":33,"value":268},{"type":27,"tag":250,"props":337,"children":339},{"class":252,"line":338},11,[340],{"type":27,"tag":250,"props":341,"children":342},{},[343],{"type":33,"value":344},"数据库 / 搜索 / 下游服务\n",{"type":27,"tag":35,"props":346,"children":347},{},[348],{"type":33,"value":349},"链路越往后：",{"type":27,"tag":97,"props":351,"children":352},{},[353,358,363,368],{"type":27,"tag":101,"props":354,"children":355},{},[356],{"type":33,"value":357},"单次成本越高",{"type":27,"tag":101,"props":359,"children":360},{},[361],{"type":33,"value":362},"响应越慢",{"type":27,"tag":101,"props":364,"children":365},{},[366],{"type":33,"value":367},"资源越贵",{"type":27,"tag":101,"props":369,"children":370},{},[371],{"type":33,"value":372},"被打穿后的恢复越麻烦",{"type":27,"tag":35,"props":374,"children":375},{},[376],{"type":33,"value":377},"所以缓存分层的本质，不是“堆更多缓存”，而是：",{"type":27,"tag":41,"props":379,"children":380},{},[381],{"type":27,"tag":35,"props":382,"children":383},{},[384],{"type":27,"tag":86,"props":385,"children":386},{},[387],{"type":33,"value":388},"尽量让更多请求在更前面的层级被消化掉。",{"type":27,"tag":228,"props":390,"children":392},{"id":391},"_12-为什么只有-redis不够",[393],{"type":33,"value":394},"1.2 为什么“只有 Redis”不够",{"type":27,"tag":35,"props":396,"children":397},{},[398],{"type":33,"value":399},"很多团队把缓存建设简化成 Redis 一层。这在项目早期是够用的，但规模上来后会暴露 4 个问题：",{"type":27,"tag":97,"props":401,"children":402},{},[403,408,413,418],{"type":27,"tag":101,"props":404,"children":405},{},[406],{"type":33,"value":407},"所有请求仍然要进应用层，应用 CPU 和连接数压力没有被前移消化",{"type":27,"tag":101,"props":409,"children":410},{},[411],{"type":33,"value":412},"Redis 成为新的中心瓶颈",{"type":27,"tag":101,"props":414,"children":415},{},[416],{"type":33,"value":417},"跨地域访问时网络 RTT 抵消一部分收益",{"type":27,"tag":101,"props":419,"children":420},{},[421],{"type":33,"value":422},"静态资源和弱动态内容没有利用浏览器 / CDN 的天然能力",{"type":27,"tag":35,"props":424,"children":425},{},[426],{"type":33,"value":427},"Redis 很重要，但它不是缓存体系的全部，只是中间层里最常见的一层。",{"type":27,"tag":178,"props":429,"children":430},{},[],{"type":27,"tag":182,"props":432,"children":434},{"id":433},"二四层缓存分别负责什么",[435],{"type":33,"value":436},"二、四层缓存分别负责什么",{"type":27,"tag":228,"props":438,"children":440},{"id":439},"_21-浏览器缓存最便宜也最容易被浪费",[441],{"type":33,"value":442},"2.1 浏览器缓存：最便宜，也最容易被浪费",{"type":27,"tag":35,"props":444,"children":445},{},[446],{"type":33,"value":447},"浏览器缓存是距离用户最近的一层。只要命中，请求甚至不需要真正到达你的服务器。",{"type":27,"tag":35,"props":449,"children":450},{},[451],{"type":33,"value":452},"最适合浏览器缓存的内容：",{"type":27,"tag":97,"props":454,"children":455},{},[456,461,466],{"type":27,"tag":101,"props":457,"children":458},{},[459],{"type":33,"value":460},"带 hash 的 JS / CSS",{"type":27,"tag":101,"props":462,"children":463},{},[464],{"type":33,"value":465},"版本化图片、字体、图标",{"type":27,"tag":101,"props":467,"children":468},{},[469],{"type":33,"value":470},"不频繁变化的静态 JSON 配置",{"type":27,"tag":35,"props":472,"children":473},{},[474],{"type":33,"value":475},"典型响应头：",{"type":27,"tag":240,"props":477,"children":481},{"className":478,"code":479,"language":480,"meta":7,"style":7},"language-http shiki shiki-themes github-dark","Cache-Control: public, max-age=31536000, immutable\n","http",[482],{"type":27,"tag":246,"props":483,"children":484},{"__ignoreMap":7},[485],{"type":27,"tag":250,"props":486,"children":487},{"class":252,"line":253},[488],{"type":27,"tag":250,"props":489,"children":490},{},[491],{"type":33,"value":479},{"type":27,"tag":35,"props":493,"children":494},{},[495,497,502],{"type":33,"value":496},"这类资源最大的关键不是“缓存时间设多长”，而是",{"type":27,"tag":86,"props":498,"children":499},{},[500],{"type":33,"value":501},"内容变了，URL 也必须变",{"type":33,"value":137},{"type":27,"tag":35,"props":504,"children":505},{},[506],{"type":33,"value":507},"如果你不能保证这一点，长缓存就会变成脏缓存。",{"type":27,"tag":509,"props":510,"children":512},"h4",{"id":511},"常见误区",[513],{"type":33,"value":511},{"type":27,"tag":97,"props":515,"children":516},{},[517,522,535],{"type":27,"tag":101,"props":518,"children":519},{},[520],{"type":33,"value":521},"HTML 页面也直接缓存一年",{"type":27,"tag":101,"props":523,"children":524},{},[525,527,533],{"type":33,"value":526},"没有文件 hash，却把 ",{"type":27,"tag":246,"props":528,"children":530},{"className":529},[],[531],{"type":33,"value":532},"max-age",{"type":33,"value":534}," 配很长",{"type":27,"tag":101,"props":536,"children":537},{},[538],{"type":33,"value":539},"用户投诉看到旧页面时，只会让他“强刷一下试试”",{"type":27,"tag":35,"props":541,"children":542},{},[543],{"type":33,"value":544},"强刷当然是个办法，但这相当于把你的发布系统设计问题，转嫁给用户手动解决。",{"type":27,"tag":228,"props":546,"children":548},{"id":547},"_22-cdn适合大范围分发不适合承担复杂业务一致性",[549],{"type":33,"value":550},"2.2 CDN：适合大范围分发，不适合承担复杂业务一致性",{"type":27,"tag":35,"props":552,"children":553},{},[554],{"type":33,"value":555},"CDN 最擅长的是：",{"type":27,"tag":97,"props":557,"children":558},{},[559,564,569,574],{"type":27,"tag":101,"props":560,"children":561},{},[562],{"type":33,"value":563},"静态资源分发",{"type":27,"tag":101,"props":565,"children":566},{},[567],{"type":33,"value":568},"图片、视频、下载文件加速",{"type":27,"tag":101,"props":570,"children":571},{},[572],{"type":33,"value":573},"弱动态页面边缘缓存",{"type":27,"tag":101,"props":575,"children":576},{},[577],{"type":33,"value":578},"吸收大规模重复访问流量",{"type":27,"tag":35,"props":580,"children":581},{},[582],{"type":33,"value":583},"例如活动会场页、商品详情页的部分拼装结果、公开文章详情，都很适合 CDN 做第一道拦截。",{"type":27,"tag":35,"props":585,"children":586},{},[587],{"type":33,"value":588},"一个典型例子：",{"type":27,"tag":97,"props":590,"children":591},{},[592,597,602],{"type":27,"tag":101,"props":593,"children":594},{},[595],{"type":33,"value":596},"首页 banner 图：浏览器 + CDN 长缓存",{"type":27,"tag":101,"props":598,"children":599},{},[600],{"type":33,"value":601},"活动页骨架 HTML：CDN 短缓存 30 秒",{"type":27,"tag":101,"props":603,"children":604},{},[605],{"type":33,"value":606},"用户个性化信息：不进 CDN，走后端实时获取",{"type":27,"tag":35,"props":608,"children":609},{},[610],{"type":33,"value":611},"这样做的好处，是把“所有人都一样的数据”和“因人而异的数据”拆开。",{"type":27,"tag":228,"props":613,"children":615},{"id":614},"_23-应用本地缓存最快但最容易产生一致性问题",[616],{"type":33,"value":617},"2.3 应用本地缓存：最快，但最容易产生一致性问题",{"type":27,"tag":35,"props":619,"children":620},{},[621],{"type":33,"value":622},"本地缓存通常在单个进程内，命中时快得像内存访问。",{"type":27,"tag":35,"props":624,"children":625},{},[626],{"type":33,"value":627},"最适合本地缓存的是：",{"type":27,"tag":97,"props":629,"children":630},{},[631,636,641,646,651],{"type":27,"tag":101,"props":632,"children":633},{},[634],{"type":33,"value":635},"热点配置",{"type":27,"tag":101,"props":637,"children":638},{},[639],{"type":33,"value":640},"权限模型快照",{"type":27,"tag":101,"props":642,"children":643},{},[644],{"type":33,"value":645},"只读字典",{"type":27,"tag":101,"props":647,"children":648},{},[649],{"type":33,"value":650},"短 TTL 的热点对象",{"type":27,"tag":101,"props":652,"children":653},{},[654],{"type":33,"value":655},"下游接口的轻量结果",{"type":27,"tag":35,"props":657,"children":658},{},[659],{"type":33,"value":660},"一个常见实现：",{"type":27,"tag":240,"props":662,"children":666},{"className":663,"code":664,"language":665,"meta":7,"style":7},"language-ts shiki shiki-themes github-dark","class LocalCache\u003CV> {\n  private store = new Map\u003Cstring, { value: V; expiresAt: number }>()\n\n  get(key: string): V | null {\n    const item = this.store.get(key)\n    if (!item) return null\n\n    if (Date.now() > item.expiresAt) {\n      this.store.delete(key)\n      return null\n    }\n\n    return item.value\n  }\n\n  set(key: string, value: V, ttlMs: number) {\n    this.store.set(key, {\n      value,\n      expiresAt: Date.now() + ttlMs,\n    })\n  }\n}\n","ts",[667],{"type":27,"tag":246,"props":668,"children":669},{"__ignoreMap":7},[670,701,784,792,847,884,917,924,956,977,989,997,1005,1019,1028,1036,1100,1123,1131,1158,1167,1175],{"type":27,"tag":250,"props":671,"children":672},{"class":252,"line":253},[673,679,685,691,696],{"type":27,"tag":250,"props":674,"children":676},{"style":675},"--shiki-default:#F97583",[677],{"type":33,"value":678},"class",{"type":27,"tag":250,"props":680,"children":682},{"style":681},"--shiki-default:#B392F0",[683],{"type":33,"value":684}," LocalCache",{"type":27,"tag":250,"props":686,"children":688},{"style":687},"--shiki-default:#E1E4E8",[689],{"type":33,"value":690},"\u003C",{"type":27,"tag":250,"props":692,"children":693},{"style":681},[694],{"type":33,"value":695},"V",{"type":27,"tag":250,"props":697,"children":698},{"style":687},[699],{"type":33,"value":700},"> {\n",{"type":27,"tag":250,"props":702,"children":703},{"class":252,"line":262},[704,709,715,720,725,730,734,740,745,750,755,760,765,770,774,779],{"type":27,"tag":250,"props":705,"children":706},{"style":675},[707],{"type":33,"value":708},"  private",{"type":27,"tag":250,"props":710,"children":712},{"style":711},"--shiki-default:#FFAB70",[713],{"type":33,"value":714}," store",{"type":27,"tag":250,"props":716,"children":717},{"style":675},[718],{"type":33,"value":719}," =",{"type":27,"tag":250,"props":721,"children":722},{"style":675},[723],{"type":33,"value":724}," new",{"type":27,"tag":250,"props":726,"children":727},{"style":681},[728],{"type":33,"value":729}," Map",{"type":27,"tag":250,"props":731,"children":732},{"style":687},[733],{"type":33,"value":690},{"type":27,"tag":250,"props":735,"children":737},{"style":736},"--shiki-default:#79B8FF",[738],{"type":33,"value":739},"string",{"type":27,"tag":250,"props":741,"children":742},{"style":687},[743],{"type":33,"value":744},", { ",{"type":27,"tag":250,"props":746,"children":747},{"style":711},[748],{"type":33,"value":749},"value",{"type":27,"tag":250,"props":751,"children":752},{"style":675},[753],{"type":33,"value":754},":",{"type":27,"tag":250,"props":756,"children":757},{"style":681},[758],{"type":33,"value":759}," V",{"type":27,"tag":250,"props":761,"children":762},{"style":687},[763],{"type":33,"value":764},"; ",{"type":27,"tag":250,"props":766,"children":767},{"style":711},[768],{"type":33,"value":769},"expiresAt",{"type":27,"tag":250,"props":771,"children":772},{"style":675},[773],{"type":33,"value":754},{"type":27,"tag":250,"props":775,"children":776},{"style":736},[777],{"type":33,"value":778}," number",{"type":27,"tag":250,"props":780,"children":781},{"style":687},[782],{"type":33,"value":783}," }>()\n",{"type":27,"tag":250,"props":785,"children":786},{"class":252,"line":271},[787],{"type":27,"tag":250,"props":788,"children":789},{"emptyLinePlaceholder":18},[790],{"type":33,"value":791},"\n",{"type":27,"tag":250,"props":793,"children":794},{"class":252,"line":20},[795,800,805,810,814,819,824,828,832,837,842],{"type":27,"tag":250,"props":796,"children":797},{"style":681},[798],{"type":33,"value":799},"  get",{"type":27,"tag":250,"props":801,"children":802},{"style":687},[803],{"type":33,"value":804},"(",{"type":27,"tag":250,"props":806,"children":807},{"style":711},[808],{"type":33,"value":809},"key",{"type":27,"tag":250,"props":811,"children":812},{"style":675},[813],{"type":33,"value":754},{"type":27,"tag":250,"props":815,"children":816},{"style":736},[817],{"type":33,"value":818}," string",{"type":27,"tag":250,"props":820,"children":821},{"style":687},[822],{"type":33,"value":823},")",{"type":27,"tag":250,"props":825,"children":826},{"style":675},[827],{"type":33,"value":754},{"type":27,"tag":250,"props":829,"children":830},{"style":681},[831],{"type":33,"value":759},{"type":27,"tag":250,"props":833,"children":834},{"style":675},[835],{"type":33,"value":836}," |",{"type":27,"tag":250,"props":838,"children":839},{"style":736},[840],{"type":33,"value":841}," null",{"type":27,"tag":250,"props":843,"children":844},{"style":687},[845],{"type":33,"value":846}," {\n",{"type":27,"tag":250,"props":848,"children":849},{"class":252,"line":287},[850,855,860,864,869,874,879],{"type":27,"tag":250,"props":851,"children":852},{"style":675},[853],{"type":33,"value":854},"    const",{"type":27,"tag":250,"props":856,"children":857},{"style":736},[858],{"type":33,"value":859}," item",{"type":27,"tag":250,"props":861,"children":862},{"style":675},[863],{"type":33,"value":719},{"type":27,"tag":250,"props":865,"children":866},{"style":736},[867],{"type":33,"value":868}," this",{"type":27,"tag":250,"props":870,"children":871},{"style":687},[872],{"type":33,"value":873},".store.",{"type":27,"tag":250,"props":875,"children":876},{"style":681},[877],{"type":33,"value":878},"get",{"type":27,"tag":250,"props":880,"children":881},{"style":687},[882],{"type":33,"value":883},"(key)\n",{"type":27,"tag":250,"props":885,"children":886},{"class":252,"line":296},[887,892,897,902,907,912],{"type":27,"tag":250,"props":888,"children":889},{"style":675},[890],{"type":33,"value":891},"    if",{"type":27,"tag":250,"props":893,"children":894},{"style":687},[895],{"type":33,"value":896}," (",{"type":27,"tag":250,"props":898,"children":899},{"style":675},[900],{"type":33,"value":901},"!",{"type":27,"tag":250,"props":903,"children":904},{"style":687},[905],{"type":33,"value":906},"item) ",{"type":27,"tag":250,"props":908,"children":909},{"style":675},[910],{"type":33,"value":911},"return",{"type":27,"tag":250,"props":913,"children":914},{"style":736},[915],{"type":33,"value":916}," null\n",{"type":27,"tag":250,"props":918,"children":919},{"class":252,"line":304},[920],{"type":27,"tag":250,"props":921,"children":922},{"emptyLinePlaceholder":18},[923],{"type":33,"value":791},{"type":27,"tag":250,"props":925,"children":926},{"class":252,"line":313},[927,931,936,941,946,951],{"type":27,"tag":250,"props":928,"children":929},{"style":675},[930],{"type":33,"value":891},{"type":27,"tag":250,"props":932,"children":933},{"style":687},[934],{"type":33,"value":935}," (Date.",{"type":27,"tag":250,"props":937,"children":938},{"style":681},[939],{"type":33,"value":940},"now",{"type":27,"tag":250,"props":942,"children":943},{"style":687},[944],{"type":33,"value":945},"() ",{"type":27,"tag":250,"props":947,"children":948},{"style":675},[949],{"type":33,"value":950},">",{"type":27,"tag":250,"props":952,"children":953},{"style":687},[954],{"type":33,"value":955}," item.expiresAt) {\n",{"type":27,"tag":250,"props":957,"children":958},{"class":252,"line":321},[959,964,968,973],{"type":27,"tag":250,"props":960,"children":961},{"style":736},[962],{"type":33,"value":963},"      this",{"type":27,"tag":250,"props":965,"children":966},{"style":687},[967],{"type":33,"value":873},{"type":27,"tag":250,"props":969,"children":970},{"style":681},[971],{"type":33,"value":972},"delete",{"type":27,"tag":250,"props":974,"children":975},{"style":687},[976],{"type":33,"value":883},{"type":27,"tag":250,"props":978,"children":979},{"class":252,"line":330},[980,985],{"type":27,"tag":250,"props":981,"children":982},{"style":675},[983],{"type":33,"value":984},"      return",{"type":27,"tag":250,"props":986,"children":987},{"style":736},[988],{"type":33,"value":916},{"type":27,"tag":250,"props":990,"children":991},{"class":252,"line":338},[992],{"type":27,"tag":250,"props":993,"children":994},{"style":687},[995],{"type":33,"value":996},"    }\n",{"type":27,"tag":250,"props":998,"children":1000},{"class":252,"line":999},12,[1001],{"type":27,"tag":250,"props":1002,"children":1003},{"emptyLinePlaceholder":18},[1004],{"type":33,"value":791},{"type":27,"tag":250,"props":1006,"children":1008},{"class":252,"line":1007},13,[1009,1014],{"type":27,"tag":250,"props":1010,"children":1011},{"style":675},[1012],{"type":33,"value":1013},"    return",{"type":27,"tag":250,"props":1015,"children":1016},{"style":687},[1017],{"type":33,"value":1018}," item.value\n",{"type":27,"tag":250,"props":1020,"children":1022},{"class":252,"line":1021},14,[1023],{"type":27,"tag":250,"props":1024,"children":1025},{"style":687},[1026],{"type":33,"value":1027},"  }\n",{"type":27,"tag":250,"props":1029,"children":1031},{"class":252,"line":1030},15,[1032],{"type":27,"tag":250,"props":1033,"children":1034},{"emptyLinePlaceholder":18},[1035],{"type":33,"value":791},{"type":27,"tag":250,"props":1037,"children":1039},{"class":252,"line":1038},16,[1040,1045,1049,1053,1057,1061,1066,1070,1074,1078,1082,1087,1091,1095],{"type":27,"tag":250,"props":1041,"children":1042},{"style":681},[1043],{"type":33,"value":1044},"  set",{"type":27,"tag":250,"props":1046,"children":1047},{"style":687},[1048],{"type":33,"value":804},{"type":27,"tag":250,"props":1050,"children":1051},{"style":711},[1052],{"type":33,"value":809},{"type":27,"tag":250,"props":1054,"children":1055},{"style":675},[1056],{"type":33,"value":754},{"type":27,"tag":250,"props":1058,"children":1059},{"style":736},[1060],{"type":33,"value":818},{"type":27,"tag":250,"props":1062,"children":1063},{"style":687},[1064],{"type":33,"value":1065},", ",{"type":27,"tag":250,"props":1067,"children":1068},{"style":711},[1069],{"type":33,"value":749},{"type":27,"tag":250,"props":1071,"children":1072},{"style":675},[1073],{"type":33,"value":754},{"type":27,"tag":250,"props":1075,"children":1076},{"style":681},[1077],{"type":33,"value":759},{"type":27,"tag":250,"props":1079,"children":1080},{"style":687},[1081],{"type":33,"value":1065},{"type":27,"tag":250,"props":1083,"children":1084},{"style":711},[1085],{"type":33,"value":1086},"ttlMs",{"type":27,"tag":250,"props":1088,"children":1089},{"style":675},[1090],{"type":33,"value":754},{"type":27,"tag":250,"props":1092,"children":1093},{"style":736},[1094],{"type":33,"value":778},{"type":27,"tag":250,"props":1096,"children":1097},{"style":687},[1098],{"type":33,"value":1099},") {\n",{"type":27,"tag":250,"props":1101,"children":1103},{"class":252,"line":1102},17,[1104,1109,1113,1118],{"type":27,"tag":250,"props":1105,"children":1106},{"style":736},[1107],{"type":33,"value":1108},"    this",{"type":27,"tag":250,"props":1110,"children":1111},{"style":687},[1112],{"type":33,"value":873},{"type":27,"tag":250,"props":1114,"children":1115},{"style":681},[1116],{"type":33,"value":1117},"set",{"type":27,"tag":250,"props":1119,"children":1120},{"style":687},[1121],{"type":33,"value":1122},"(key, {\n",{"type":27,"tag":250,"props":1124,"children":1125},{"class":252,"line":21},[1126],{"type":27,"tag":250,"props":1127,"children":1128},{"style":687},[1129],{"type":33,"value":1130},"      value,\n",{"type":27,"tag":250,"props":1132,"children":1134},{"class":252,"line":1133},19,[1135,1140,1144,1148,1153],{"type":27,"tag":250,"props":1136,"children":1137},{"style":687},[1138],{"type":33,"value":1139},"      expiresAt: Date.",{"type":27,"tag":250,"props":1141,"children":1142},{"style":681},[1143],{"type":33,"value":940},{"type":27,"tag":250,"props":1145,"children":1146},{"style":687},[1147],{"type":33,"value":945},{"type":27,"tag":250,"props":1149,"children":1150},{"style":675},[1151],{"type":33,"value":1152},"+",{"type":27,"tag":250,"props":1154,"children":1155},{"style":687},[1156],{"type":33,"value":1157}," ttlMs,\n",{"type":27,"tag":250,"props":1159,"children":1161},{"class":252,"line":1160},20,[1162],{"type":27,"tag":250,"props":1163,"children":1164},{"style":687},[1165],{"type":33,"value":1166},"    })\n",{"type":27,"tag":250,"props":1168,"children":1170},{"class":252,"line":1169},21,[1171],{"type":27,"tag":250,"props":1172,"children":1173},{"style":687},[1174],{"type":33,"value":1027},{"type":27,"tag":250,"props":1176,"children":1178},{"class":252,"line":1177},22,[1179],{"type":27,"tag":250,"props":1180,"children":1181},{"style":687},[1182],{"type":33,"value":1183},"}\n",{"type":27,"tag":35,"props":1185,"children":1186},{},[1187],{"type":33,"value":1188},"看起来简单，但本地缓存有两个天然限制：",{"type":27,"tag":144,"props":1190,"children":1191},{},[1192,1197],{"type":27,"tag":101,"props":1193,"children":1194},{},[1195],{"type":33,"value":1196},"实例之间不共享",{"type":27,"tag":101,"props":1198,"children":1199},{},[1200],{"type":33,"value":1201},"实例重启就丢",{"type":27,"tag":35,"props":1203,"children":1204},{},[1205,1207,1212],{"type":33,"value":1206},"所以它适合承担",{"type":27,"tag":86,"props":1208,"children":1209},{},[1210],{"type":33,"value":1211},"高频、可接受短暂不一致、回源代价不算太高",{"type":33,"value":1213},"的数据，而不适合作为唯一真相来源。",{"type":27,"tag":228,"props":1215,"children":1217},{"id":1216},"_24-redis共享缓存层不是真理之书",[1218],{"type":33,"value":1219},"2.4 Redis：共享缓存层，不是真理之书",{"type":27,"tag":35,"props":1221,"children":1222},{},[1223],{"type":33,"value":1224},"Redis 最常见的角色是：",{"type":27,"tag":97,"props":1226,"children":1227},{},[1228,1233,1238,1243,1248],{"type":27,"tag":101,"props":1229,"children":1230},{},[1231],{"type":33,"value":1232},"多实例共享缓存",{"type":27,"tag":101,"props":1234,"children":1235},{},[1236],{"type":33,"value":1237},"分布式限流与计数",{"type":27,"tag":101,"props":1239,"children":1240},{},[1241],{"type":33,"value":1242},"排行榜、会话、短期状态",{"type":27,"tag":101,"props":1244,"children":1245},{},[1246],{"type":33,"value":1247},"热点对象缓存",{"type":27,"tag":101,"props":1249,"children":1250},{},[1251],{"type":33,"value":1252},"分布式锁辅助",{"type":27,"tag":35,"props":1254,"children":1255},{},[1256],{"type":33,"value":1257},"它比本地缓存更一致，比数据库更快，但也更贵、更脆弱、更需要治理。",{"type":27,"tag":35,"props":1259,"children":1260},{},[1261],{"type":33,"value":1262},"一个成熟的认知是：",{"type":27,"tag":41,"props":1264,"children":1265},{},[1266],{"type":27,"tag":35,"props":1267,"children":1268},{},[1269],{"type":33,"value":1270},"Redis 是用来挡住数据库和下游服务的，不是让你把所有东西都塞进去的。",{"type":27,"tag":178,"props":1272,"children":1273},{},[],{"type":27,"tag":182,"props":1275,"children":1277},{"id":1276},"三怎样判断一份数据该放哪一层",[1278],{"type":33,"value":1279},"三、怎样判断一份数据该放哪一层",{"type":27,"tag":35,"props":1281,"children":1282},{},[1283],{"type":33,"value":1284},"最有效的判断，不是看技术喜好，而是看 4 个维度：",{"type":27,"tag":1286,"props":1287,"children":1288},"table",{},[1289,1313],{"type":27,"tag":1290,"props":1291,"children":1292},"thead",{},[1293],{"type":27,"tag":1294,"props":1295,"children":1296},"tr",{},[1297,1303,1308],{"type":27,"tag":1298,"props":1299,"children":1300},"th",{},[1301],{"type":33,"value":1302},"维度",{"type":27,"tag":1298,"props":1304,"children":1305},{},[1306],{"type":33,"value":1307},"要问的问题",{"type":27,"tag":1298,"props":1309,"children":1310},{},[1311],{"type":33,"value":1312},"影响",{"type":27,"tag":1314,"props":1315,"children":1316},"tbody",{},[1317,1336,1354,1372],{"type":27,"tag":1294,"props":1318,"children":1319},{},[1320,1326,1331],{"type":27,"tag":1321,"props":1322,"children":1323},"td",{},[1324],{"type":33,"value":1325},"变化频率",{"type":27,"tag":1321,"props":1327,"children":1328},{},[1329],{"type":33,"value":1330},"数据多久变一次？",{"type":27,"tag":1321,"props":1332,"children":1333},{},[1334],{"type":33,"value":1335},"决定 TTL 和失效方式",{"type":27,"tag":1294,"props":1337,"children":1338},{},[1339,1344,1349],{"type":27,"tag":1321,"props":1340,"children":1341},{},[1342],{"type":33,"value":1343},"一致性要求",{"type":27,"tag":1321,"props":1345,"children":1346},{},[1347],{"type":33,"value":1348},"能接受几秒旧数据吗？",{"type":27,"tag":1321,"props":1350,"children":1351},{},[1352],{"type":33,"value":1353},"决定能否走 CDN / 本地缓存",{"type":27,"tag":1294,"props":1355,"children":1356},{},[1357,1362,1367],{"type":27,"tag":1321,"props":1358,"children":1359},{},[1360],{"type":33,"value":1361},"数据体积",{"type":27,"tag":1321,"props":1363,"children":1364},{},[1365],{"type":33,"value":1366},"返回结果大不大？",{"type":27,"tag":1321,"props":1368,"children":1369},{},[1370],{"type":33,"value":1371},"决定适不适合边缘缓存",{"type":27,"tag":1294,"props":1373,"children":1374},{},[1375,1380,1385],{"type":27,"tag":1321,"props":1376,"children":1377},{},[1378],{"type":33,"value":1379},"回源成本",{"type":27,"tag":1321,"props":1381,"children":1382},{},[1383],{"type":33,"value":1384},"miss 时会压垮谁？",{"type":27,"tag":1321,"props":1386,"children":1387},{},[1388],{"type":33,"value":1389},"决定是否值得做更靠前的缓存",{"type":27,"tag":228,"props":1391,"children":1393},{"id":1392},"_31-一个实用的分类方法",[1394],{"type":33,"value":1395},"3.1 一个实用的分类方法",{"type":27,"tag":509,"props":1397,"children":1399},{"id":1398},"a-类几乎所有人看到都一样且变化少",[1400],{"type":33,"value":1401},"A 类：几乎所有人看到都一样，且变化少",{"type":27,"tag":35,"props":1403,"children":1404},{},[1405],{"type":33,"value":1406},"例如：",{"type":27,"tag":97,"props":1408,"children":1409},{},[1410,1415,1420],{"type":27,"tag":101,"props":1411,"children":1412},{},[1413],{"type":33,"value":1414},"logo、静态资源",{"type":27,"tag":101,"props":1416,"children":1417},{},[1418],{"type":33,"value":1419},"文章页正文",{"type":27,"tag":101,"props":1421,"children":1422},{},[1423],{"type":33,"value":1424},"营销活动介绍页",{"type":27,"tag":35,"props":1426,"children":1427},{},[1428,1430],{"type":33,"value":1429},"优先级：",{"type":27,"tag":86,"props":1431,"children":1432},{},[1433],{"type":33,"value":1434},"浏览器缓存 + CDN",{"type":27,"tag":509,"props":1436,"children":1438},{"id":1437},"b-类热点高变化有节奏允许秒级旧数据",[1439],{"type":33,"value":1440},"B 类：热点高、变化有节奏、允许秒级旧数据",{"type":27,"tag":35,"props":1442,"children":1443},{},[1444],{"type":33,"value":1406},{"type":27,"tag":97,"props":1446,"children":1447},{},[1448,1453,1458,1463],{"type":27,"tag":101,"props":1449,"children":1450},{},[1451],{"type":33,"value":1452},"首页推荐位",{"type":27,"tag":101,"props":1454,"children":1455},{},[1456],{"type":33,"value":1457},"榜单",{"type":27,"tag":101,"props":1459,"children":1460},{},[1461],{"type":33,"value":1462},"商品详情的公开部分",{"type":27,"tag":101,"props":1464,"children":1465},{},[1466],{"type":33,"value":1467},"热门搜索词",{"type":27,"tag":35,"props":1469,"children":1470},{},[1471,1472],{"type":33,"value":1429},{"type":27,"tag":86,"props":1473,"children":1474},{},[1475],{"type":33,"value":1476},"CDN / 本地缓存 / Redis 组合",{"type":27,"tag":509,"props":1478,"children":1480},{"id":1479},"c-类用户相关但短时间内重复访问高",[1481],{"type":33,"value":1482},"C 类：用户相关，但短时间内重复访问高",{"type":27,"tag":35,"props":1484,"children":1485},{},[1486],{"type":33,"value":1406},{"type":27,"tag":97,"props":1488,"children":1489},{},[1490,1495,1500,1505],{"type":27,"tag":101,"props":1491,"children":1492},{},[1493],{"type":33,"value":1494},"用户资料摘要",{"type":27,"tag":101,"props":1496,"children":1497},{},[1498],{"type":33,"value":1499},"权限集",{"type":27,"tag":101,"props":1501,"children":1502},{},[1503],{"type":33,"value":1504},"购物车摘要",{"type":27,"tag":101,"props":1506,"children":1507},{},[1508],{"type":33,"value":1509},"最近浏览记录",{"type":27,"tag":35,"props":1511,"children":1512},{},[1513,1514],{"type":33,"value":1429},{"type":27,"tag":86,"props":1515,"children":1516},{},[1517],{"type":33,"value":1518},"本地缓存 + Redis",{"type":27,"tag":509,"props":1520,"children":1522},{"id":1521},"d-类强一致强事务",[1523],{"type":33,"value":1524},"D 类：强一致、强事务",{"type":27,"tag":35,"props":1526,"children":1527},{},[1528],{"type":33,"value":1406},{"type":27,"tag":97,"props":1530,"children":1531},{},[1532,1537,1542,1547],{"type":27,"tag":101,"props":1533,"children":1534},{},[1535],{"type":33,"value":1536},"实时库存",{"type":27,"tag":101,"props":1538,"children":1539},{},[1540],{"type":33,"value":1541},"余额",{"type":27,"tag":101,"props":1543,"children":1544},{},[1545],{"type":33,"value":1546},"支付状态",{"type":27,"tag":101,"props":1548,"children":1549},{},[1550],{"type":33,"value":1551},"核销资格",{"type":27,"tag":35,"props":1553,"children":1554},{},[1555,1556],{"type":33,"value":1429},{"type":27,"tag":86,"props":1557,"children":1558},{},[1559],{"type":33,"value":1560},"谨慎缓存，甚至不缓存",{"type":27,"tag":35,"props":1562,"children":1563},{},[1564],{"type":33,"value":1565},"不是所有数据都值得缓存。缓存最怕的一种数据，就是“看起来读很多，实际上每次都必须绝对实时”。",{"type":27,"tag":178,"props":1567,"children":1568},{},[],{"type":27,"tag":182,"props":1570,"children":1572},{"id":1571},"四一个真实可落地的多层缓存架构",[1573],{"type":33,"value":1574},"四、一个真实可落地的多层缓存架构",{"type":27,"tag":35,"props":1576,"children":1577},{},[1578],{"type":33,"value":1579},"下面给一个电商系统里常见的商品详情页设计。",{"type":27,"tag":228,"props":1581,"children":1583},{"id":1582},"_41-目标拆分",[1584],{"type":33,"value":1585},"4.1 目标拆分",{"type":27,"tag":35,"props":1587,"children":1588},{},[1589],{"type":33,"value":1590},"商品详情页实际包含 4 类数据：",{"type":27,"tag":144,"props":1592,"children":1593},{},[1594,1599,1604,1609],{"type":27,"tag":101,"props":1595,"children":1596},{},[1597],{"type":33,"value":1598},"商品静态信息：标题、图片、参数",{"type":27,"tag":101,"props":1600,"children":1601},{},[1602],{"type":33,"value":1603},"营销信息：活动标签、文案、会场氛围",{"type":27,"tag":101,"props":1605,"children":1606},{},[1607],{"type":33,"value":1608},"个性化信息：会员价、优惠资格、推荐理由",{"type":27,"tag":101,"props":1610,"children":1611},{},[1612],{"type":33,"value":1613},"强实时信息：库存、限购、秒杀状态",{"type":27,"tag":35,"props":1615,"children":1616},{},[1617],{"type":33,"value":1618},"如果你把这 4 类数据都放在一个接口里，并要求“完全实时”，那缓存设计会非常难看。",{"type":27,"tag":35,"props":1620,"children":1621},{},[1622],{"type":33,"value":1623},"更合理的拆法是：",{"type":27,"tag":1286,"props":1625,"children":1626},{},[1627,1648],{"type":27,"tag":1290,"props":1628,"children":1629},{},[1630],{"type":27,"tag":1294,"props":1631,"children":1632},{},[1633,1638,1643],{"type":27,"tag":1298,"props":1634,"children":1635},{},[1636],{"type":33,"value":1637},"数据类型",{"type":27,"tag":1298,"props":1639,"children":1640},{},[1641],{"type":33,"value":1642},"缓存层",{"type":27,"tag":1298,"props":1644,"children":1645},{},[1646],{"type":33,"value":1647},"TTL / 策略",{"type":27,"tag":1314,"props":1649,"children":1650},{},[1651,1669,1687,1704],{"type":27,"tag":1294,"props":1652,"children":1653},{},[1654,1659,1664],{"type":27,"tag":1321,"props":1655,"children":1656},{},[1657],{"type":33,"value":1658},"静态信息",{"type":27,"tag":1321,"props":1660,"children":1661},{},[1662],{"type":33,"value":1663},"CDN + Redis",{"type":27,"tag":1321,"props":1665,"children":1666},{},[1667],{"type":33,"value":1668},"10 分钟 + 主动失效",{"type":27,"tag":1294,"props":1670,"children":1671},{},[1672,1677,1682],{"type":27,"tag":1321,"props":1673,"children":1674},{},[1675],{"type":33,"value":1676},"营销信息",{"type":27,"tag":1321,"props":1678,"children":1679},{},[1680],{"type":33,"value":1681},"CDN 短缓存",{"type":27,"tag":1321,"props":1683,"children":1684},{},[1685],{"type":33,"value":1686},"30-60 秒",{"type":27,"tag":1294,"props":1688,"children":1689},{},[1690,1695,1699],{"type":27,"tag":1321,"props":1691,"children":1692},{},[1693],{"type":33,"value":1694},"个性化信息",{"type":27,"tag":1321,"props":1696,"children":1697},{},[1698],{"type":33,"value":1518},{"type":27,"tag":1321,"props":1700,"children":1701},{},[1702],{"type":33,"value":1703},"10-30 秒",{"type":27,"tag":1294,"props":1705,"children":1706},{},[1707,1712,1717],{"type":27,"tag":1321,"props":1708,"children":1709},{},[1710],{"type":33,"value":1711},"强实时信息",{"type":27,"tag":1321,"props":1713,"children":1714},{},[1715],{"type":33,"value":1716},"直查或超短缓存",{"type":27,"tag":1321,"props":1718,"children":1719},{},[1720],{"type":33,"value":1721},"1-3 秒 / 甚至不缓存",{"type":27,"tag":228,"props":1723,"children":1725},{"id":1724},"_42-bff-聚合层示例",[1726],{"type":33,"value":1727},"4.2 BFF 聚合层示例",{"type":27,"tag":240,"props":1729,"children":1731},{"className":663,"code":1730,"language":665,"meta":7,"style":7},"type ProductDetail = {\n  productId: string\n  title: string\n  images: string[]\n  campaignLabel: string | null\n  memberPrice: number | null\n  inventory: number\n}\n\nexport async function getProductDetail(\n  productId: string,\n  userId?: string,\n): Promise\u003CProductDetail> {\n  const staticKey = `product:static:${productId}`\n  const userKey = userId ? `product:user:${productId}:${userId}` : null\n\n  const staticPart = await cacheAside(\n    staticKey,\n    10 * 60,\n    () => productService.getStaticPart(productId),\n  )\n\n  const campaignPart = await cacheAside(\n    `product:campaign:${productId}`,\n    60,\n    () => campaignService.getCampaignPart(productId),\n  )\n\n  const personalizedPart = userKey\n    ? await localFirstThenRedis(\n        userKey,\n        20,\n        () => pricingService.getUserPricing(productId, userId),\n      )\n    : { memberPrice: null }\n\n  const inventory = await inventoryService.getRealtimeInventory(productId)\n\n  return {\n    ...staticPart,\n    ...campaignPart,\n    ...personalizedPart,\n    inventory,\n  }\n}\n",[1732],{"type":27,"tag":246,"props":1733,"children":1734},{"__ignoreMap":7},[1735,1756,1773,1789,1810,1834,1858,1875,1882,1889,1917,1937,1958,1987,2020,2079,2086,2116,2124,2146,2174,2182,2189,2218,2239,2252,2278,2286,2294,2316,2338,2347,2360,2388,2397,2421,2429,2465,2473,2486,2500,2513,2526,2535,2543],{"type":27,"tag":250,"props":1736,"children":1737},{"class":252,"line":253},[1738,1743,1748,1752],{"type":27,"tag":250,"props":1739,"children":1740},{"style":675},[1741],{"type":33,"value":1742},"type",{"type":27,"tag":250,"props":1744,"children":1745},{"style":681},[1746],{"type":33,"value":1747}," ProductDetail",{"type":27,"tag":250,"props":1749,"children":1750},{"style":675},[1751],{"type":33,"value":719},{"type":27,"tag":250,"props":1753,"children":1754},{"style":687},[1755],{"type":33,"value":846},{"type":27,"tag":250,"props":1757,"children":1758},{"class":252,"line":262},[1759,1764,1768],{"type":27,"tag":250,"props":1760,"children":1761},{"style":711},[1762],{"type":33,"value":1763},"  productId",{"type":27,"tag":250,"props":1765,"children":1766},{"style":675},[1767],{"type":33,"value":754},{"type":27,"tag":250,"props":1769,"children":1770},{"style":736},[1771],{"type":33,"value":1772}," string\n",{"type":27,"tag":250,"props":1774,"children":1775},{"class":252,"line":271},[1776,1781,1785],{"type":27,"tag":250,"props":1777,"children":1778},{"style":711},[1779],{"type":33,"value":1780},"  title",{"type":27,"tag":250,"props":1782,"children":1783},{"style":675},[1784],{"type":33,"value":754},{"type":27,"tag":250,"props":1786,"children":1787},{"style":736},[1788],{"type":33,"value":1772},{"type":27,"tag":250,"props":1790,"children":1791},{"class":252,"line":20},[1792,1797,1801,1805],{"type":27,"tag":250,"props":1793,"children":1794},{"style":711},[1795],{"type":33,"value":1796},"  images",{"type":27,"tag":250,"props":1798,"children":1799},{"style":675},[1800],{"type":33,"value":754},{"type":27,"tag":250,"props":1802,"children":1803},{"style":736},[1804],{"type":33,"value":818},{"type":27,"tag":250,"props":1806,"children":1807},{"style":687},[1808],{"type":33,"value":1809},"[]\n",{"type":27,"tag":250,"props":1811,"children":1812},{"class":252,"line":287},[1813,1818,1822,1826,1830],{"type":27,"tag":250,"props":1814,"children":1815},{"style":711},[1816],{"type":33,"value":1817},"  campaignLabel",{"type":27,"tag":250,"props":1819,"children":1820},{"style":675},[1821],{"type":33,"value":754},{"type":27,"tag":250,"props":1823,"children":1824},{"style":736},[1825],{"type":33,"value":818},{"type":27,"tag":250,"props":1827,"children":1828},{"style":675},[1829],{"type":33,"value":836},{"type":27,"tag":250,"props":1831,"children":1832},{"style":736},[1833],{"type":33,"value":916},{"type":27,"tag":250,"props":1835,"children":1836},{"class":252,"line":296},[1837,1842,1846,1850,1854],{"type":27,"tag":250,"props":1838,"children":1839},{"style":711},[1840],{"type":33,"value":1841},"  memberPrice",{"type":27,"tag":250,"props":1843,"children":1844},{"style":675},[1845],{"type":33,"value":754},{"type":27,"tag":250,"props":1847,"children":1848},{"style":736},[1849],{"type":33,"value":778},{"type":27,"tag":250,"props":1851,"children":1852},{"style":675},[1853],{"type":33,"value":836},{"type":27,"tag":250,"props":1855,"children":1856},{"style":736},[1857],{"type":33,"value":916},{"type":27,"tag":250,"props":1859,"children":1860},{"class":252,"line":304},[1861,1866,1870],{"type":27,"tag":250,"props":1862,"children":1863},{"style":711},[1864],{"type":33,"value":1865},"  inventory",{"type":27,"tag":250,"props":1867,"children":1868},{"style":675},[1869],{"type":33,"value":754},{"type":27,"tag":250,"props":1871,"children":1872},{"style":736},[1873],{"type":33,"value":1874}," number\n",{"type":27,"tag":250,"props":1876,"children":1877},{"class":252,"line":313},[1878],{"type":27,"tag":250,"props":1879,"children":1880},{"style":687},[1881],{"type":33,"value":1183},{"type":27,"tag":250,"props":1883,"children":1884},{"class":252,"line":321},[1885],{"type":27,"tag":250,"props":1886,"children":1887},{"emptyLinePlaceholder":18},[1888],{"type":33,"value":791},{"type":27,"tag":250,"props":1890,"children":1891},{"class":252,"line":330},[1892,1897,1902,1907,1912],{"type":27,"tag":250,"props":1893,"children":1894},{"style":675},[1895],{"type":33,"value":1896},"export",{"type":27,"tag":250,"props":1898,"children":1899},{"style":675},[1900],{"type":33,"value":1901}," async",{"type":27,"tag":250,"props":1903,"children":1904},{"style":675},[1905],{"type":33,"value":1906}," function",{"type":27,"tag":250,"props":1908,"children":1909},{"style":681},[1910],{"type":33,"value":1911}," getProductDetail",{"type":27,"tag":250,"props":1913,"children":1914},{"style":687},[1915],{"type":33,"value":1916},"(\n",{"type":27,"tag":250,"props":1918,"children":1919},{"class":252,"line":338},[1920,1924,1928,1932],{"type":27,"tag":250,"props":1921,"children":1922},{"style":711},[1923],{"type":33,"value":1763},{"type":27,"tag":250,"props":1925,"children":1926},{"style":675},[1927],{"type":33,"value":754},{"type":27,"tag":250,"props":1929,"children":1930},{"style":736},[1931],{"type":33,"value":818},{"type":27,"tag":250,"props":1933,"children":1934},{"style":687},[1935],{"type":33,"value":1936},",\n",{"type":27,"tag":250,"props":1938,"children":1939},{"class":252,"line":999},[1940,1945,1950,1954],{"type":27,"tag":250,"props":1941,"children":1942},{"style":711},[1943],{"type":33,"value":1944},"  userId",{"type":27,"tag":250,"props":1946,"children":1947},{"style":675},[1948],{"type":33,"value":1949},"?:",{"type":27,"tag":250,"props":1951,"children":1952},{"style":736},[1953],{"type":33,"value":818},{"type":27,"tag":250,"props":1955,"children":1956},{"style":687},[1957],{"type":33,"value":1936},{"type":27,"tag":250,"props":1959,"children":1960},{"class":252,"line":1007},[1961,1965,1969,1974,1978,1983],{"type":27,"tag":250,"props":1962,"children":1963},{"style":687},[1964],{"type":33,"value":823},{"type":27,"tag":250,"props":1966,"children":1967},{"style":675},[1968],{"type":33,"value":754},{"type":27,"tag":250,"props":1970,"children":1971},{"style":681},[1972],{"type":33,"value":1973}," Promise",{"type":27,"tag":250,"props":1975,"children":1976},{"style":687},[1977],{"type":33,"value":690},{"type":27,"tag":250,"props":1979,"children":1980},{"style":681},[1981],{"type":33,"value":1982},"ProductDetail",{"type":27,"tag":250,"props":1984,"children":1985},{"style":687},[1986],{"type":33,"value":700},{"type":27,"tag":250,"props":1988,"children":1989},{"class":252,"line":1021},[1990,1995,2000,2004,2010,2015],{"type":27,"tag":250,"props":1991,"children":1992},{"style":675},[1993],{"type":33,"value":1994},"  const",{"type":27,"tag":250,"props":1996,"children":1997},{"style":736},[1998],{"type":33,"value":1999}," staticKey",{"type":27,"tag":250,"props":2001,"children":2002},{"style":675},[2003],{"type":33,"value":719},{"type":27,"tag":250,"props":2005,"children":2007},{"style":2006},"--shiki-default:#9ECBFF",[2008],{"type":33,"value":2009}," `product:static:${",{"type":27,"tag":250,"props":2011,"children":2012},{"style":687},[2013],{"type":33,"value":2014},"productId",{"type":27,"tag":250,"props":2016,"children":2017},{"style":2006},[2018],{"type":33,"value":2019},"}`\n",{"type":27,"tag":250,"props":2021,"children":2022},{"class":252,"line":1030},[2023,2027,2032,2036,2041,2046,2051,2055,2060,2065,2070,2075],{"type":27,"tag":250,"props":2024,"children":2025},{"style":675},[2026],{"type":33,"value":1994},{"type":27,"tag":250,"props":2028,"children":2029},{"style":736},[2030],{"type":33,"value":2031}," userKey",{"type":27,"tag":250,"props":2033,"children":2034},{"style":675},[2035],{"type":33,"value":719},{"type":27,"tag":250,"props":2037,"children":2038},{"style":687},[2039],{"type":33,"value":2040}," userId ",{"type":27,"tag":250,"props":2042,"children":2043},{"style":675},[2044],{"type":33,"value":2045},"?",{"type":27,"tag":250,"props":2047,"children":2048},{"style":2006},[2049],{"type":33,"value":2050}," `product:user:${",{"type":27,"tag":250,"props":2052,"children":2053},{"style":687},[2054],{"type":33,"value":2014},{"type":27,"tag":250,"props":2056,"children":2057},{"style":2006},[2058],{"type":33,"value":2059},"}:${",{"type":27,"tag":250,"props":2061,"children":2062},{"style":687},[2063],{"type":33,"value":2064},"userId",{"type":27,"tag":250,"props":2066,"children":2067},{"style":2006},[2068],{"type":33,"value":2069},"}`",{"type":27,"tag":250,"props":2071,"children":2072},{"style":675},[2073],{"type":33,"value":2074}," :",{"type":27,"tag":250,"props":2076,"children":2077},{"style":736},[2078],{"type":33,"value":916},{"type":27,"tag":250,"props":2080,"children":2081},{"class":252,"line":1038},[2082],{"type":27,"tag":250,"props":2083,"children":2084},{"emptyLinePlaceholder":18},[2085],{"type":33,"value":791},{"type":27,"tag":250,"props":2087,"children":2088},{"class":252,"line":1102},[2089,2093,2098,2102,2107,2112],{"type":27,"tag":250,"props":2090,"children":2091},{"style":675},[2092],{"type":33,"value":1994},{"type":27,"tag":250,"props":2094,"children":2095},{"style":736},[2096],{"type":33,"value":2097}," staticPart",{"type":27,"tag":250,"props":2099,"children":2100},{"style":675},[2101],{"type":33,"value":719},{"type":27,"tag":250,"props":2103,"children":2104},{"style":675},[2105],{"type":33,"value":2106}," await",{"type":27,"tag":250,"props":2108,"children":2109},{"style":681},[2110],{"type":33,"value":2111}," cacheAside",{"type":27,"tag":250,"props":2113,"children":2114},{"style":687},[2115],{"type":33,"value":1916},{"type":27,"tag":250,"props":2117,"children":2118},{"class":252,"line":21},[2119],{"type":27,"tag":250,"props":2120,"children":2121},{"style":687},[2122],{"type":33,"value":2123},"    staticKey,\n",{"type":27,"tag":250,"props":2125,"children":2126},{"class":252,"line":1133},[2127,2132,2137,2142],{"type":27,"tag":250,"props":2128,"children":2129},{"style":736},[2130],{"type":33,"value":2131},"    10",{"type":27,"tag":250,"props":2133,"children":2134},{"style":675},[2135],{"type":33,"value":2136}," *",{"type":27,"tag":250,"props":2138,"children":2139},{"style":736},[2140],{"type":33,"value":2141}," 60",{"type":27,"tag":250,"props":2143,"children":2144},{"style":687},[2145],{"type":33,"value":1936},{"type":27,"tag":250,"props":2147,"children":2148},{"class":252,"line":1160},[2149,2154,2159,2164,2169],{"type":27,"tag":250,"props":2150,"children":2151},{"style":687},[2152],{"type":33,"value":2153},"    () ",{"type":27,"tag":250,"props":2155,"children":2156},{"style":675},[2157],{"type":33,"value":2158},"=>",{"type":27,"tag":250,"props":2160,"children":2161},{"style":687},[2162],{"type":33,"value":2163}," productService.",{"type":27,"tag":250,"props":2165,"children":2166},{"style":681},[2167],{"type":33,"value":2168},"getStaticPart",{"type":27,"tag":250,"props":2170,"children":2171},{"style":687},[2172],{"type":33,"value":2173},"(productId),\n",{"type":27,"tag":250,"props":2175,"children":2176},{"class":252,"line":1169},[2177],{"type":27,"tag":250,"props":2178,"children":2179},{"style":687},[2180],{"type":33,"value":2181},"  )\n",{"type":27,"tag":250,"props":2183,"children":2184},{"class":252,"line":1177},[2185],{"type":27,"tag":250,"props":2186,"children":2187},{"emptyLinePlaceholder":18},[2188],{"type":33,"value":791},{"type":27,"tag":250,"props":2190,"children":2192},{"class":252,"line":2191},23,[2193,2197,2202,2206,2210,2214],{"type":27,"tag":250,"props":2194,"children":2195},{"style":675},[2196],{"type":33,"value":1994},{"type":27,"tag":250,"props":2198,"children":2199},{"style":736},[2200],{"type":33,"value":2201}," campaignPart",{"type":27,"tag":250,"props":2203,"children":2204},{"style":675},[2205],{"type":33,"value":719},{"type":27,"tag":250,"props":2207,"children":2208},{"style":675},[2209],{"type":33,"value":2106},{"type":27,"tag":250,"props":2211,"children":2212},{"style":681},[2213],{"type":33,"value":2111},{"type":27,"tag":250,"props":2215,"children":2216},{"style":687},[2217],{"type":33,"value":1916},{"type":27,"tag":250,"props":2219,"children":2221},{"class":252,"line":2220},24,[2222,2227,2231,2235],{"type":27,"tag":250,"props":2223,"children":2224},{"style":2006},[2225],{"type":33,"value":2226},"    `product:campaign:${",{"type":27,"tag":250,"props":2228,"children":2229},{"style":687},[2230],{"type":33,"value":2014},{"type":27,"tag":250,"props":2232,"children":2233},{"style":2006},[2234],{"type":33,"value":2069},{"type":27,"tag":250,"props":2236,"children":2237},{"style":687},[2238],{"type":33,"value":1936},{"type":27,"tag":250,"props":2240,"children":2242},{"class":252,"line":2241},25,[2243,2248],{"type":27,"tag":250,"props":2244,"children":2245},{"style":736},[2246],{"type":33,"value":2247},"    60",{"type":27,"tag":250,"props":2249,"children":2250},{"style":687},[2251],{"type":33,"value":1936},{"type":27,"tag":250,"props":2253,"children":2255},{"class":252,"line":2254},26,[2256,2260,2264,2269,2274],{"type":27,"tag":250,"props":2257,"children":2258},{"style":687},[2259],{"type":33,"value":2153},{"type":27,"tag":250,"props":2261,"children":2262},{"style":675},[2263],{"type":33,"value":2158},{"type":27,"tag":250,"props":2265,"children":2266},{"style":687},[2267],{"type":33,"value":2268}," campaignService.",{"type":27,"tag":250,"props":2270,"children":2271},{"style":681},[2272],{"type":33,"value":2273},"getCampaignPart",{"type":27,"tag":250,"props":2275,"children":2276},{"style":687},[2277],{"type":33,"value":2173},{"type":27,"tag":250,"props":2279,"children":2281},{"class":252,"line":2280},27,[2282],{"type":27,"tag":250,"props":2283,"children":2284},{"style":687},[2285],{"type":33,"value":2181},{"type":27,"tag":250,"props":2287,"children":2289},{"class":252,"line":2288},28,[2290],{"type":27,"tag":250,"props":2291,"children":2292},{"emptyLinePlaceholder":18},[2293],{"type":33,"value":791},{"type":27,"tag":250,"props":2295,"children":2297},{"class":252,"line":2296},29,[2298,2302,2307,2311],{"type":27,"tag":250,"props":2299,"children":2300},{"style":675},[2301],{"type":33,"value":1994},{"type":27,"tag":250,"props":2303,"children":2304},{"style":736},[2305],{"type":33,"value":2306}," personalizedPart",{"type":27,"tag":250,"props":2308,"children":2309},{"style":675},[2310],{"type":33,"value":719},{"type":27,"tag":250,"props":2312,"children":2313},{"style":687},[2314],{"type":33,"value":2315}," userKey\n",{"type":27,"tag":250,"props":2317,"children":2319},{"class":252,"line":2318},30,[2320,2325,2329,2334],{"type":27,"tag":250,"props":2321,"children":2322},{"style":675},[2323],{"type":33,"value":2324},"    ?",{"type":27,"tag":250,"props":2326,"children":2327},{"style":675},[2328],{"type":33,"value":2106},{"type":27,"tag":250,"props":2330,"children":2331},{"style":681},[2332],{"type":33,"value":2333}," localFirstThenRedis",{"type":27,"tag":250,"props":2335,"children":2336},{"style":687},[2337],{"type":33,"value":1916},{"type":27,"tag":250,"props":2339,"children":2341},{"class":252,"line":2340},31,[2342],{"type":27,"tag":250,"props":2343,"children":2344},{"style":687},[2345],{"type":33,"value":2346},"        userKey,\n",{"type":27,"tag":250,"props":2348,"children":2350},{"class":252,"line":2349},32,[2351,2356],{"type":27,"tag":250,"props":2352,"children":2353},{"style":736},[2354],{"type":33,"value":2355},"        20",{"type":27,"tag":250,"props":2357,"children":2358},{"style":687},[2359],{"type":33,"value":1936},{"type":27,"tag":250,"props":2361,"children":2363},{"class":252,"line":2362},33,[2364,2369,2373,2378,2383],{"type":27,"tag":250,"props":2365,"children":2366},{"style":687},[2367],{"type":33,"value":2368},"        () ",{"type":27,"tag":250,"props":2370,"children":2371},{"style":675},[2372],{"type":33,"value":2158},{"type":27,"tag":250,"props":2374,"children":2375},{"style":687},[2376],{"type":33,"value":2377}," pricingService.",{"type":27,"tag":250,"props":2379,"children":2380},{"style":681},[2381],{"type":33,"value":2382},"getUserPricing",{"type":27,"tag":250,"props":2384,"children":2385},{"style":687},[2386],{"type":33,"value":2387},"(productId, userId),\n",{"type":27,"tag":250,"props":2389,"children":2391},{"class":252,"line":2390},34,[2392],{"type":27,"tag":250,"props":2393,"children":2394},{"style":687},[2395],{"type":33,"value":2396},"      )\n",{"type":27,"tag":250,"props":2398,"children":2400},{"class":252,"line":2399},35,[2401,2406,2411,2416],{"type":27,"tag":250,"props":2402,"children":2403},{"style":675},[2404],{"type":33,"value":2405},"    :",{"type":27,"tag":250,"props":2407,"children":2408},{"style":687},[2409],{"type":33,"value":2410}," { memberPrice: ",{"type":27,"tag":250,"props":2412,"children":2413},{"style":736},[2414],{"type":33,"value":2415},"null",{"type":27,"tag":250,"props":2417,"children":2418},{"style":687},[2419],{"type":33,"value":2420}," }\n",{"type":27,"tag":250,"props":2422,"children":2424},{"class":252,"line":2423},36,[2425],{"type":27,"tag":250,"props":2426,"children":2427},{"emptyLinePlaceholder":18},[2428],{"type":33,"value":791},{"type":27,"tag":250,"props":2430,"children":2432},{"class":252,"line":2431},37,[2433,2437,2442,2446,2450,2455,2460],{"type":27,"tag":250,"props":2434,"children":2435},{"style":675},[2436],{"type":33,"value":1994},{"type":27,"tag":250,"props":2438,"children":2439},{"style":736},[2440],{"type":33,"value":2441}," inventory",{"type":27,"tag":250,"props":2443,"children":2444},{"style":675},[2445],{"type":33,"value":719},{"type":27,"tag":250,"props":2447,"children":2448},{"style":675},[2449],{"type":33,"value":2106},{"type":27,"tag":250,"props":2451,"children":2452},{"style":687},[2453],{"type":33,"value":2454}," inventoryService.",{"type":27,"tag":250,"props":2456,"children":2457},{"style":681},[2458],{"type":33,"value":2459},"getRealtimeInventory",{"type":27,"tag":250,"props":2461,"children":2462},{"style":687},[2463],{"type":33,"value":2464},"(productId)\n",{"type":27,"tag":250,"props":2466,"children":2468},{"class":252,"line":2467},38,[2469],{"type":27,"tag":250,"props":2470,"children":2471},{"emptyLinePlaceholder":18},[2472],{"type":33,"value":791},{"type":27,"tag":250,"props":2474,"children":2476},{"class":252,"line":2475},39,[2477,2482],{"type":27,"tag":250,"props":2478,"children":2479},{"style":675},[2480],{"type":33,"value":2481},"  return",{"type":27,"tag":250,"props":2483,"children":2484},{"style":687},[2485],{"type":33,"value":846},{"type":27,"tag":250,"props":2487,"children":2489},{"class":252,"line":2488},40,[2490,2495],{"type":27,"tag":250,"props":2491,"children":2492},{"style":675},[2493],{"type":33,"value":2494},"    ...",{"type":27,"tag":250,"props":2496,"children":2497},{"style":687},[2498],{"type":33,"value":2499},"staticPart,\n",{"type":27,"tag":250,"props":2501,"children":2503},{"class":252,"line":2502},41,[2504,2508],{"type":27,"tag":250,"props":2505,"children":2506},{"style":675},[2507],{"type":33,"value":2494},{"type":27,"tag":250,"props":2509,"children":2510},{"style":687},[2511],{"type":33,"value":2512},"campaignPart,\n",{"type":27,"tag":250,"props":2514,"children":2516},{"class":252,"line":2515},42,[2517,2521],{"type":27,"tag":250,"props":2518,"children":2519},{"style":675},[2520],{"type":33,"value":2494},{"type":27,"tag":250,"props":2522,"children":2523},{"style":687},[2524],{"type":33,"value":2525},"personalizedPart,\n",{"type":27,"tag":250,"props":2527,"children":2529},{"class":252,"line":2528},43,[2530],{"type":27,"tag":250,"props":2531,"children":2532},{"style":687},[2533],{"type":33,"value":2534},"    inventory,\n",{"type":27,"tag":250,"props":2536,"children":2538},{"class":252,"line":2537},44,[2539],{"type":27,"tag":250,"props":2540,"children":2541},{"style":687},[2542],{"type":33,"value":1027},{"type":27,"tag":250,"props":2544,"children":2546},{"class":252,"line":2545},45,[2547],{"type":27,"tag":250,"props":2548,"children":2549},{"style":687},[2550],{"type":33,"value":1183},{"type":27,"tag":35,"props":2552,"children":2553},{},[2554],{"type":33,"value":2555},"这段设计的核心不在代码技巧，而在边界：",{"type":27,"tag":97,"props":2557,"children":2558},{},[2559,2564,2569,2574],{"type":27,"tag":101,"props":2560,"children":2561},{},[2562],{"type":33,"value":2563},"稳定数据尽量缓存久一点",{"type":27,"tag":101,"props":2565,"children":2566},{},[2567],{"type":33,"value":2568},"弱实时数据短缓存",{"type":27,"tag":101,"props":2570,"children":2571},{},[2572],{"type":33,"value":2573},"个性化数据只在靠后的层缓存",{"type":27,"tag":101,"props":2575,"children":2576},{},[2577],{"type":33,"value":2578},"强实时数据不要为了“统一”而硬塞进缓存",{"type":27,"tag":178,"props":2580,"children":2581},{},[],{"type":27,"tag":182,"props":2583,"children":2585},{"id":2584},"五缓存读写策略别只会-cache-aside",[2586,2588],{"type":33,"value":2587},"五、缓存读写策略，别只会 ",{"type":27,"tag":246,"props":2589,"children":2591},{"className":2590},[],[2592],{"type":33,"value":2593},"cache aside",{"type":27,"tag":35,"props":2595,"children":2596},{},[2597,2599,2605],{"type":33,"value":2598},"多数团队最熟悉的，是 ",{"type":27,"tag":246,"props":2600,"children":2602},{"className":2601},[],[2603],{"type":33,"value":2604},"Cache Aside",{"type":33,"value":2606},"：",{"type":27,"tag":144,"props":2608,"children":2609},{},[2610,2615,2620],{"type":27,"tag":101,"props":2611,"children":2612},{},[2613],{"type":33,"value":2614},"先查缓存",{"type":27,"tag":101,"props":2616,"children":2617},{},[2618],{"type":33,"value":2619},"miss 了查数据库",{"type":27,"tag":101,"props":2621,"children":2622},{},[2623],{"type":33,"value":2624},"再回写缓存",{"type":27,"tag":35,"props":2626,"children":2627},{},[2628],{"type":33,"value":2629},"这是默认策略，但不是唯一策略。",{"type":27,"tag":228,"props":2631,"children":2633},{"id":2632},"_51-cache-aside最通用但要处理并发-miss",[2634],{"type":33,"value":2635},"5.1 Cache Aside：最通用，但要处理并发 miss",{"type":27,"tag":240,"props":2637,"children":2639},{"className":663,"code":2638,"language":665,"meta":7,"style":7},"export async function cacheAside\u003CT>(\n  key: string,\n  ttlSeconds: number,\n  loader: () => Promise\u003CT>,\n): Promise\u003CT> {\n  const cached = await redis.get(key)\n  if (cached) return JSON.parse(cached) as T\n\n  const value = await loader()\n  await redis.set(key, JSON.stringify(value), 'EX', ttlSeconds)\n  return value\n}\n",[2640],{"type":27,"tag":246,"props":2641,"children":2642},{"__ignoreMap":7},[2643,2676,2696,2716,2754,2781,2814,2861,2868,2898,2948,2960],{"type":27,"tag":250,"props":2644,"children":2645},{"class":252,"line":253},[2646,2650,2654,2658,2662,2666,2671],{"type":27,"tag":250,"props":2647,"children":2648},{"style":675},[2649],{"type":33,"value":1896},{"type":27,"tag":250,"props":2651,"children":2652},{"style":675},[2653],{"type":33,"value":1901},{"type":27,"tag":250,"props":2655,"children":2656},{"style":675},[2657],{"type":33,"value":1906},{"type":27,"tag":250,"props":2659,"children":2660},{"style":681},[2661],{"type":33,"value":2111},{"type":27,"tag":250,"props":2663,"children":2664},{"style":687},[2665],{"type":33,"value":690},{"type":27,"tag":250,"props":2667,"children":2668},{"style":681},[2669],{"type":33,"value":2670},"T",{"type":27,"tag":250,"props":2672,"children":2673},{"style":687},[2674],{"type":33,"value":2675},">(\n",{"type":27,"tag":250,"props":2677,"children":2678},{"class":252,"line":262},[2679,2684,2688,2692],{"type":27,"tag":250,"props":2680,"children":2681},{"style":711},[2682],{"type":33,"value":2683},"  key",{"type":27,"tag":250,"props":2685,"children":2686},{"style":675},[2687],{"type":33,"value":754},{"type":27,"tag":250,"props":2689,"children":2690},{"style":736},[2691],{"type":33,"value":818},{"type":27,"tag":250,"props":2693,"children":2694},{"style":687},[2695],{"type":33,"value":1936},{"type":27,"tag":250,"props":2697,"children":2698},{"class":252,"line":271},[2699,2704,2708,2712],{"type":27,"tag":250,"props":2700,"children":2701},{"style":711},[2702],{"type":33,"value":2703},"  ttlSeconds",{"type":27,"tag":250,"props":2705,"children":2706},{"style":675},[2707],{"type":33,"value":754},{"type":27,"tag":250,"props":2709,"children":2710},{"style":736},[2711],{"type":33,"value":778},{"type":27,"tag":250,"props":2713,"children":2714},{"style":687},[2715],{"type":33,"value":1936},{"type":27,"tag":250,"props":2717,"children":2718},{"class":252,"line":20},[2719,2724,2728,2733,2737,2741,2745,2749],{"type":27,"tag":250,"props":2720,"children":2721},{"style":681},[2722],{"type":33,"value":2723},"  loader",{"type":27,"tag":250,"props":2725,"children":2726},{"style":675},[2727],{"type":33,"value":754},{"type":27,"tag":250,"props":2729,"children":2730},{"style":687},[2731],{"type":33,"value":2732}," () ",{"type":27,"tag":250,"props":2734,"children":2735},{"style":675},[2736],{"type":33,"value":2158},{"type":27,"tag":250,"props":2738,"children":2739},{"style":681},[2740],{"type":33,"value":1973},{"type":27,"tag":250,"props":2742,"children":2743},{"style":687},[2744],{"type":33,"value":690},{"type":27,"tag":250,"props":2746,"children":2747},{"style":681},[2748],{"type":33,"value":2670},{"type":27,"tag":250,"props":2750,"children":2751},{"style":687},[2752],{"type":33,"value":2753},">,\n",{"type":27,"tag":250,"props":2755,"children":2756},{"class":252,"line":287},[2757,2761,2765,2769,2773,2777],{"type":27,"tag":250,"props":2758,"children":2759},{"style":687},[2760],{"type":33,"value":823},{"type":27,"tag":250,"props":2762,"children":2763},{"style":675},[2764],{"type":33,"value":754},{"type":27,"tag":250,"props":2766,"children":2767},{"style":681},[2768],{"type":33,"value":1973},{"type":27,"tag":250,"props":2770,"children":2771},{"style":687},[2772],{"type":33,"value":690},{"type":27,"tag":250,"props":2774,"children":2775},{"style":681},[2776],{"type":33,"value":2670},{"type":27,"tag":250,"props":2778,"children":2779},{"style":687},[2780],{"type":33,"value":700},{"type":27,"tag":250,"props":2782,"children":2783},{"class":252,"line":296},[2784,2788,2793,2797,2801,2806,2810],{"type":27,"tag":250,"props":2785,"children":2786},{"style":675},[2787],{"type":33,"value":1994},{"type":27,"tag":250,"props":2789,"children":2790},{"style":736},[2791],{"type":33,"value":2792}," cached",{"type":27,"tag":250,"props":2794,"children":2795},{"style":675},[2796],{"type":33,"value":719},{"type":27,"tag":250,"props":2798,"children":2799},{"style":675},[2800],{"type":33,"value":2106},{"type":27,"tag":250,"props":2802,"children":2803},{"style":687},[2804],{"type":33,"value":2805}," redis.",{"type":27,"tag":250,"props":2807,"children":2808},{"style":681},[2809],{"type":33,"value":878},{"type":27,"tag":250,"props":2811,"children":2812},{"style":687},[2813],{"type":33,"value":883},{"type":27,"tag":250,"props":2815,"children":2816},{"class":252,"line":304},[2817,2822,2827,2831,2836,2841,2846,2851,2856],{"type":27,"tag":250,"props":2818,"children":2819},{"style":675},[2820],{"type":33,"value":2821},"  if",{"type":27,"tag":250,"props":2823,"children":2824},{"style":687},[2825],{"type":33,"value":2826}," (cached) ",{"type":27,"tag":250,"props":2828,"children":2829},{"style":675},[2830],{"type":33,"value":911},{"type":27,"tag":250,"props":2832,"children":2833},{"style":736},[2834],{"type":33,"value":2835}," JSON",{"type":27,"tag":250,"props":2837,"children":2838},{"style":687},[2839],{"type":33,"value":2840},".",{"type":27,"tag":250,"props":2842,"children":2843},{"style":681},[2844],{"type":33,"value":2845},"parse",{"type":27,"tag":250,"props":2847,"children":2848},{"style":687},[2849],{"type":33,"value":2850},"(cached) ",{"type":27,"tag":250,"props":2852,"children":2853},{"style":675},[2854],{"type":33,"value":2855},"as",{"type":27,"tag":250,"props":2857,"children":2858},{"style":681},[2859],{"type":33,"value":2860}," T\n",{"type":27,"tag":250,"props":2862,"children":2863},{"class":252,"line":313},[2864],{"type":27,"tag":250,"props":2865,"children":2866},{"emptyLinePlaceholder":18},[2867],{"type":33,"value":791},{"type":27,"tag":250,"props":2869,"children":2870},{"class":252,"line":321},[2871,2875,2880,2884,2888,2893],{"type":27,"tag":250,"props":2872,"children":2873},{"style":675},[2874],{"type":33,"value":1994},{"type":27,"tag":250,"props":2876,"children":2877},{"style":736},[2878],{"type":33,"value":2879}," value",{"type":27,"tag":250,"props":2881,"children":2882},{"style":675},[2883],{"type":33,"value":719},{"type":27,"tag":250,"props":2885,"children":2886},{"style":675},[2887],{"type":33,"value":2106},{"type":27,"tag":250,"props":2889,"children":2890},{"style":681},[2891],{"type":33,"value":2892}," loader",{"type":27,"tag":250,"props":2894,"children":2895},{"style":687},[2896],{"type":33,"value":2897},"()\n",{"type":27,"tag":250,"props":2899,"children":2900},{"class":252,"line":330},[2901,2906,2910,2914,2919,2924,2928,2933,2938,2943],{"type":27,"tag":250,"props":2902,"children":2903},{"style":675},[2904],{"type":33,"value":2905},"  await",{"type":27,"tag":250,"props":2907,"children":2908},{"style":687},[2909],{"type":33,"value":2805},{"type":27,"tag":250,"props":2911,"children":2912},{"style":681},[2913],{"type":33,"value":1117},{"type":27,"tag":250,"props":2915,"children":2916},{"style":687},[2917],{"type":33,"value":2918},"(key, ",{"type":27,"tag":250,"props":2920,"children":2921},{"style":736},[2922],{"type":33,"value":2923},"JSON",{"type":27,"tag":250,"props":2925,"children":2926},{"style":687},[2927],{"type":33,"value":2840},{"type":27,"tag":250,"props":2929,"children":2930},{"style":681},[2931],{"type":33,"value":2932},"stringify",{"type":27,"tag":250,"props":2934,"children":2935},{"style":687},[2936],{"type":33,"value":2937},"(value), ",{"type":27,"tag":250,"props":2939,"children":2940},{"style":2006},[2941],{"type":33,"value":2942},"'EX'",{"type":27,"tag":250,"props":2944,"children":2945},{"style":687},[2946],{"type":33,"value":2947},", ttlSeconds)\n",{"type":27,"tag":250,"props":2949,"children":2950},{"class":252,"line":338},[2951,2955],{"type":27,"tag":250,"props":2952,"children":2953},{"style":675},[2954],{"type":33,"value":2481},{"type":27,"tag":250,"props":2956,"children":2957},{"style":687},[2958],{"type":33,"value":2959}," value\n",{"type":27,"tag":250,"props":2961,"children":2962},{"class":252,"line":999},[2963],{"type":27,"tag":250,"props":2964,"children":2965},{"style":687},[2966],{"type":33,"value":1183},{"type":27,"tag":35,"props":2968,"children":2969},{},[2970],{"type":33,"value":2971},"简单、直观，但有两个常见坑：",{"type":27,"tag":97,"props":2973,"children":2974},{},[2975,2980],{"type":27,"tag":101,"props":2976,"children":2977},{},[2978],{"type":33,"value":2979},"并发 miss 时会一起打数据库",{"type":27,"tag":101,"props":2981,"children":2982},{},[2983],{"type":33,"value":2984},"数据更新后可能短时间读到旧值",{"type":27,"tag":228,"props":2986,"children":2988},{"id":2987},"_52-write-through适合对一致性和可控性要求更高的场景",[2989],{"type":33,"value":2990},"5.2 Write Through：适合对一致性和可控性要求更高的场景",{"type":27,"tag":35,"props":2992,"children":2993},{},[2994],{"type":33,"value":2995},"写请求先更新缓存，再由缓存系统写后端，或者应用统一写缓存和主存。",{"type":27,"tag":35,"props":2997,"children":2998},{},[2999],{"type":33,"value":3000},"优点：",{"type":27,"tag":97,"props":3002,"children":3003},{},[3004,3009],{"type":27,"tag":101,"props":3005,"children":3006},{},[3007],{"type":33,"value":3008},"读路径更稳定",{"type":27,"tag":101,"props":3010,"children":3011},{},[3012],{"type":33,"value":3013},"热数据更容易持续命中",{"type":27,"tag":35,"props":3015,"children":3016},{},[3017],{"type":33,"value":3018},"缺点：",{"type":27,"tag":97,"props":3020,"children":3021},{},[3022,3027],{"type":27,"tag":101,"props":3023,"children":3024},{},[3025],{"type":33,"value":3026},"写链路更复杂",{"type":27,"tag":101,"props":3028,"children":3029},{},[3030],{"type":33,"value":3031},"一旦缓存层抖动，会影响写入可用性",{"type":27,"tag":228,"props":3033,"children":3035},{"id":3034},"_53-write-back-write-behind吞吐高但适用面窄",[3036],{"type":33,"value":3037},"5.3 Write Back / Write Behind：吞吐高，但适用面窄",{"type":27,"tag":35,"props":3039,"children":3040},{},[3041],{"type":33,"value":3042},"先写缓存，异步刷到数据库。",{"type":27,"tag":35,"props":3044,"children":3045},{},[3046],{"type":33,"value":3047},"适用于：",{"type":27,"tag":97,"props":3049,"children":3050},{},[3051,3056,3061],{"type":27,"tag":101,"props":3052,"children":3053},{},[3054],{"type":33,"value":3055},"日志聚合",{"type":27,"tag":101,"props":3057,"children":3058},{},[3059],{"type":33,"value":3060},"计数器",{"type":27,"tag":101,"props":3062,"children":3063},{},[3064],{"type":33,"value":3065},"对瞬时一致性要求没那么高的场景",{"type":27,"tag":35,"props":3067,"children":3068},{},[3069],{"type":33,"value":3070},"不适用于：",{"type":27,"tag":97,"props":3072,"children":3073},{},[3074],{"type":27,"tag":101,"props":3075,"children":3076},{},[3077],{"type":33,"value":3078},"订单、支付、库存主链路",{"type":27,"tag":228,"props":3080,"children":3082},{"id":3081},"_54-refresh-ahead适合热点且高命中数据",[3083],{"type":33,"value":3084},"5.4 Refresh Ahead：适合热点且高命中数据",{"type":27,"tag":35,"props":3086,"children":3087},{},[3088],{"type":33,"value":3089},"在缓存快过期前，后台主动刷新，避免用户请求触发 miss。",{"type":27,"tag":35,"props":3091,"children":3092},{},[3093],{"type":33,"value":3047},{"type":27,"tag":97,"props":3095,"children":3096},{},[3097,3102,3107],{"type":27,"tag":101,"props":3098,"children":3099},{},[3100],{"type":33,"value":3101},"热门榜单",{"type":27,"tag":101,"props":3103,"children":3104},{},[3105],{"type":33,"value":3106},"大促会场配置",{"type":27,"tag":101,"props":3108,"children":3109},{},[3110],{"type":33,"value":3111},"首页推荐块",{"type":27,"tag":178,"props":3113,"children":3114},{},[],{"type":27,"tag":182,"props":3116,"children":3118},{"id":3117},"六缓存最怕的四种事故",[3119],{"type":33,"value":3120},"六、缓存最怕的四种事故",{"type":27,"tag":228,"props":3122,"children":3124},{"id":3123},"_61-缓存穿透请求的数据根本不存在",[3125],{"type":33,"value":3126},"6.1 缓存穿透：请求的数据根本不存在",{"type":27,"tag":35,"props":3128,"children":3129},{},[3130],{"type":33,"value":3131},"典型场景：有人不断请求不存在的商品 ID。",{"type":27,"tag":35,"props":3133,"children":3134},{},[3135],{"type":33,"value":3136},"如果每次 miss 都打到数据库，缓存形同虚设。",{"type":27,"tag":509,"props":3138,"children":3140},{"id":3139},"解决办法",[3141],{"type":33,"value":3139},{"type":27,"tag":97,"props":3143,"children":3144},{},[3145,3150,3155],{"type":27,"tag":101,"props":3146,"children":3147},{},[3148],{"type":33,"value":3149},"对空结果也做短 TTL 缓存",{"type":27,"tag":101,"props":3151,"children":3152},{},[3153],{"type":33,"value":3154},"对非法参数先做布隆过滤或规则拦截",{"type":27,"tag":101,"props":3156,"children":3157},{},[3158],{"type":33,"value":3159},"对异常高频的 miss 做限流",{"type":27,"tag":240,"props":3161,"children":3163},{"className":663,"code":3162,"language":665,"meta":7,"style":7},"async function getProductOrNull(productId: string) {\n  const key = `product:${productId}`\n  const cached = await redis.get(key)\n  if (cached) {\n    return cached === '__NULL__' ? null : JSON.parse(cached)\n  }\n\n  const product = await productRepo.findById(productId)\n  if (!product) {\n    await redis.set(key, '__NULL__', 'EX', 60)\n    return null\n  }\n\n  await redis.set(key, JSON.stringify(product), 'EX', 600)\n  return product\n}\n",[3164],{"type":27,"tag":246,"props":3165,"children":3166},{"__ignoreMap":7},[3167,3204,3233,3264,3276,3328,3335,3342,3376,3396,3443,3454,3461,3468,3521,3533],{"type":27,"tag":250,"props":3168,"children":3169},{"class":252,"line":253},[3170,3175,3179,3184,3188,3192,3196,3200],{"type":27,"tag":250,"props":3171,"children":3172},{"style":675},[3173],{"type":33,"value":3174},"async",{"type":27,"tag":250,"props":3176,"children":3177},{"style":675},[3178],{"type":33,"value":1906},{"type":27,"tag":250,"props":3180,"children":3181},{"style":681},[3182],{"type":33,"value":3183}," getProductOrNull",{"type":27,"tag":250,"props":3185,"children":3186},{"style":687},[3187],{"type":33,"value":804},{"type":27,"tag":250,"props":3189,"children":3190},{"style":711},[3191],{"type":33,"value":2014},{"type":27,"tag":250,"props":3193,"children":3194},{"style":675},[3195],{"type":33,"value":754},{"type":27,"tag":250,"props":3197,"children":3198},{"style":736},[3199],{"type":33,"value":818},{"type":27,"tag":250,"props":3201,"children":3202},{"style":687},[3203],{"type":33,"value":1099},{"type":27,"tag":250,"props":3205,"children":3206},{"class":252,"line":262},[3207,3211,3216,3220,3225,3229],{"type":27,"tag":250,"props":3208,"children":3209},{"style":675},[3210],{"type":33,"value":1994},{"type":27,"tag":250,"props":3212,"children":3213},{"style":736},[3214],{"type":33,"value":3215}," key",{"type":27,"tag":250,"props":3217,"children":3218},{"style":675},[3219],{"type":33,"value":719},{"type":27,"tag":250,"props":3221,"children":3222},{"style":2006},[3223],{"type":33,"value":3224}," `product:${",{"type":27,"tag":250,"props":3226,"children":3227},{"style":687},[3228],{"type":33,"value":2014},{"type":27,"tag":250,"props":3230,"children":3231},{"style":2006},[3232],{"type":33,"value":2019},{"type":27,"tag":250,"props":3234,"children":3235},{"class":252,"line":271},[3236,3240,3244,3248,3252,3256,3260],{"type":27,"tag":250,"props":3237,"children":3238},{"style":675},[3239],{"type":33,"value":1994},{"type":27,"tag":250,"props":3241,"children":3242},{"style":736},[3243],{"type":33,"value":2792},{"type":27,"tag":250,"props":3245,"children":3246},{"style":675},[3247],{"type":33,"value":719},{"type":27,"tag":250,"props":3249,"children":3250},{"style":675},[3251],{"type":33,"value":2106},{"type":27,"tag":250,"props":3253,"children":3254},{"style":687},[3255],{"type":33,"value":2805},{"type":27,"tag":250,"props":3257,"children":3258},{"style":681},[3259],{"type":33,"value":878},{"type":27,"tag":250,"props":3261,"children":3262},{"style":687},[3263],{"type":33,"value":883},{"type":27,"tag":250,"props":3265,"children":3266},{"class":252,"line":20},[3267,3271],{"type":27,"tag":250,"props":3268,"children":3269},{"style":675},[3270],{"type":33,"value":2821},{"type":27,"tag":250,"props":3272,"children":3273},{"style":687},[3274],{"type":33,"value":3275}," (cached) {\n",{"type":27,"tag":250,"props":3277,"children":3278},{"class":252,"line":287},[3279,3283,3288,3293,3298,3303,3307,3311,3315,3319,3323],{"type":27,"tag":250,"props":3280,"children":3281},{"style":675},[3282],{"type":33,"value":1013},{"type":27,"tag":250,"props":3284,"children":3285},{"style":687},[3286],{"type":33,"value":3287}," cached ",{"type":27,"tag":250,"props":3289,"children":3290},{"style":675},[3291],{"type":33,"value":3292},"===",{"type":27,"tag":250,"props":3294,"children":3295},{"style":2006},[3296],{"type":33,"value":3297}," '__NULL__'",{"type":27,"tag":250,"props":3299,"children":3300},{"style":675},[3301],{"type":33,"value":3302}," ?",{"type":27,"tag":250,"props":3304,"children":3305},{"style":736},[3306],{"type":33,"value":841},{"type":27,"tag":250,"props":3308,"children":3309},{"style":675},[3310],{"type":33,"value":2074},{"type":27,"tag":250,"props":3312,"children":3313},{"style":736},[3314],{"type":33,"value":2835},{"type":27,"tag":250,"props":3316,"children":3317},{"style":687},[3318],{"type":33,"value":2840},{"type":27,"tag":250,"props":3320,"children":3321},{"style":681},[3322],{"type":33,"value":2845},{"type":27,"tag":250,"props":3324,"children":3325},{"style":687},[3326],{"type":33,"value":3327},"(cached)\n",{"type":27,"tag":250,"props":3329,"children":3330},{"class":252,"line":296},[3331],{"type":27,"tag":250,"props":3332,"children":3333},{"style":687},[3334],{"type":33,"value":1027},{"type":27,"tag":250,"props":3336,"children":3337},{"class":252,"line":304},[3338],{"type":27,"tag":250,"props":3339,"children":3340},{"emptyLinePlaceholder":18},[3341],{"type":33,"value":791},{"type":27,"tag":250,"props":3343,"children":3344},{"class":252,"line":313},[3345,3349,3354,3358,3362,3367,3372],{"type":27,"tag":250,"props":3346,"children":3347},{"style":675},[3348],{"type":33,"value":1994},{"type":27,"tag":250,"props":3350,"children":3351},{"style":736},[3352],{"type":33,"value":3353}," product",{"type":27,"tag":250,"props":3355,"children":3356},{"style":675},[3357],{"type":33,"value":719},{"type":27,"tag":250,"props":3359,"children":3360},{"style":675},[3361],{"type":33,"value":2106},{"type":27,"tag":250,"props":3363,"children":3364},{"style":687},[3365],{"type":33,"value":3366}," productRepo.",{"type":27,"tag":250,"props":3368,"children":3369},{"style":681},[3370],{"type":33,"value":3371},"findById",{"type":27,"tag":250,"props":3373,"children":3374},{"style":687},[3375],{"type":33,"value":2464},{"type":27,"tag":250,"props":3377,"children":3378},{"class":252,"line":321},[3379,3383,3387,3391],{"type":27,"tag":250,"props":3380,"children":3381},{"style":675},[3382],{"type":33,"value":2821},{"type":27,"tag":250,"props":3384,"children":3385},{"style":687},[3386],{"type":33,"value":896},{"type":27,"tag":250,"props":3388,"children":3389},{"style":675},[3390],{"type":33,"value":901},{"type":27,"tag":250,"props":3392,"children":3393},{"style":687},[3394],{"type":33,"value":3395},"product) {\n",{"type":27,"tag":250,"props":3397,"children":3398},{"class":252,"line":330},[3399,3404,3408,3412,3416,3421,3425,3429,3433,3438],{"type":27,"tag":250,"props":3400,"children":3401},{"style":675},[3402],{"type":33,"value":3403},"    await",{"type":27,"tag":250,"props":3405,"children":3406},{"style":687},[3407],{"type":33,"value":2805},{"type":27,"tag":250,"props":3409,"children":3410},{"style":681},[3411],{"type":33,"value":1117},{"type":27,"tag":250,"props":3413,"children":3414},{"style":687},[3415],{"type":33,"value":2918},{"type":27,"tag":250,"props":3417,"children":3418},{"style":2006},[3419],{"type":33,"value":3420},"'__NULL__'",{"type":27,"tag":250,"props":3422,"children":3423},{"style":687},[3424],{"type":33,"value":1065},{"type":27,"tag":250,"props":3426,"children":3427},{"style":2006},[3428],{"type":33,"value":2942},{"type":27,"tag":250,"props":3430,"children":3431},{"style":687},[3432],{"type":33,"value":1065},{"type":27,"tag":250,"props":3434,"children":3435},{"style":736},[3436],{"type":33,"value":3437},"60",{"type":27,"tag":250,"props":3439,"children":3440},{"style":687},[3441],{"type":33,"value":3442},")\n",{"type":27,"tag":250,"props":3444,"children":3445},{"class":252,"line":338},[3446,3450],{"type":27,"tag":250,"props":3447,"children":3448},{"style":675},[3449],{"type":33,"value":1013},{"type":27,"tag":250,"props":3451,"children":3452},{"style":736},[3453],{"type":33,"value":916},{"type":27,"tag":250,"props":3455,"children":3456},{"class":252,"line":999},[3457],{"type":27,"tag":250,"props":3458,"children":3459},{"style":687},[3460],{"type":33,"value":1027},{"type":27,"tag":250,"props":3462,"children":3463},{"class":252,"line":1007},[3464],{"type":27,"tag":250,"props":3465,"children":3466},{"emptyLinePlaceholder":18},[3467],{"type":33,"value":791},{"type":27,"tag":250,"props":3469,"children":3470},{"class":252,"line":1021},[3471,3475,3479,3483,3487,3491,3495,3499,3504,3508,3512,3517],{"type":27,"tag":250,"props":3472,"children":3473},{"style":675},[3474],{"type":33,"value":2905},{"type":27,"tag":250,"props":3476,"children":3477},{"style":687},[3478],{"type":33,"value":2805},{"type":27,"tag":250,"props":3480,"children":3481},{"style":681},[3482],{"type":33,"value":1117},{"type":27,"tag":250,"props":3484,"children":3485},{"style":687},[3486],{"type":33,"value":2918},{"type":27,"tag":250,"props":3488,"children":3489},{"style":736},[3490],{"type":33,"value":2923},{"type":27,"tag":250,"props":3492,"children":3493},{"style":687},[3494],{"type":33,"value":2840},{"type":27,"tag":250,"props":3496,"children":3497},{"style":681},[3498],{"type":33,"value":2932},{"type":27,"tag":250,"props":3500,"children":3501},{"style":687},[3502],{"type":33,"value":3503},"(product), ",{"type":27,"tag":250,"props":3505,"children":3506},{"style":2006},[3507],{"type":33,"value":2942},{"type":27,"tag":250,"props":3509,"children":3510},{"style":687},[3511],{"type":33,"value":1065},{"type":27,"tag":250,"props":3513,"children":3514},{"style":736},[3515],{"type":33,"value":3516},"600",{"type":27,"tag":250,"props":3518,"children":3519},{"style":687},[3520],{"type":33,"value":3442},{"type":27,"tag":250,"props":3522,"children":3523},{"class":252,"line":1030},[3524,3528],{"type":27,"tag":250,"props":3525,"children":3526},{"style":675},[3527],{"type":33,"value":2481},{"type":27,"tag":250,"props":3529,"children":3530},{"style":687},[3531],{"type":33,"value":3532}," product\n",{"type":27,"tag":250,"props":3534,"children":3535},{"class":252,"line":1038},[3536],{"type":27,"tag":250,"props":3537,"children":3538},{"style":687},[3539],{"type":33,"value":1183},{"type":27,"tag":228,"props":3541,"children":3543},{"id":3542},"_62-缓存击穿热点-key-突然失效",[3544],{"type":33,"value":3545},"6.2 缓存击穿：热点 key 突然失效",{"type":27,"tag":35,"props":3547,"children":3548},{},[3549],{"type":33,"value":3550},"一个超级热点 key 在失效瞬间，大量请求一起回源，把数据库打爆。",{"type":27,"tag":509,"props":3552,"children":3554},{"id":3553},"解决办法-1",[3555],{"type":33,"value":3139},{"type":27,"tag":97,"props":3557,"children":3558},{},[3559,3564,3569,3574],{"type":27,"tag":101,"props":3560,"children":3561},{},[3562],{"type":33,"value":3563},"单飞机制（single flight）",{"type":27,"tag":101,"props":3565,"children":3566},{},[3567],{"type":33,"value":3568},"分布式锁保护回源",{"type":27,"tag":101,"props":3570,"children":3571},{},[3572],{"type":33,"value":3573},"热点数据提前刷新",{"type":27,"tag":101,"props":3575,"children":3576},{},[3577],{"type":33,"value":3578},"TTL 加随机抖动，避免同时过期",{"type":27,"tag":240,"props":3580,"children":3582},{"className":663,"code":3581,"language":665,"meta":7,"style":7},"const inflight = new Map\u003Cstring, Promise\u003Cunknown>>()\n\nexport async function singleFlight\u003CT>(\n  key: string,\n  loader: () => Promise\u003CT>,\n): Promise\u003CT> {\n  const existing = inflight.get(key)\n  if (existing) return existing as Promise\u003CT>\n\n  const task = loader().finally(() => inflight.delete(key))\n  inflight.set(key, task)\n  return task\n}\n",[3583],{"type":27,"tag":246,"props":3584,"children":3585},{"__ignoreMap":7},[3586,3642,3649,3681,3700,3735,3762,3791,3833,3840,3892,3909,3921],{"type":27,"tag":250,"props":3587,"children":3588},{"class":252,"line":253},[3589,3594,3599,3603,3607,3611,3615,3619,3623,3628,3632,3637],{"type":27,"tag":250,"props":3590,"children":3591},{"style":675},[3592],{"type":33,"value":3593},"const",{"type":27,"tag":250,"props":3595,"children":3596},{"style":736},[3597],{"type":33,"value":3598}," inflight",{"type":27,"tag":250,"props":3600,"children":3601},{"style":675},[3602],{"type":33,"value":719},{"type":27,"tag":250,"props":3604,"children":3605},{"style":675},[3606],{"type":33,"value":724},{"type":27,"tag":250,"props":3608,"children":3609},{"style":681},[3610],{"type":33,"value":729},{"type":27,"tag":250,"props":3612,"children":3613},{"style":687},[3614],{"type":33,"value":690},{"type":27,"tag":250,"props":3616,"children":3617},{"style":736},[3618],{"type":33,"value":739},{"type":27,"tag":250,"props":3620,"children":3621},{"style":687},[3622],{"type":33,"value":1065},{"type":27,"tag":250,"props":3624,"children":3625},{"style":681},[3626],{"type":33,"value":3627},"Promise",{"type":27,"tag":250,"props":3629,"children":3630},{"style":687},[3631],{"type":33,"value":690},{"type":27,"tag":250,"props":3633,"children":3634},{"style":736},[3635],{"type":33,"value":3636},"unknown",{"type":27,"tag":250,"props":3638,"children":3639},{"style":687},[3640],{"type":33,"value":3641},">>()\n",{"type":27,"tag":250,"props":3643,"children":3644},{"class":252,"line":262},[3645],{"type":27,"tag":250,"props":3646,"children":3647},{"emptyLinePlaceholder":18},[3648],{"type":33,"value":791},{"type":27,"tag":250,"props":3650,"children":3651},{"class":252,"line":271},[3652,3656,3660,3664,3669,3673,3677],{"type":27,"tag":250,"props":3653,"children":3654},{"style":675},[3655],{"type":33,"value":1896},{"type":27,"tag":250,"props":3657,"children":3658},{"style":675},[3659],{"type":33,"value":1901},{"type":27,"tag":250,"props":3661,"children":3662},{"style":675},[3663],{"type":33,"value":1906},{"type":27,"tag":250,"props":3665,"children":3666},{"style":681},[3667],{"type":33,"value":3668}," singleFlight",{"type":27,"tag":250,"props":3670,"children":3671},{"style":687},[3672],{"type":33,"value":690},{"type":27,"tag":250,"props":3674,"children":3675},{"style":681},[3676],{"type":33,"value":2670},{"type":27,"tag":250,"props":3678,"children":3679},{"style":687},[3680],{"type":33,"value":2675},{"type":27,"tag":250,"props":3682,"children":3683},{"class":252,"line":20},[3684,3688,3692,3696],{"type":27,"tag":250,"props":3685,"children":3686},{"style":711},[3687],{"type":33,"value":2683},{"type":27,"tag":250,"props":3689,"children":3690},{"style":675},[3691],{"type":33,"value":754},{"type":27,"tag":250,"props":3693,"children":3694},{"style":736},[3695],{"type":33,"value":818},{"type":27,"tag":250,"props":3697,"children":3698},{"style":687},[3699],{"type":33,"value":1936},{"type":27,"tag":250,"props":3701,"children":3702},{"class":252,"line":287},[3703,3707,3711,3715,3719,3723,3727,3731],{"type":27,"tag":250,"props":3704,"children":3705},{"style":681},[3706],{"type":33,"value":2723},{"type":27,"tag":250,"props":3708,"children":3709},{"style":675},[3710],{"type":33,"value":754},{"type":27,"tag":250,"props":3712,"children":3713},{"style":687},[3714],{"type":33,"value":2732},{"type":27,"tag":250,"props":3716,"children":3717},{"style":675},[3718],{"type":33,"value":2158},{"type":27,"tag":250,"props":3720,"children":3721},{"style":681},[3722],{"type":33,"value":1973},{"type":27,"tag":250,"props":3724,"children":3725},{"style":687},[3726],{"type":33,"value":690},{"type":27,"tag":250,"props":3728,"children":3729},{"style":681},[3730],{"type":33,"value":2670},{"type":27,"tag":250,"props":3732,"children":3733},{"style":687},[3734],{"type":33,"value":2753},{"type":27,"tag":250,"props":3736,"children":3737},{"class":252,"line":296},[3738,3742,3746,3750,3754,3758],{"type":27,"tag":250,"props":3739,"children":3740},{"style":687},[3741],{"type":33,"value":823},{"type":27,"tag":250,"props":3743,"children":3744},{"style":675},[3745],{"type":33,"value":754},{"type":27,"tag":250,"props":3747,"children":3748},{"style":681},[3749],{"type":33,"value":1973},{"type":27,"tag":250,"props":3751,"children":3752},{"style":687},[3753],{"type":33,"value":690},{"type":27,"tag":250,"props":3755,"children":3756},{"style":681},[3757],{"type":33,"value":2670},{"type":27,"tag":250,"props":3759,"children":3760},{"style":687},[3761],{"type":33,"value":700},{"type":27,"tag":250,"props":3763,"children":3764},{"class":252,"line":304},[3765,3769,3774,3778,3783,3787],{"type":27,"tag":250,"props":3766,"children":3767},{"style":675},[3768],{"type":33,"value":1994},{"type":27,"tag":250,"props":3770,"children":3771},{"style":736},[3772],{"type":33,"value":3773}," existing",{"type":27,"tag":250,"props":3775,"children":3776},{"style":675},[3777],{"type":33,"value":719},{"type":27,"tag":250,"props":3779,"children":3780},{"style":687},[3781],{"type":33,"value":3782}," inflight.",{"type":27,"tag":250,"props":3784,"children":3785},{"style":681},[3786],{"type":33,"value":878},{"type":27,"tag":250,"props":3788,"children":3789},{"style":687},[3790],{"type":33,"value":883},{"type":27,"tag":250,"props":3792,"children":3793},{"class":252,"line":313},[3794,3798,3803,3807,3812,3816,3820,3824,3828],{"type":27,"tag":250,"props":3795,"children":3796},{"style":675},[3797],{"type":33,"value":2821},{"type":27,"tag":250,"props":3799,"children":3800},{"style":687},[3801],{"type":33,"value":3802}," (existing) ",{"type":27,"tag":250,"props":3804,"children":3805},{"style":675},[3806],{"type":33,"value":911},{"type":27,"tag":250,"props":3808,"children":3809},{"style":687},[3810],{"type":33,"value":3811}," existing ",{"type":27,"tag":250,"props":3813,"children":3814},{"style":675},[3815],{"type":33,"value":2855},{"type":27,"tag":250,"props":3817,"children":3818},{"style":681},[3819],{"type":33,"value":1973},{"type":27,"tag":250,"props":3821,"children":3822},{"style":687},[3823],{"type":33,"value":690},{"type":27,"tag":250,"props":3825,"children":3826},{"style":681},[3827],{"type":33,"value":2670},{"type":27,"tag":250,"props":3829,"children":3830},{"style":687},[3831],{"type":33,"value":3832},">\n",{"type":27,"tag":250,"props":3834,"children":3835},{"class":252,"line":321},[3836],{"type":27,"tag":250,"props":3837,"children":3838},{"emptyLinePlaceholder":18},[3839],{"type":33,"value":791},{"type":27,"tag":250,"props":3841,"children":3842},{"class":252,"line":330},[3843,3847,3852,3856,3860,3865,3870,3875,3879,3883,3887],{"type":27,"tag":250,"props":3844,"children":3845},{"style":675},[3846],{"type":33,"value":1994},{"type":27,"tag":250,"props":3848,"children":3849},{"style":736},[3850],{"type":33,"value":3851}," task",{"type":27,"tag":250,"props":3853,"children":3854},{"style":675},[3855],{"type":33,"value":719},{"type":27,"tag":250,"props":3857,"children":3858},{"style":681},[3859],{"type":33,"value":2892},{"type":27,"tag":250,"props":3861,"children":3862},{"style":687},[3863],{"type":33,"value":3864},"().",{"type":27,"tag":250,"props":3866,"children":3867},{"style":681},[3868],{"type":33,"value":3869},"finally",{"type":27,"tag":250,"props":3871,"children":3872},{"style":687},[3873],{"type":33,"value":3874},"(() ",{"type":27,"tag":250,"props":3876,"children":3877},{"style":675},[3878],{"type":33,"value":2158},{"type":27,"tag":250,"props":3880,"children":3881},{"style":687},[3882],{"type":33,"value":3782},{"type":27,"tag":250,"props":3884,"children":3885},{"style":681},[3886],{"type":33,"value":972},{"type":27,"tag":250,"props":3888,"children":3889},{"style":687},[3890],{"type":33,"value":3891},"(key))\n",{"type":27,"tag":250,"props":3893,"children":3894},{"class":252,"line":338},[3895,3900,3904],{"type":27,"tag":250,"props":3896,"children":3897},{"style":687},[3898],{"type":33,"value":3899},"  inflight.",{"type":27,"tag":250,"props":3901,"children":3902},{"style":681},[3903],{"type":33,"value":1117},{"type":27,"tag":250,"props":3905,"children":3906},{"style":687},[3907],{"type":33,"value":3908},"(key, task)\n",{"type":27,"tag":250,"props":3910,"children":3911},{"class":252,"line":999},[3912,3916],{"type":27,"tag":250,"props":3913,"children":3914},{"style":675},[3915],{"type":33,"value":2481},{"type":27,"tag":250,"props":3917,"children":3918},{"style":687},[3919],{"type":33,"value":3920}," task\n",{"type":27,"tag":250,"props":3922,"children":3923},{"class":252,"line":1007},[3924],{"type":27,"tag":250,"props":3925,"children":3926},{"style":687},[3927],{"type":33,"value":1183},{"type":27,"tag":228,"props":3929,"children":3931},{"id":3930},"_63-缓存雪崩一批-key-同时失效",[3932],{"type":33,"value":3933},"6.3 缓存雪崩：一批 key 同时失效",{"type":27,"tag":35,"props":3935,"children":3936},{},[3937],{"type":33,"value":3938},"这通常不是代码 bug，而是 TTL 设计太整齐。",{"type":27,"tag":35,"props":3940,"children":3941},{},[3942],{"type":33,"value":3943},"例如你在整点批量写缓存，统一 TTL 30 分钟，那么 30 分钟后整批一起过期。",{"type":27,"tag":509,"props":3945,"children":3947},{"id":3946},"解决办法-2",[3948],{"type":33,"value":3139},{"type":27,"tag":97,"props":3950,"children":3951},{},[3952,3957,3962,3967],{"type":27,"tag":101,"props":3953,"children":3954},{},[3955],{"type":33,"value":3956},"TTL 加随机值",{"type":27,"tag":101,"props":3958,"children":3959},{},[3960],{"type":33,"value":3961},"分批预热",{"type":27,"tag":101,"props":3963,"children":3964},{},[3965],{"type":33,"value":3966},"分层兜底",{"type":27,"tag":101,"props":3968,"children":3969},{},[3970],{"type":33,"value":3971},"miss 高峰时自动降级",{"type":27,"tag":228,"props":3973,"children":3975},{"id":3974},"_64-缓存污染把低价值低复用数据缓存了太多",[3976],{"type":33,"value":3977},"6.4 缓存污染：把低价值、低复用数据缓存了太多",{"type":27,"tag":35,"props":3979,"children":3980},{},[3981],{"type":33,"value":3982},"一个典型错误是：",{"type":27,"tag":97,"props":3984,"children":3985},{},[3986,3991,3996],{"type":27,"tag":101,"props":3987,"children":3988},{},[3989],{"type":33,"value":3990},"把每个组合筛选结果都缓存",{"type":27,"tag":101,"props":3992,"children":3993},{},[3994],{"type":33,"value":3995},"把低频用户特征也长时间缓存",{"type":27,"tag":101,"props":3997,"children":3998},{},[3999],{"type":33,"value":4000},"把大对象整包缓存但只用其中 5% 字段",{"type":27,"tag":35,"props":4002,"children":4003},{},[4004],{"type":33,"value":4005},"结果就是：",{"type":27,"tag":97,"props":4007,"children":4008},{},[4009,4014,4019],{"type":27,"tag":101,"props":4010,"children":4011},{},[4012],{"type":33,"value":4013},"Redis 内存被迅速吃满",{"type":27,"tag":101,"props":4015,"children":4016},{},[4017],{"type":33,"value":4018},"淘汰策略开始误伤热点数据",{"type":27,"tag":101,"props":4020,"children":4021},{},[4022],{"type":33,"value":4023},"命中率并没有显著上升",{"type":27,"tag":35,"props":4025,"children":4026},{},[4027],{"type":33,"value":4028},"缓存不是仓库，缓存是收费很高的高速收费站。",{"type":27,"tag":178,"props":4030,"children":4031},{},[],{"type":27,"tag":182,"props":4033,"children":4035},{"id":4034},"七本地缓存-redis-的组合什么时候最值",[4036],{"type":33,"value":4037},"七、本地缓存 + Redis 的组合，什么时候最值",{"type":27,"tag":35,"props":4039,"children":4040},{},[4041],{"type":33,"value":4042},"这是很多中大型系统都非常常见的一种搭配。",{"type":27,"tag":228,"props":4044,"children":4046},{"id":4045},"_71-为什么需要两层",[4047],{"type":33,"value":4048},"7.1 为什么需要两层",{"type":27,"tag":35,"props":4050,"children":4051},{},[4052],{"type":33,"value":4053},"如果所有请求都直接打 Redis，会有三个问题：",{"type":27,"tag":97,"props":4055,"children":4056},{},[4057,4062,4067],{"type":27,"tag":101,"props":4058,"children":4059},{},[4060],{"type":33,"value":4061},"高频热点仍然经过网络",{"type":27,"tag":101,"props":4063,"children":4064},{},[4065],{"type":33,"value":4066},"Redis 成为共享瓶颈",{"type":27,"tag":101,"props":4068,"children":4069},{},[4070],{"type":33,"value":4071},"应用层短时突发没被吸收",{"type":27,"tag":35,"props":4073,"children":4074},{},[4075],{"type":33,"value":4076},"所以更合理的路径通常是：",{"type":27,"tag":240,"props":4078,"children":4080},{"className":242,"code":4079,"language":33,"meta":7,"style":7},"先查本地缓存 → miss 再查 Redis → miss 再查数据库 / 下游服务\n",[4081],{"type":27,"tag":246,"props":4082,"children":4083},{"__ignoreMap":7},[4084],{"type":27,"tag":250,"props":4085,"children":4086},{"class":252,"line":253},[4087],{"type":27,"tag":250,"props":4088,"children":4089},{},[4090],{"type":33,"value":4079},{"type":27,"tag":228,"props":4092,"children":4094},{"id":4093},"_72-一个更完整的实现示例",[4095],{"type":33,"value":4096},"7.2 一个更完整的实现示例",{"type":27,"tag":240,"props":4098,"children":4100},{"className":663,"code":4099,"language":665,"meta":7,"style":7},"export async function localFirstThenRedis\u003CT>(\n  key: string,\n  ttlSeconds: number,\n  loader: () => Promise\u003CT>,\n): Promise\u003CT> {\n  const local = localCache.get(key)\n  if (local) return local as T\n\n  const remote = await redis.get(key)\n  if (remote) {\n    const parsed = JSON.parse(remote) as T\n    localCache.set(key, parsed, 3_000)\n    return parsed\n  }\n\n  const value = await singleFlight(key, loader)\n  await redis.set(\n    key,\n    JSON.stringify(value),\n    'EX',\n    ttlSeconds + Math.floor(Math.random() * 15),\n  )\n  localCache.set(key, value, 3_000)\n  return value\n}\n",[4101],{"type":27,"tag":246,"props":4102,"children":4103},{"__ignoreMap":7},[4104,4135,4154,4173,4208,4235,4264,4293,4300,4332,4344,4385,4411,4423,4430,4437,4465,4484,4492,4513,4525,4576,4583,4608,4619],{"type":27,"tag":250,"props":4105,"children":4106},{"class":252,"line":253},[4107,4111,4115,4119,4123,4127,4131],{"type":27,"tag":250,"props":4108,"children":4109},{"style":675},[4110],{"type":33,"value":1896},{"type":27,"tag":250,"props":4112,"children":4113},{"style":675},[4114],{"type":33,"value":1901},{"type":27,"tag":250,"props":4116,"children":4117},{"style":675},[4118],{"type":33,"value":1906},{"type":27,"tag":250,"props":4120,"children":4121},{"style":681},[4122],{"type":33,"value":2333},{"type":27,"tag":250,"props":4124,"children":4125},{"style":687},[4126],{"type":33,"value":690},{"type":27,"tag":250,"props":4128,"children":4129},{"style":681},[4130],{"type":33,"value":2670},{"type":27,"tag":250,"props":4132,"children":4133},{"style":687},[4134],{"type":33,"value":2675},{"type":27,"tag":250,"props":4136,"children":4137},{"class":252,"line":262},[4138,4142,4146,4150],{"type":27,"tag":250,"props":4139,"children":4140},{"style":711},[4141],{"type":33,"value":2683},{"type":27,"tag":250,"props":4143,"children":4144},{"style":675},[4145],{"type":33,"value":754},{"type":27,"tag":250,"props":4147,"children":4148},{"style":736},[4149],{"type":33,"value":818},{"type":27,"tag":250,"props":4151,"children":4152},{"style":687},[4153],{"type":33,"value":1936},{"type":27,"tag":250,"props":4155,"children":4156},{"class":252,"line":271},[4157,4161,4165,4169],{"type":27,"tag":250,"props":4158,"children":4159},{"style":711},[4160],{"type":33,"value":2703},{"type":27,"tag":250,"props":4162,"children":4163},{"style":675},[4164],{"type":33,"value":754},{"type":27,"tag":250,"props":4166,"children":4167},{"style":736},[4168],{"type":33,"value":778},{"type":27,"tag":250,"props":4170,"children":4171},{"style":687},[4172],{"type":33,"value":1936},{"type":27,"tag":250,"props":4174,"children":4175},{"class":252,"line":20},[4176,4180,4184,4188,4192,4196,4200,4204],{"type":27,"tag":250,"props":4177,"children":4178},{"style":681},[4179],{"type":33,"value":2723},{"type":27,"tag":250,"props":4181,"children":4182},{"style":675},[4183],{"type":33,"value":754},{"type":27,"tag":250,"props":4185,"children":4186},{"style":687},[4187],{"type":33,"value":2732},{"type":27,"tag":250,"props":4189,"children":4190},{"style":675},[4191],{"type":33,"value":2158},{"type":27,"tag":250,"props":4193,"children":4194},{"style":681},[4195],{"type":33,"value":1973},{"type":27,"tag":250,"props":4197,"children":4198},{"style":687},[4199],{"type":33,"value":690},{"type":27,"tag":250,"props":4201,"children":4202},{"style":681},[4203],{"type":33,"value":2670},{"type":27,"tag":250,"props":4205,"children":4206},{"style":687},[4207],{"type":33,"value":2753},{"type":27,"tag":250,"props":4209,"children":4210},{"class":252,"line":287},[4211,4215,4219,4223,4227,4231],{"type":27,"tag":250,"props":4212,"children":4213},{"style":687},[4214],{"type":33,"value":823},{"type":27,"tag":250,"props":4216,"children":4217},{"style":675},[4218],{"type":33,"value":754},{"type":27,"tag":250,"props":4220,"children":4221},{"style":681},[4222],{"type":33,"value":1973},{"type":27,"tag":250,"props":4224,"children":4225},{"style":687},[4226],{"type":33,"value":690},{"type":27,"tag":250,"props":4228,"children":4229},{"style":681},[4230],{"type":33,"value":2670},{"type":27,"tag":250,"props":4232,"children":4233},{"style":687},[4234],{"type":33,"value":700},{"type":27,"tag":250,"props":4236,"children":4237},{"class":252,"line":296},[4238,4242,4247,4251,4256,4260],{"type":27,"tag":250,"props":4239,"children":4240},{"style":675},[4241],{"type":33,"value":1994},{"type":27,"tag":250,"props":4243,"children":4244},{"style":736},[4245],{"type":33,"value":4246}," local",{"type":27,"tag":250,"props":4248,"children":4249},{"style":675},[4250],{"type":33,"value":719},{"type":27,"tag":250,"props":4252,"children":4253},{"style":687},[4254],{"type":33,"value":4255}," localCache.",{"type":27,"tag":250,"props":4257,"children":4258},{"style":681},[4259],{"type":33,"value":878},{"type":27,"tag":250,"props":4261,"children":4262},{"style":687},[4263],{"type":33,"value":883},{"type":27,"tag":250,"props":4265,"children":4266},{"class":252,"line":304},[4267,4271,4276,4280,4285,4289],{"type":27,"tag":250,"props":4268,"children":4269},{"style":675},[4270],{"type":33,"value":2821},{"type":27,"tag":250,"props":4272,"children":4273},{"style":687},[4274],{"type":33,"value":4275}," (local) ",{"type":27,"tag":250,"props":4277,"children":4278},{"style":675},[4279],{"type":33,"value":911},{"type":27,"tag":250,"props":4281,"children":4282},{"style":687},[4283],{"type":33,"value":4284}," local ",{"type":27,"tag":250,"props":4286,"children":4287},{"style":675},[4288],{"type":33,"value":2855},{"type":27,"tag":250,"props":4290,"children":4291},{"style":681},[4292],{"type":33,"value":2860},{"type":27,"tag":250,"props":4294,"children":4295},{"class":252,"line":313},[4296],{"type":27,"tag":250,"props":4297,"children":4298},{"emptyLinePlaceholder":18},[4299],{"type":33,"value":791},{"type":27,"tag":250,"props":4301,"children":4302},{"class":252,"line":321},[4303,4307,4312,4316,4320,4324,4328],{"type":27,"tag":250,"props":4304,"children":4305},{"style":675},[4306],{"type":33,"value":1994},{"type":27,"tag":250,"props":4308,"children":4309},{"style":736},[4310],{"type":33,"value":4311}," remote",{"type":27,"tag":250,"props":4313,"children":4314},{"style":675},[4315],{"type":33,"value":719},{"type":27,"tag":250,"props":4317,"children":4318},{"style":675},[4319],{"type":33,"value":2106},{"type":27,"tag":250,"props":4321,"children":4322},{"style":687},[4323],{"type":33,"value":2805},{"type":27,"tag":250,"props":4325,"children":4326},{"style":681},[4327],{"type":33,"value":878},{"type":27,"tag":250,"props":4329,"children":4330},{"style":687},[4331],{"type":33,"value":883},{"type":27,"tag":250,"props":4333,"children":4334},{"class":252,"line":330},[4335,4339],{"type":27,"tag":250,"props":4336,"children":4337},{"style":675},[4338],{"type":33,"value":2821},{"type":27,"tag":250,"props":4340,"children":4341},{"style":687},[4342],{"type":33,"value":4343}," (remote) {\n",{"type":27,"tag":250,"props":4345,"children":4346},{"class":252,"line":338},[4347,4351,4356,4360,4364,4368,4372,4377,4381],{"type":27,"tag":250,"props":4348,"children":4349},{"style":675},[4350],{"type":33,"value":854},{"type":27,"tag":250,"props":4352,"children":4353},{"style":736},[4354],{"type":33,"value":4355}," parsed",{"type":27,"tag":250,"props":4357,"children":4358},{"style":675},[4359],{"type":33,"value":719},{"type":27,"tag":250,"props":4361,"children":4362},{"style":736},[4363],{"type":33,"value":2835},{"type":27,"tag":250,"props":4365,"children":4366},{"style":687},[4367],{"type":33,"value":2840},{"type":27,"tag":250,"props":4369,"children":4370},{"style":681},[4371],{"type":33,"value":2845},{"type":27,"tag":250,"props":4373,"children":4374},{"style":687},[4375],{"type":33,"value":4376},"(remote) ",{"type":27,"tag":250,"props":4378,"children":4379},{"style":675},[4380],{"type":33,"value":2855},{"type":27,"tag":250,"props":4382,"children":4383},{"style":681},[4384],{"type":33,"value":2860},{"type":27,"tag":250,"props":4386,"children":4387},{"class":252,"line":999},[4388,4393,4397,4402,4407],{"type":27,"tag":250,"props":4389,"children":4390},{"style":687},[4391],{"type":33,"value":4392},"    localCache.",{"type":27,"tag":250,"props":4394,"children":4395},{"style":681},[4396],{"type":33,"value":1117},{"type":27,"tag":250,"props":4398,"children":4399},{"style":687},[4400],{"type":33,"value":4401},"(key, parsed, ",{"type":27,"tag":250,"props":4403,"children":4404},{"style":736},[4405],{"type":33,"value":4406},"3_000",{"type":27,"tag":250,"props":4408,"children":4409},{"style":687},[4410],{"type":33,"value":3442},{"type":27,"tag":250,"props":4412,"children":4413},{"class":252,"line":1007},[4414,4418],{"type":27,"tag":250,"props":4415,"children":4416},{"style":675},[4417],{"type":33,"value":1013},{"type":27,"tag":250,"props":4419,"children":4420},{"style":687},[4421],{"type":33,"value":4422}," parsed\n",{"type":27,"tag":250,"props":4424,"children":4425},{"class":252,"line":1021},[4426],{"type":27,"tag":250,"props":4427,"children":4428},{"style":687},[4429],{"type":33,"value":1027},{"type":27,"tag":250,"props":4431,"children":4432},{"class":252,"line":1030},[4433],{"type":27,"tag":250,"props":4434,"children":4435},{"emptyLinePlaceholder":18},[4436],{"type":33,"value":791},{"type":27,"tag":250,"props":4438,"children":4439},{"class":252,"line":1038},[4440,4444,4448,4452,4456,4460],{"type":27,"tag":250,"props":4441,"children":4442},{"style":675},[4443],{"type":33,"value":1994},{"type":27,"tag":250,"props":4445,"children":4446},{"style":736},[4447],{"type":33,"value":2879},{"type":27,"tag":250,"props":4449,"children":4450},{"style":675},[4451],{"type":33,"value":719},{"type":27,"tag":250,"props":4453,"children":4454},{"style":675},[4455],{"type":33,"value":2106},{"type":27,"tag":250,"props":4457,"children":4458},{"style":681},[4459],{"type":33,"value":3668},{"type":27,"tag":250,"props":4461,"children":4462},{"style":687},[4463],{"type":33,"value":4464},"(key, loader)\n",{"type":27,"tag":250,"props":4466,"children":4467},{"class":252,"line":1102},[4468,4472,4476,4480],{"type":27,"tag":250,"props":4469,"children":4470},{"style":675},[4471],{"type":33,"value":2905},{"type":27,"tag":250,"props":4473,"children":4474},{"style":687},[4475],{"type":33,"value":2805},{"type":27,"tag":250,"props":4477,"children":4478},{"style":681},[4479],{"type":33,"value":1117},{"type":27,"tag":250,"props":4481,"children":4482},{"style":687},[4483],{"type":33,"value":1916},{"type":27,"tag":250,"props":4485,"children":4486},{"class":252,"line":21},[4487],{"type":27,"tag":250,"props":4488,"children":4489},{"style":687},[4490],{"type":33,"value":4491},"    key,\n",{"type":27,"tag":250,"props":4493,"children":4494},{"class":252,"line":1133},[4495,4500,4504,4508],{"type":27,"tag":250,"props":4496,"children":4497},{"style":736},[4498],{"type":33,"value":4499},"    JSON",{"type":27,"tag":250,"props":4501,"children":4502},{"style":687},[4503],{"type":33,"value":2840},{"type":27,"tag":250,"props":4505,"children":4506},{"style":681},[4507],{"type":33,"value":2932},{"type":27,"tag":250,"props":4509,"children":4510},{"style":687},[4511],{"type":33,"value":4512},"(value),\n",{"type":27,"tag":250,"props":4514,"children":4515},{"class":252,"line":1160},[4516,4521],{"type":27,"tag":250,"props":4517,"children":4518},{"style":2006},[4519],{"type":33,"value":4520},"    'EX'",{"type":27,"tag":250,"props":4522,"children":4523},{"style":687},[4524],{"type":33,"value":1936},{"type":27,"tag":250,"props":4526,"children":4527},{"class":252,"line":1169},[4528,4533,4537,4542,4547,4552,4557,4561,4566,4571],{"type":27,"tag":250,"props":4529,"children":4530},{"style":687},[4531],{"type":33,"value":4532},"    ttlSeconds ",{"type":27,"tag":250,"props":4534,"children":4535},{"style":675},[4536],{"type":33,"value":1152},{"type":27,"tag":250,"props":4538,"children":4539},{"style":687},[4540],{"type":33,"value":4541}," Math.",{"type":27,"tag":250,"props":4543,"children":4544},{"style":681},[4545],{"type":33,"value":4546},"floor",{"type":27,"tag":250,"props":4548,"children":4549},{"style":687},[4550],{"type":33,"value":4551},"(Math.",{"type":27,"tag":250,"props":4553,"children":4554},{"style":681},[4555],{"type":33,"value":4556},"random",{"type":27,"tag":250,"props":4558,"children":4559},{"style":687},[4560],{"type":33,"value":945},{"type":27,"tag":250,"props":4562,"children":4563},{"style":675},[4564],{"type":33,"value":4565},"*",{"type":27,"tag":250,"props":4567,"children":4568},{"style":736},[4569],{"type":33,"value":4570}," 15",{"type":27,"tag":250,"props":4572,"children":4573},{"style":687},[4574],{"type":33,"value":4575},"),\n",{"type":27,"tag":250,"props":4577,"children":4578},{"class":252,"line":1177},[4579],{"type":27,"tag":250,"props":4580,"children":4581},{"style":687},[4582],{"type":33,"value":2181},{"type":27,"tag":250,"props":4584,"children":4585},{"class":252,"line":2191},[4586,4591,4595,4600,4604],{"type":27,"tag":250,"props":4587,"children":4588},{"style":687},[4589],{"type":33,"value":4590},"  localCache.",{"type":27,"tag":250,"props":4592,"children":4593},{"style":681},[4594],{"type":33,"value":1117},{"type":27,"tag":250,"props":4596,"children":4597},{"style":687},[4598],{"type":33,"value":4599},"(key, value, ",{"type":27,"tag":250,"props":4601,"children":4602},{"style":736},[4603],{"type":33,"value":4406},{"type":27,"tag":250,"props":4605,"children":4606},{"style":687},[4607],{"type":33,"value":3442},{"type":27,"tag":250,"props":4609,"children":4610},{"class":252,"line":2220},[4611,4615],{"type":27,"tag":250,"props":4612,"children":4613},{"style":675},[4614],{"type":33,"value":2481},{"type":27,"tag":250,"props":4616,"children":4617},{"style":687},[4618],{"type":33,"value":2959},{"type":27,"tag":250,"props":4620,"children":4621},{"class":252,"line":2241},[4622],{"type":27,"tag":250,"props":4623,"children":4624},{"style":687},[4625],{"type":33,"value":1183},{"type":27,"tag":35,"props":4627,"children":4628},{},[4629],{"type":33,"value":4630},"这里有三个关键点：",{"type":27,"tag":97,"props":4632,"children":4633},{},[4634,4639,4644],{"type":27,"tag":101,"props":4635,"children":4636},{},[4637],{"type":33,"value":4638},"本地缓存 TTL 更短，承担瞬时热点",{"type":27,"tag":101,"props":4640,"children":4641},{},[4642],{"type":33,"value":4643},"Redis TTL 更长，承担跨实例共享",{"type":27,"tag":101,"props":4645,"children":4646},{},[4647],{"type":33,"value":4648},"TTL 加随机抖动，避免集体过期",{"type":27,"tag":228,"props":4650,"children":4652},{"id":4651},"_73-它不适合什么",[4653],{"type":33,"value":4654},"7.3 它不适合什么",{"type":27,"tag":97,"props":4656,"children":4657},{},[4658,4663,4668,4673],{"type":27,"tag":101,"props":4659,"children":4660},{},[4661],{"type":33,"value":4662},"极强一致场景",{"type":27,"tag":101,"props":4664,"children":4665},{},[4666],{"type":33,"value":4667},"单个对象特别大",{"type":27,"tag":101,"props":4669,"children":4670},{},[4671],{"type":33,"value":4672},"数据变化非常频繁",{"type":27,"tag":101,"props":4674,"children":4675},{},[4676],{"type":33,"value":4677},"本地缓存失效后代价很高，但又没有通知机制",{"type":27,"tag":178,"props":4679,"children":4680},{},[],{"type":27,"tag":182,"props":4682,"children":4684},{"id":4683},"八cdn-不是只给图片用的",[4685],{"type":33,"value":4686},"八、CDN 不是只给图片用的",{"type":27,"tag":35,"props":4688,"children":4689},{},[4690],{"type":33,"value":4691},"这是一个很常见的认知偏差。",{"type":27,"tag":35,"props":4693,"children":4694},{},[4695],{"type":33,"value":4696},"很多团队只把 CDN 当成“静态资源托管器”。实际上，CDN 对弱动态内容同样有巨大价值。",{"type":27,"tag":228,"props":4698,"children":4700},{"id":4699},"_81-哪些内容适合-cdn-缓存",[4701],{"type":33,"value":4702},"8.1 哪些内容适合 CDN 缓存",{"type":27,"tag":97,"props":4704,"children":4705},{},[4706,4711,4716,4721,4726],{"type":27,"tag":101,"props":4707,"children":4708},{},[4709],{"type":33,"value":4710},"文章详情页",{"type":27,"tag":101,"props":4712,"children":4713},{},[4714],{"type":33,"value":4715},"活动专题页",{"type":27,"tag":101,"props":4717,"children":4718},{},[4719],{"type":33,"value":4720},"不同地区共享的公共配置",{"type":27,"tag":101,"props":4722,"children":4723},{},[4724],{"type":33,"value":4725},"商品详情的公共部分",{"type":27,"tag":101,"props":4727,"children":4728},{},[4729],{"type":33,"value":4730},"排行榜、榜单接口",{"type":27,"tag":228,"props":4732,"children":4734},{"id":4733},"_82-edge-缓存的核心问题不是能不能缓存而是怎么回源",[4735],{"type":33,"value":4736},"8.2 Edge 缓存的核心问题不是能不能缓存，而是怎么回源",{"type":27,"tag":35,"props":4738,"children":4739},{},[4740],{"type":33,"value":4741},"如果 CDN 缓存 miss 后直接回源到最重的应用链路，收益会被稀释。",{"type":27,"tag":35,"props":4743,"children":4744},{},[4745],{"type":33,"value":4746},"更好的方式通常是：",{"type":27,"tag":97,"props":4748,"children":4749},{},[4750,4755,4760],{"type":27,"tag":101,"props":4751,"children":4752},{},[4753],{"type":33,"value":4754},"CDN miss → 命中网关或 BFF 的轻量聚合接口",{"type":27,"tag":101,"props":4756,"children":4757},{},[4758],{"type":33,"value":4759},"BFF 再命中 Redis / 本地缓存",{"type":27,"tag":101,"props":4761,"children":4762},{},[4763],{"type":33,"value":4764},"最后才落到数据库",{"type":27,"tag":35,"props":4766,"children":4767},{},[4768,4770],{"type":33,"value":4769},"也就是说，",{"type":27,"tag":86,"props":4771,"children":4772},{},[4773],{"type":33,"value":4774},"边缘缓存和中心缓存不是替代关系，而是串联关系。",{"type":27,"tag":228,"props":4776,"children":4778},{"id":4777},"_83-一个活动页的边缘策略例子",[4779],{"type":33,"value":4780},"8.3 一个活动页的边缘策略例子",{"type":27,"tag":240,"props":4782,"children":4784},{"className":478,"code":4783,"language":480,"meta":7,"style":7},"Cache-Control: public, s-maxage=60, stale-while-revalidate=30\n",[4785],{"type":27,"tag":246,"props":4786,"children":4787},{"__ignoreMap":7},[4788],{"type":27,"tag":250,"props":4789,"children":4790},{"class":252,"line":253},[4791],{"type":27,"tag":250,"props":4792,"children":4793},{},[4794],{"type":33,"value":4783},{"type":27,"tag":35,"props":4796,"children":4797},{},[4798],{"type":33,"value":4799},"这组头部表达的意思是：",{"type":27,"tag":97,"props":4801,"children":4802},{},[4803,4808,4813],{"type":27,"tag":101,"props":4804,"children":4805},{},[4806],{"type":33,"value":4807},"CDN 可缓存 60 秒",{"type":27,"tag":101,"props":4809,"children":4810},{},[4811],{"type":33,"value":4812},"过期后短时间内可以先返回旧内容",{"type":27,"tag":101,"props":4814,"children":4815},{},[4816],{"type":33,"value":4817},"同时后台重新验证和刷新",{"type":27,"tag":35,"props":4819,"children":4820},{},[4821],{"type":33,"value":4822},"它特别适合：",{"type":27,"tag":97,"props":4824,"children":4825},{},[4826,4831,4836],{"type":27,"tag":101,"props":4827,"children":4828},{},[4829],{"type":33,"value":4830},"访问量高",{"type":27,"tag":101,"props":4832,"children":4833},{},[4834],{"type":33,"value":4835},"允许几十秒旧数据",{"type":27,"tag":101,"props":4837,"children":4838},{},[4839],{"type":33,"value":4840},"更新有节奏而不是实时跳变",{"type":27,"tag":178,"props":4842,"children":4843},{},[],{"type":27,"tag":182,"props":4845,"children":4847},{"id":4846},"九缓存失效设计决定了你会不会在凌晨被叫醒",[4848],{"type":33,"value":4849},"九、缓存失效设计，决定了你会不会在凌晨被叫醒",{"type":27,"tag":35,"props":4851,"children":4852},{},[4853],{"type":33,"value":4854},"缓存方案能不能在线上稳定，关键不只在命中率，还在失效方式。",{"type":27,"tag":228,"props":4856,"children":4858},{"id":4857},"_91-三种常见失效方式",[4859],{"type":33,"value":4860},"9.1 三种常见失效方式",{"type":27,"tag":509,"props":4862,"children":4864},{"id":4863},"方式-a纯-ttl-到期",[4865],{"type":33,"value":4866},"方式 A：纯 TTL 到期",{"type":27,"tag":35,"props":4868,"children":4869},{},[4870],{"type":33,"value":4871},"最简单，但最被动。",{"type":27,"tag":35,"props":4873,"children":4874},{},[4875],{"type":33,"value":4876},"适合：",{"type":27,"tag":97,"props":4878,"children":4879},{},[4880,4885,4890],{"type":27,"tag":101,"props":4881,"children":4882},{},[4883],{"type":33,"value":4884},"变化规律稳定",{"type":27,"tag":101,"props":4886,"children":4887},{},[4888],{"type":33,"value":4889},"短时间旧数据可接受",{"type":27,"tag":101,"props":4891,"children":4892},{},[4893],{"type":33,"value":4894},"失效后回源成本不高",{"type":27,"tag":509,"props":4896,"children":4898},{"id":4897},"方式-b事件驱动失效",[4899],{"type":33,"value":4900},"方式 B：事件驱动失效",{"type":27,"tag":35,"props":4902,"children":4903},{},[4904],{"type":33,"value":4905},"数据更新后，主动删除或刷新相关 key。",{"type":27,"tag":35,"props":4907,"children":4908},{},[4909],{"type":33,"value":4876},{"type":27,"tag":97,"props":4911,"children":4912},{},[4913,4918,4923],{"type":27,"tag":101,"props":4914,"children":4915},{},[4916],{"type":33,"value":4917},"商品改价",{"type":27,"tag":101,"props":4919,"children":4920},{},[4921],{"type":33,"value":4922},"活动规则更新",{"type":27,"tag":101,"props":4924,"children":4925},{},[4926],{"type":33,"value":4927},"权限模型变化",{"type":27,"tag":240,"props":4929,"children":4931},{"className":663,"code":4930,"language":665,"meta":7,"style":7},"async function onProductUpdated(productId: string) {\n  await redis.del(`product:static:${productId}`)\n  localCache.set(`product:static:${productId}`, null, 1)\n  await cdn.purge(`/products/${productId}`)\n}\n",[4932],{"type":27,"tag":246,"props":4933,"children":4934},{"__ignoreMap":7},[4935,4971,5008,5056,5094],{"type":27,"tag":250,"props":4936,"children":4937},{"class":252,"line":253},[4938,4942,4946,4951,4955,4959,4963,4967],{"type":27,"tag":250,"props":4939,"children":4940},{"style":675},[4941],{"type":33,"value":3174},{"type":27,"tag":250,"props":4943,"children":4944},{"style":675},[4945],{"type":33,"value":1906},{"type":27,"tag":250,"props":4947,"children":4948},{"style":681},[4949],{"type":33,"value":4950}," onProductUpdated",{"type":27,"tag":250,"props":4952,"children":4953},{"style":687},[4954],{"type":33,"value":804},{"type":27,"tag":250,"props":4956,"children":4957},{"style":711},[4958],{"type":33,"value":2014},{"type":27,"tag":250,"props":4960,"children":4961},{"style":675},[4962],{"type":33,"value":754},{"type":27,"tag":250,"props":4964,"children":4965},{"style":736},[4966],{"type":33,"value":818},{"type":27,"tag":250,"props":4968,"children":4969},{"style":687},[4970],{"type":33,"value":1099},{"type":27,"tag":250,"props":4972,"children":4973},{"class":252,"line":262},[4974,4978,4982,4987,4991,4996,5000,5004],{"type":27,"tag":250,"props":4975,"children":4976},{"style":675},[4977],{"type":33,"value":2905},{"type":27,"tag":250,"props":4979,"children":4980},{"style":687},[4981],{"type":33,"value":2805},{"type":27,"tag":250,"props":4983,"children":4984},{"style":681},[4985],{"type":33,"value":4986},"del",{"type":27,"tag":250,"props":4988,"children":4989},{"style":687},[4990],{"type":33,"value":804},{"type":27,"tag":250,"props":4992,"children":4993},{"style":2006},[4994],{"type":33,"value":4995},"`product:static:${",{"type":27,"tag":250,"props":4997,"children":4998},{"style":687},[4999],{"type":33,"value":2014},{"type":27,"tag":250,"props":5001,"children":5002},{"style":2006},[5003],{"type":33,"value":2069},{"type":27,"tag":250,"props":5005,"children":5006},{"style":687},[5007],{"type":33,"value":3442},{"type":27,"tag":250,"props":5009,"children":5010},{"class":252,"line":271},[5011,5015,5019,5023,5027,5031,5035,5039,5043,5047,5052],{"type":27,"tag":250,"props":5012,"children":5013},{"style":687},[5014],{"type":33,"value":4590},{"type":27,"tag":250,"props":5016,"children":5017},{"style":681},[5018],{"type":33,"value":1117},{"type":27,"tag":250,"props":5020,"children":5021},{"style":687},[5022],{"type":33,"value":804},{"type":27,"tag":250,"props":5024,"children":5025},{"style":2006},[5026],{"type":33,"value":4995},{"type":27,"tag":250,"props":5028,"children":5029},{"style":687},[5030],{"type":33,"value":2014},{"type":27,"tag":250,"props":5032,"children":5033},{"style":2006},[5034],{"type":33,"value":2069},{"type":27,"tag":250,"props":5036,"children":5037},{"style":687},[5038],{"type":33,"value":1065},{"type":27,"tag":250,"props":5040,"children":5041},{"style":736},[5042],{"type":33,"value":2415},{"type":27,"tag":250,"props":5044,"children":5045},{"style":687},[5046],{"type":33,"value":1065},{"type":27,"tag":250,"props":5048,"children":5049},{"style":736},[5050],{"type":33,"value":5051},"1",{"type":27,"tag":250,"props":5053,"children":5054},{"style":687},[5055],{"type":33,"value":3442},{"type":27,"tag":250,"props":5057,"children":5058},{"class":252,"line":20},[5059,5063,5068,5073,5077,5082,5086,5090],{"type":27,"tag":250,"props":5060,"children":5061},{"style":675},[5062],{"type":33,"value":2905},{"type":27,"tag":250,"props":5064,"children":5065},{"style":687},[5066],{"type":33,"value":5067}," cdn.",{"type":27,"tag":250,"props":5069,"children":5070},{"style":681},[5071],{"type":33,"value":5072},"purge",{"type":27,"tag":250,"props":5074,"children":5075},{"style":687},[5076],{"type":33,"value":804},{"type":27,"tag":250,"props":5078,"children":5079},{"style":2006},[5080],{"type":33,"value":5081},"`/products/${",{"type":27,"tag":250,"props":5083,"children":5084},{"style":687},[5085],{"type":33,"value":2014},{"type":27,"tag":250,"props":5087,"children":5088},{"style":2006},[5089],{"type":33,"value":2069},{"type":27,"tag":250,"props":5091,"children":5092},{"style":687},[5093],{"type":33,"value":3442},{"type":27,"tag":250,"props":5095,"children":5096},{"class":252,"line":287},[5097],{"type":27,"tag":250,"props":5098,"children":5099},{"style":687},[5100],{"type":33,"value":1183},{"type":27,"tag":35,"props":5102,"children":5103},{},[5104],{"type":33,"value":5105},"这里故意展示了一个工程细节：",{"type":27,"tag":97,"props":5107,"children":5108},{},[5109,5114,5119],{"type":27,"tag":101,"props":5110,"children":5111},{},[5112],{"type":33,"value":5113},"Redis 删 key",{"type":27,"tag":101,"props":5115,"children":5116},{},[5117],{"type":33,"value":5118},"本地缓存也要同步清理",{"type":27,"tag":101,"props":5120,"children":5121},{},[5122],{"type":33,"value":5123},"CDN 如果缓存了完整页面，也要一起失效",{"type":27,"tag":35,"props":5125,"children":5126},{},[5127,5129],{"type":33,"value":5128},"多层缓存最常见的问题，不是某层没缓存，而是",{"type":27,"tag":86,"props":5130,"children":5131},{},[5132],{"type":33,"value":5133},"你只删了一层。",{"type":27,"tag":509,"props":5135,"children":5137},{"id":5136},"方式-c版本号失效",[5138],{"type":33,"value":5139},"方式 C：版本号失效",{"type":27,"tag":35,"props":5141,"children":5142},{},[5143],{"type":33,"value":5144},"把 key 设计成：",{"type":27,"tag":240,"props":5146,"children":5148},{"className":242,"code":5147,"language":33,"meta":7,"style":7},"product:v42:detail:1001\n",[5149],{"type":27,"tag":246,"props":5150,"children":5151},{"__ignoreMap":7},[5152],{"type":27,"tag":250,"props":5153,"children":5154},{"class":252,"line":253},[5155],{"type":27,"tag":250,"props":5156,"children":5157},{},[5158],{"type":33,"value":5147},{"type":27,"tag":35,"props":5160,"children":5161},{},[5162],{"type":33,"value":5163},"一旦版本升级，老 key 自然失效，不需要大规模扫描删除。",{"type":27,"tag":35,"props":5165,"children":5166},{},[5167],{"type":33,"value":5168},"这对：",{"type":27,"tag":97,"props":5170,"children":5171},{},[5172,5177,5182],{"type":27,"tag":101,"props":5173,"children":5174},{},[5175],{"type":33,"value":5176},"大批量变更",{"type":27,"tag":101,"props":5178,"children":5179},{},[5180],{"type":33,"value":5181},"高并发发布",{"type":27,"tag":101,"props":5183,"children":5184},{},[5185],{"type":33,"value":5186},"复杂依赖关联",{"type":27,"tag":35,"props":5188,"children":5189},{},[5190],{"type":33,"value":5191},"都非常友好。",{"type":27,"tag":228,"props":5193,"children":5195},{"id":5194},"_92-推荐的-key-设计规则",[5196],{"type":33,"value":5197},"9.2 推荐的 key 设计规则",{"type":27,"tag":35,"props":5199,"children":5200},{},[5201],{"type":33,"value":5202},"至少包含：",{"type":27,"tag":97,"props":5204,"children":5205},{},[5206,5211,5216,5221],{"type":27,"tag":101,"props":5207,"children":5208},{},[5209],{"type":33,"value":5210},"业务域",{"type":27,"tag":101,"props":5212,"children":5213},{},[5214],{"type":33,"value":5215},"对象 ID",{"type":27,"tag":101,"props":5217,"children":5218},{},[5219],{"type":33,"value":5220},"版本或场景",{"type":27,"tag":101,"props":5222,"children":5223},{},[5224],{"type":33,"value":5225},"必要的维度参数",{"type":27,"tag":35,"props":5227,"children":5228},{},[5229],{"type":33,"value":1406},{"type":27,"tag":240,"props":5231,"children":5233},{"className":242,"code":5232,"language":33,"meta":7,"style":7},"feed:home:v3:guest\nproduct:campaign:v2:1001\npermission:user:9381\nsearch:hotwords:cn\n",[5234],{"type":27,"tag":246,"props":5235,"children":5236},{"__ignoreMap":7},[5237,5245,5253,5261],{"type":27,"tag":250,"props":5238,"children":5239},{"class":252,"line":253},[5240],{"type":27,"tag":250,"props":5241,"children":5242},{},[5243],{"type":33,"value":5244},"feed:home:v3:guest\n",{"type":27,"tag":250,"props":5246,"children":5247},{"class":252,"line":262},[5248],{"type":27,"tag":250,"props":5249,"children":5250},{},[5251],{"type":33,"value":5252},"product:campaign:v2:1001\n",{"type":27,"tag":250,"props":5254,"children":5255},{"class":252,"line":271},[5256],{"type":27,"tag":250,"props":5257,"children":5258},{},[5259],{"type":33,"value":5260},"permission:user:9381\n",{"type":27,"tag":250,"props":5262,"children":5263},{"class":252,"line":20},[5264],{"type":27,"tag":250,"props":5265,"children":5266},{},[5267],{"type":33,"value":5268},"search:hotwords:cn\n",{"type":27,"tag":35,"props":5270,"children":5271},{},[5272],{"type":33,"value":5273},"不要把 key 命名写成一团临时字符串。你今天偷懒，三个月后删缓存时会加倍还债。",{"type":27,"tag":178,"props":5275,"children":5276},{},[],{"type":27,"tag":182,"props":5278,"children":5280},{"id":5279},"十缓存命中率不是越高越好要看命中的是什么",[5281],{"type":33,"value":5282},"十、缓存命中率不是越高越好，要看命中的是什么",{"type":27,"tag":35,"props":5284,"children":5285},{},[5286],{"type":33,"value":5287},"团队最喜欢展示一个指标：缓存命中率 95%。",{"type":27,"tag":35,"props":5289,"children":5290},{},[5291],{"type":33,"value":5292},"这个数字当然好看，但经常会误导。",{"type":27,"tag":228,"props":5294,"children":5296},{"id":5295},"_101-为什么高命中率也可能没价值",[5297],{"type":33,"value":5298},"10.1 为什么高命中率也可能没价值",{"type":27,"tag":35,"props":5300,"children":5301},{},[5302],{"type":33,"value":1406},{"type":27,"tag":97,"props":5304,"children":5305},{},[5306,5311,5316,5321],{"type":27,"tag":101,"props":5307,"children":5308},{},[5309],{"type":33,"value":5310},"命中的全是低成本数据",{"type":27,"tag":101,"props":5312,"children":5313},{},[5314],{"type":33,"value":5315},"真正重的热点查询仍然 miss",{"type":27,"tag":101,"props":5317,"children":5318},{},[5319],{"type":33,"value":5320},"个性化请求因维度太多根本缓存不住",{"type":27,"tag":101,"props":5322,"children":5323},{},[5324],{"type":33,"value":5325},"命中的是旧数据，业务效果反而变差",{"type":27,"tag":228,"props":5327,"children":5329},{"id":5328},"_102-更值得看的指标",[5330],{"type":33,"value":5331},"10.2 更值得看的指标",{"type":27,"tag":35,"props":5333,"children":5334},{},[5335],{"type":33,"value":5336},"比起单独看命中率，我更建议同时看：",{"type":27,"tag":1286,"props":5338,"children":5339},{},[5340,5356],{"type":27,"tag":1290,"props":5341,"children":5342},{},[5343],{"type":27,"tag":1294,"props":5344,"children":5345},{},[5346,5351],{"type":27,"tag":1298,"props":5347,"children":5348},{},[5349],{"type":33,"value":5350},"指标",{"type":27,"tag":1298,"props":5352,"children":5353},{},[5354],{"type":33,"value":5355},"价值",{"type":27,"tag":1314,"props":5357,"children":5358},{},[5359,5372,5385,5398,5411,5424],{"type":27,"tag":1294,"props":5360,"children":5361},{},[5362,5367],{"type":27,"tag":1321,"props":5363,"children":5364},{},[5365],{"type":33,"value":5366},"命中率",{"type":27,"tag":1321,"props":5368,"children":5369},{},[5370],{"type":33,"value":5371},"看缓存是否被使用",{"type":27,"tag":1294,"props":5373,"children":5374},{},[5375,5380],{"type":27,"tag":1321,"props":5376,"children":5377},{},[5378],{"type":33,"value":5379},"miss 回源耗时",{"type":27,"tag":1321,"props":5381,"children":5382},{},[5383],{"type":33,"value":5384},"看失败时代价多大",{"type":27,"tag":1294,"props":5386,"children":5387},{},[5388,5393],{"type":27,"tag":1321,"props":5389,"children":5390},{},[5391],{"type":33,"value":5392},"回源 QPS",{"type":27,"tag":1321,"props":5394,"children":5395},{},[5396],{"type":33,"value":5397},"看后端承压情况",{"type":27,"tag":1294,"props":5399,"children":5400},{},[5401,5406],{"type":27,"tag":1321,"props":5402,"children":5403},{},[5404],{"type":33,"value":5405},"热点 key 集中度",{"type":27,"tag":1321,"props":5407,"children":5408},{},[5409],{"type":33,"value":5410},"看风险是否过度集中",{"type":27,"tag":1294,"props":5412,"children":5413},{},[5414,5419],{"type":27,"tag":1321,"props":5415,"children":5416},{},[5417],{"type":33,"value":5418},"失效率峰值",{"type":27,"tag":1321,"props":5420,"children":5421},{},[5422],{"type":33,"value":5423},"看是否存在雪崩风险",{"type":27,"tag":1294,"props":5425,"children":5426},{},[5427,5432],{"type":27,"tag":1321,"props":5428,"children":5429},{},[5430],{"type":33,"value":5431},"降级触发次数",{"type":27,"tag":1321,"props":5433,"children":5434},{},[5435],{"type":33,"value":5436},"看缓存是否承担保护作用",{"type":27,"tag":228,"props":5438,"children":5440},{"id":5439},"_103-一个真实的收益对比",[5441],{"type":33,"value":5442},"10.3 一个真实的收益对比",{"type":27,"tag":35,"props":5444,"children":5445},{},[5446],{"type":33,"value":5447},"某内容站首页做完缓存分层后：",{"type":27,"tag":1286,"props":5449,"children":5450},{},[5451,5472],{"type":27,"tag":1290,"props":5452,"children":5453},{},[5454],{"type":27,"tag":1294,"props":5455,"children":5456},{},[5457,5461,5467],{"type":27,"tag":1298,"props":5458,"children":5459},{},[5460],{"type":33,"value":5350},{"type":27,"tag":1298,"props":5462,"children":5464},{"align":5463},"right",[5465],{"type":33,"value":5466},"优化前",{"type":27,"tag":1298,"props":5468,"children":5469},{"align":5463},[5470],{"type":33,"value":5471},"优化后",{"type":27,"tag":1314,"props":5473,"children":5474},{},[5475,5493,5511,5529,5547,5565],{"type":27,"tag":1294,"props":5476,"children":5477},{},[5478,5483,5488],{"type":27,"tag":1321,"props":5479,"children":5480},{},[5481],{"type":33,"value":5482},"首页 P95",{"type":27,"tag":1321,"props":5484,"children":5485},{"align":5463},[5486],{"type":33,"value":5487},"780ms",{"type":27,"tag":1321,"props":5489,"children":5490},{"align":5463},[5491],{"type":33,"value":5492},"120ms",{"type":27,"tag":1294,"props":5494,"children":5495},{},[5496,5501,5506],{"type":27,"tag":1321,"props":5497,"children":5498},{},[5499],{"type":33,"value":5500},"应用层 QPS",{"type":27,"tag":1321,"props":5502,"children":5503},{"align":5463},[5504],{"type":33,"value":5505},"3200",{"type":27,"tag":1321,"props":5507,"children":5508},{"align":5463},[5509],{"type":33,"value":5510},"900",{"type":27,"tag":1294,"props":5512,"children":5513},{},[5514,5519,5524],{"type":27,"tag":1321,"props":5515,"children":5516},{},[5517],{"type":33,"value":5518},"Redis QPS",{"type":27,"tag":1321,"props":5520,"children":5521},{"align":5463},[5522],{"type":33,"value":5523},"1800",{"type":27,"tag":1321,"props":5525,"children":5526},{"align":5463},[5527],{"type":33,"value":5528},"760",{"type":27,"tag":1294,"props":5530,"children":5531},{},[5532,5537,5542],{"type":27,"tag":1321,"props":5533,"children":5534},{},[5535],{"type":33,"value":5536},"数据库 QPS",{"type":27,"tag":1321,"props":5538,"children":5539},{"align":5463},[5540],{"type":33,"value":5541},"640",{"type":27,"tag":1321,"props":5543,"children":5544},{"align":5463},[5545],{"type":33,"value":5546},"75",{"type":27,"tag":1294,"props":5548,"children":5549},{},[5550,5555,5560],{"type":27,"tag":1321,"props":5551,"children":5552},{},[5553],{"type":33,"value":5554},"高峰 CPU",{"type":27,"tag":1321,"props":5556,"children":5557},{"align":5463},[5558],{"type":33,"value":5559},"82%",{"type":27,"tag":1321,"props":5561,"children":5562},{"align":5463},[5563],{"type":33,"value":5564},"46%",{"type":27,"tag":1294,"props":5566,"children":5567},{},[5568,5573,5578],{"type":27,"tag":1321,"props":5569,"children":5570},{},[5571],{"type":33,"value":5572},"大促前扩容实例数",{"type":27,"tag":1321,"props":5574,"children":5575},{"align":5463},[5576],{"type":33,"value":5577},"18",{"type":27,"tag":1321,"props":5579,"children":5580},{"align":5463},[5581],{"type":33,"value":5582},"10",{"type":27,"tag":35,"props":5584,"children":5585},{},[5586],{"type":33,"value":5587},"你会发现，真正的收益不只是“快了”，而是：",{"type":27,"tag":97,"props":5589,"children":5590},{},[5591,5596,5601,5606],{"type":27,"tag":101,"props":5592,"children":5593},{},[5594],{"type":33,"value":5595},"应用层压力降了",{"type":27,"tag":101,"props":5597,"children":5598},{},[5599],{"type":33,"value":5600},"Redis 压力也降了",{"type":27,"tag":101,"props":5602,"children":5603},{},[5604],{"type":33,"value":5605},"数据库风险更低",{"type":27,"tag":101,"props":5607,"children":5608},{},[5609],{"type":33,"value":5610},"机器成本下降了",{"type":27,"tag":35,"props":5612,"children":5613},{},[5614],{"type":33,"value":5615},"这才叫缓存体系。",{"type":27,"tag":178,"props":5617,"children":5618},{},[],{"type":27,"tag":182,"props":5620,"children":5622},{"id":5621},"十一什么时候不该再继续堆缓存",[5623],{"type":33,"value":5624},"十一、什么时候不该再继续堆缓存",{"type":27,"tag":35,"props":5626,"children":5627},{},[5628],{"type":33,"value":5629},"缓存很好用，但不是万能补丁。",{"type":27,"tag":35,"props":5631,"children":5632},{},[5633],{"type":33,"value":5634},"以下几种情况，继续堆缓存通常是错误方向：",{"type":27,"tag":228,"props":5636,"children":5638},{"id":5637},"_111-底层查询本身已经烂掉",[5639],{"type":33,"value":5640},"11.1 底层查询本身已经烂掉",{"type":27,"tag":35,"props":5642,"children":5643},{},[5644],{"type":33,"value":5645},"如果 miss 一次就要跑 2 秒 SQL，那你真正该做的是先修数据库路径，而不是祈祷缓存永远不 miss。",{"type":27,"tag":228,"props":5647,"children":5649},{"id":5648},"_112-数据更新频率远高于读取频率",[5650],{"type":33,"value":5651},"11.2 数据更新频率远高于读取频率",{"type":27,"tag":35,"props":5653,"children":5654},{},[5655],{"type":33,"value":5656},"这时缓存不断失效、不断重建，收益有限，甚至负收益。",{"type":27,"tag":228,"props":5658,"children":5660},{"id":5659},"_113-个性化维度太多",[5661],{"type":33,"value":5662},"11.3 个性化维度太多",{"type":27,"tag":35,"props":5664,"children":5665},{},[5666],{"type":33,"value":5667},"比如：",{"type":27,"tag":97,"props":5669,"children":5670},{},[5671,5676,5681,5686,5691,5696],{"type":27,"tag":101,"props":5672,"children":5673},{},[5674],{"type":33,"value":5675},"用户等级",{"type":27,"tag":101,"props":5677,"children":5678},{},[5679],{"type":33,"value":5680},"地区",{"type":27,"tag":101,"props":5682,"children":5683},{},[5684],{"type":33,"value":5685},"设备类型",{"type":27,"tag":101,"props":5687,"children":5688},{},[5689],{"type":33,"value":5690},"渠道来源",{"type":27,"tag":101,"props":5692,"children":5693},{},[5694],{"type":33,"value":5695},"实验桶",{"type":27,"tag":101,"props":5697,"children":5698},{},[5699],{"type":33,"value":5700},"实时活动资格",{"type":27,"tag":35,"props":5702,"children":5703},{},[5704],{"type":33,"value":5705},"一旦这些维度组合起来，key 爆炸会迅速吃掉缓存系统。",{"type":27,"tag":228,"props":5707,"children":5709},{"id":5708},"_114-团队没有治理能力",[5710],{"type":33,"value":5711},"11.4 团队没有治理能力",{"type":27,"tag":35,"props":5713,"children":5714},{},[5715],{"type":33,"value":5716},"如果没有：",{"type":27,"tag":97,"props":5718,"children":5719},{},[5720,5725,5730,5735,5740],{"type":27,"tag":101,"props":5721,"children":5722},{},[5723],{"type":33,"value":5724},"统一 key 规范",{"type":27,"tag":101,"props":5726,"children":5727},{},[5728],{"type":33,"value":5729},"缓存监控",{"type":27,"tag":101,"props":5731,"children":5732},{},[5733],{"type":33,"value":5734},"失效流程",{"type":27,"tag":101,"props":5736,"children":5737},{},[5738],{"type":33,"value":5739},"热点保护机制",{"type":27,"tag":101,"props":5741,"children":5742},{},[5743],{"type":33,"value":5744},"回源告警",{"type":27,"tag":35,"props":5746,"children":5747},{},[5748],{"type":33,"value":5749},"那缓存层越复杂，系统越不可控。",{"type":27,"tag":35,"props":5751,"children":5752},{},[5753],{"type":33,"value":5754},"复杂度本身就是成本。",{"type":27,"tag":178,"props":5756,"children":5757},{},[],{"type":27,"tag":182,"props":5759,"children":5761},{"id":5760},"十二一套可执行的缓存分层落地步骤",[5762],{"type":33,"value":5763},"十二、一套可执行的缓存分层落地步骤",{"type":27,"tag":35,"props":5765,"children":5766},{},[5767],{"type":33,"value":5768},"如果你现在要在团队里推一套缓存体系，我建议按这个顺序来。",{"type":27,"tag":228,"props":5770,"children":5772},{"id":5771},"第-1-步先画数据分层表",[5773],{"type":33,"value":5774},"第 1 步：先画数据分层表",{"type":27,"tag":35,"props":5776,"children":5777},{},[5778],{"type":33,"value":5779},"把核心接口里的数据按下面方式拆出来：",{"type":27,"tag":1286,"props":5781,"children":5782},{},[5783,5812],{"type":27,"tag":1290,"props":5784,"children":5785},{},[5786],{"type":27,"tag":1294,"props":5787,"children":5788},{},[5789,5794,5799,5803,5807],{"type":27,"tag":1298,"props":5790,"children":5791},{},[5792],{"type":33,"value":5793},"数据项",{"type":27,"tag":1298,"props":5795,"children":5796},{},[5797],{"type":33,"value":5798},"是否个性化",{"type":27,"tag":1298,"props":5800,"children":5801},{},[5802],{"type":33,"value":1325},{"type":27,"tag":1298,"props":5804,"children":5805},{},[5806],{"type":33,"value":1343},{"type":27,"tag":1298,"props":5808,"children":5809},{},[5810],{"type":33,"value":5811},"推荐缓存层",{"type":27,"tag":1314,"props":5813,"children":5814},{},[5815,5842,5867,5893],{"type":27,"tag":1294,"props":5816,"children":5817},{},[5818,5823,5828,5833,5838],{"type":27,"tag":1321,"props":5819,"children":5820},{},[5821],{"type":33,"value":5822},"商品标题/图片",{"type":27,"tag":1321,"props":5824,"children":5825},{},[5826],{"type":33,"value":5827},"否",{"type":27,"tag":1321,"props":5829,"children":5830},{},[5831],{"type":33,"value":5832},"低",{"type":27,"tag":1321,"props":5834,"children":5835},{},[5836],{"type":33,"value":5837},"中",{"type":27,"tag":1321,"props":5839,"children":5840},{},[5841],{"type":33,"value":1663},{"type":27,"tag":1294,"props":5843,"children":5844},{},[5845,5850,5854,5858,5862],{"type":27,"tag":1321,"props":5846,"children":5847},{},[5848],{"type":33,"value":5849},"活动标签",{"type":27,"tag":1321,"props":5851,"children":5852},{},[5853],{"type":33,"value":5827},{"type":27,"tag":1321,"props":5855,"children":5856},{},[5857],{"type":33,"value":5837},{"type":27,"tag":1321,"props":5859,"children":5860},{},[5861],{"type":33,"value":5837},{"type":27,"tag":1321,"props":5863,"children":5864},{},[5865],{"type":33,"value":5866},"CDN 短缓存 + Redis",{"type":27,"tag":1294,"props":5868,"children":5869},{},[5870,5875,5880,5884,5889],{"type":27,"tag":1321,"props":5871,"children":5872},{},[5873],{"type":33,"value":5874},"会员价",{"type":27,"tag":1321,"props":5876,"children":5877},{},[5878],{"type":33,"value":5879},"是",{"type":27,"tag":1321,"props":5881,"children":5882},{},[5883],{"type":33,"value":5837},{"type":27,"tag":1321,"props":5885,"children":5886},{},[5887],{"type":33,"value":5888},"中高",{"type":27,"tag":1321,"props":5890,"children":5891},{},[5892],{"type":33,"value":1518},{"type":27,"tag":1294,"props":5894,"children":5895},{},[5896,5900,5905,5910,5914],{"type":27,"tag":1321,"props":5897,"children":5898},{},[5899],{"type":33,"value":1536},{"type":27,"tag":1321,"props":5901,"children":5902},{},[5903],{"type":33,"value":5904},"否/半个性化",{"type":27,"tag":1321,"props":5906,"children":5907},{},[5908],{"type":33,"value":5909},"高",{"type":27,"tag":1321,"props":5911,"children":5912},{},[5913],{"type":33,"value":5909},{"type":27,"tag":1321,"props":5915,"children":5916},{},[5917],{"type":33,"value":5918},"直查 / 超短缓存",{"type":27,"tag":228,"props":5920,"children":5922},{"id":5921},"第-2-步先做最值钱的一层",[5923],{"type":33,"value":5924},"第 2 步：先做最值钱的一层",{"type":27,"tag":35,"props":5926,"children":5927},{},[5928],{"type":33,"value":5929},"不是所有层都要一次性上齐。",{"type":27,"tag":35,"props":5931,"children":5932},{},[5933],{"type":33,"value":5934},"通常收益顺序是：",{"type":27,"tag":144,"props":5936,"children":5937},{},[5938,5943,5948,5953,5958],{"type":27,"tag":101,"props":5939,"children":5940},{},[5941],{"type":33,"value":5942},"静态资源长缓存",{"type":27,"tag":101,"props":5944,"children":5945},{},[5946],{"type":33,"value":5947},"热点接口 Redis 缓存",{"type":27,"tag":101,"props":5949,"children":5950},{},[5951],{"type":33,"value":5952},"热点对象本地缓存",{"type":27,"tag":101,"props":5954,"children":5955},{},[5956],{"type":33,"value":5957},"CDN 边缘缓存",{"type":27,"tag":101,"props":5959,"children":5960},{},[5961],{"type":33,"value":5962},"预热、刷新、自动降级",{"type":27,"tag":228,"props":5964,"children":5966},{"id":5965},"第-3-步先补防护再追命中率",[5967],{"type":33,"value":5968},"第 3 步：先补防护，再追命中率",{"type":27,"tag":35,"props":5970,"children":5971},{},[5972],{"type":33,"value":5973},"先保证：",{"type":27,"tag":97,"props":5975,"children":5976},{},[5977,5982,5987,5992],{"type":27,"tag":101,"props":5978,"children":5979},{},[5980],{"type":33,"value":5981},"miss 不会打穿后端",{"type":27,"tag":101,"props":5983,"children":5984},{},[5985],{"type":33,"value":5986},"热点 key 有保护",{"type":27,"tag":101,"props":5988,"children":5989},{},[5990],{"type":33,"value":5991},"TTL 有抖动",{"type":27,"tag":101,"props":5993,"children":5994},{},[5995],{"type":33,"value":5996},"失败有降级兜底",{"type":27,"tag":35,"props":5998,"children":5999},{},[6000],{"type":33,"value":6001},"命中率优化可以后做，防故障必须先做。",{"type":27,"tag":228,"props":6003,"children":6005},{"id":6004},"第-4-步给每一层明确所有权",[6006],{"type":33,"value":6007},"第 4 步：给每一层明确所有权",{"type":27,"tag":35,"props":6009,"children":6010},{},[6011],{"type":33,"value":6012},"这是组织层很容易忽略的一点。",{"type":27,"tag":35,"props":6014,"children":6015},{},[6016],{"type":33,"value":6017},"建议明确：",{"type":27,"tag":97,"props":6019,"children":6020},{},[6021,6026,6031,6036],{"type":27,"tag":101,"props":6022,"children":6023},{},[6024],{"type":33,"value":6025},"前端负责浏览器缓存与静态资源版本化",{"type":27,"tag":101,"props":6027,"children":6028},{},[6029],{"type":33,"value":6030},"平台 / 网关团队负责 CDN 策略",{"type":27,"tag":101,"props":6032,"children":6033},{},[6034],{"type":33,"value":6035},"应用团队负责本地缓存与 Redis key 设计",{"type":27,"tag":101,"props":6037,"children":6038},{},[6039],{"type":33,"value":6040},"数据团队负责回源容量评估",{"type":27,"tag":35,"props":6042,"children":6043},{},[6044],{"type":33,"value":6045},"缓存体系如果人人都能改，最后往往等于没人负责。",{"type":27,"tag":178,"props":6047,"children":6048},{},[],{"type":27,"tag":182,"props":6050,"children":6052},{"id":6051},"十三给团队的缓存分层检查清单",[6053],{"type":33,"value":6054},"十三、给团队的缓存分层检查清单",{"type":27,"tag":228,"props":6056,"children":6058},{"id":6057},"浏览器-cdn-层",[6059],{"type":33,"value":6060},"浏览器 / CDN 层",{"type":27,"tag":97,"props":6062,"children":6065},{"className":6063},[6064],"contains-task-list",[6066,6078,6087,6096],{"type":27,"tag":101,"props":6067,"children":6070},{"className":6068},[6069],"task-list-item",[6071,6076],{"type":27,"tag":6072,"props":6073,"children":6075},"input",{"disabled":18,"type":6074},"checkbox",[],{"type":33,"value":6077}," 静态资源是否带 hash 并设置长缓存",{"type":27,"tag":101,"props":6079,"children":6081},{"className":6080},[6069],[6082,6085],{"type":27,"tag":6072,"props":6083,"children":6084},{"disabled":18,"type":6074},[],{"type":33,"value":6086}," HTML / 弱动态内容是否区分缓存策略",{"type":27,"tag":101,"props":6088,"children":6090},{"className":6089},[6069],[6091,6094],{"type":27,"tag":6072,"props":6092,"children":6093},{"disabled":18,"type":6074},[],{"type":33,"value":6095}," 是否明确了 CDN 回源路径",{"type":27,"tag":101,"props":6097,"children":6099},{"className":6098},[6069],[6100,6103],{"type":27,"tag":6072,"props":6101,"children":6102},{"disabled":18,"type":6074},[],{"type":33,"value":6104}," 是否支持按页面或路径主动失效",{"type":27,"tag":228,"props":6106,"children":6108},{"id":6107},"应用层-本地缓存层",[6109],{"type":33,"value":6110},"应用层 / 本地缓存层",{"type":27,"tag":97,"props":6112,"children":6114},{"className":6113},[6064],[6115,6124,6133,6142],{"type":27,"tag":101,"props":6116,"children":6118},{"className":6117},[6069],[6119,6122],{"type":27,"tag":6072,"props":6120,"children":6121},{"disabled":18,"type":6074},[],{"type":33,"value":6123}," 本地缓存是否只缓存高频热点和轻量对象",{"type":27,"tag":101,"props":6125,"children":6127},{"className":6126},[6069],[6128,6131],{"type":27,"tag":6072,"props":6129,"children":6130},{"disabled":18,"type":6074},[],{"type":33,"value":6132}," 是否设置了较短 TTL",{"type":27,"tag":101,"props":6134,"children":6136},{"className":6135},[6069],[6137,6140],{"type":27,"tag":6072,"props":6138,"children":6139},{"disabled":18,"type":6074},[],{"type":33,"value":6141}," 实例扩缩容后是否能接受短暂不一致",{"type":27,"tag":101,"props":6143,"children":6145},{"className":6144},[6069],[6146,6149],{"type":27,"tag":6072,"props":6147,"children":6148},{"disabled":18,"type":6074},[],{"type":33,"value":6150}," 是否有内存上限和淘汰策略",{"type":27,"tag":228,"props":6152,"children":6154},{"id":6153},"redis-层",[6155],{"type":33,"value":6156},"Redis 层",{"type":27,"tag":97,"props":6158,"children":6160},{"className":6159},[6064],[6161,6170,6179,6188,6197],{"type":27,"tag":101,"props":6162,"children":6164},{"className":6163},[6069],[6165,6168],{"type":27,"tag":6072,"props":6166,"children":6167},{"disabled":18,"type":6074},[],{"type":33,"value":6169}," key 命名是否统一",{"type":27,"tag":101,"props":6171,"children":6173},{"className":6172},[6069],[6174,6177],{"type":27,"tag":6072,"props":6175,"children":6176},{"disabled":18,"type":6074},[],{"type":33,"value":6178}," TTL 是否带随机抖动",{"type":27,"tag":101,"props":6180,"children":6182},{"className":6181},[6069],[6183,6186],{"type":27,"tag":6072,"props":6184,"children":6185},{"disabled":18,"type":6074},[],{"type":33,"value":6187}," 是否有热点 key 保护",{"type":27,"tag":101,"props":6189,"children":6191},{"className":6190},[6069],[6192,6195],{"type":27,"tag":6072,"props":6193,"children":6194},{"disabled":18,"type":6074},[],{"type":33,"value":6196}," 是否缓存空值防穿透",{"type":27,"tag":101,"props":6198,"children":6200},{"className":6199},[6069],[6201,6204],{"type":27,"tag":6072,"props":6202,"children":6203},{"disabled":18,"type":6074},[],{"type":33,"value":6205}," 是否监控命中率、回源 QPS、内存与淘汰",{"type":27,"tag":228,"props":6207,"children":6209},{"id":6208},"工程治理层",[6210],{"type":33,"value":6208},{"type":27,"tag":97,"props":6212,"children":6214},{"className":6213},[6064],[6215,6224,6233,6242,6251],{"type":27,"tag":101,"props":6216,"children":6218},{"className":6217},[6069],[6219,6222],{"type":27,"tag":6072,"props":6220,"children":6221},{"disabled":18,"type":6074},[],{"type":33,"value":6223}," 是否明确哪些数据不允许缓存",{"type":27,"tag":101,"props":6225,"children":6227},{"className":6226},[6069],[6228,6231],{"type":27,"tag":6072,"props":6229,"children":6230},{"disabled":18,"type":6074},[],{"type":33,"value":6232}," 是否能把接口耗时拆到各缓存层",{"type":27,"tag":101,"props":6234,"children":6236},{"className":6235},[6069],[6237,6240],{"type":27,"tag":6072,"props":6238,"children":6239},{"disabled":18,"type":6074},[],{"type":33,"value":6241}," 是否有缓存失效操作手册",{"type":27,"tag":101,"props":6243,"children":6245},{"className":6244},[6069],[6246,6249],{"type":27,"tag":6072,"props":6247,"children":6248},{"disabled":18,"type":6074},[],{"type":33,"value":6250}," 是否有降级与回源告警",{"type":27,"tag":101,"props":6252,"children":6254},{"className":6253},[6069],[6255,6258],{"type":27,"tag":6072,"props":6256,"children":6257},{"disabled":18,"type":6074},[],{"type":33,"value":6259}," 是否定期清理废弃 key 和无效策略",{"type":27,"tag":178,"props":6261,"children":6262},{},[],{"type":27,"tag":182,"props":6264,"children":6266},{"id":6265},"总结",[6267],{"type":33,"value":6265},{"type":27,"tag":35,"props":6269,"children":6270},{},[6271],{"type":33,"value":6272},"把缓存分层这件事讲透，可以收敛成 5 句话：",{"type":27,"tag":144,"props":6274,"children":6275},{},[6276,6286,6296,6306,6316],{"type":27,"tag":101,"props":6277,"children":6278},{},[6279,6284],{"type":27,"tag":86,"props":6280,"children":6281},{},[6282],{"type":33,"value":6283},"缓存不是单点工具，而是逐层拦截流量的系统。",{"type":33,"value":6285}," 越靠前拦住，收益越大。",{"type":27,"tag":101,"props":6287,"children":6288},{},[6289,6294],{"type":27,"tag":86,"props":6290,"children":6291},{},[6292],{"type":33,"value":6293},"本地缓存、Redis、CDN 的职责不同。",{"type":33,"value":6295}," 不要让一层去承担另一层的工作。",{"type":27,"tag":101,"props":6297,"children":6298},{},[6299,6304],{"type":27,"tag":86,"props":6300,"children":6301},{},[6302],{"type":33,"value":6303},"缓存最难的不是命中，而是失效。",{"type":33,"value":6305}," 真正的稳定性来自回源保护、主动刷新和一致性边界。",{"type":27,"tag":101,"props":6307,"children":6308},{},[6309,6314],{"type":27,"tag":86,"props":6310,"children":6311},{},[6312],{"type":33,"value":6313},"热点保护比“平均命中率”更重要。",{"type":33,"value":6315}," 系统大多死在热点 key 失效的那一分钟。",{"type":27,"tag":101,"props":6317,"children":6318},{},[6319,6324],{"type":27,"tag":86,"props":6320,"children":6321},{},[6322],{"type":33,"value":6323},"缓存只是手段，不是遮羞布。",{"type":33,"value":6325}," 如果数据库和下游链路本身不健康，缓存只能延迟爆炸。",{"type":27,"tag":35,"props":6327,"children":6328},{},[6329],{"type":33,"value":6330},"如果你只记住一句话，我希望是这一句：",{"type":27,"tag":41,"props":6332,"children":6333},{},[6334],{"type":27,"tag":35,"props":6335,"children":6336},{},[6337],{"type":33,"value":6338},"好的缓存分层，不是让每一层都很忙，而是让最贵的那一层尽量没机会出场。",{"type":27,"tag":35,"props":6340,"children":6341},{},[6342],{"type":33,"value":6343},"程序员常说，世界上最难的两件事是：缓存失效和命名。",{"type":27,"tag":35,"props":6345,"children":6346},{},[6347],{"type":33,"value":6348},"真到线上你会发现，还得加第三件：",{"type":27,"tag":35,"props":6350,"children":6351},{},[6352],{"type":27,"tag":86,"props":6353,"children":6354},{},[6355],{"type":33,"value":6356},"在所有人都说“先加一层缓存”时，仍然保持清醒。",{"type":27,"tag":6358,"props":6359,"children":6360},"style",{},[6361],{"type":33,"value":6362},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":271,"depth":271,"links":6364},[6365,6369,6377,6385,6389,6396,6408,6413,6418,6426,6431,6437,6443,6449],{"id":184,"depth":262,"text":187,"children":6366},[6367,6368],{"id":230,"depth":271,"text":233},{"id":391,"depth":271,"text":394},{"id":433,"depth":262,"text":436,"children":6370},[6371,6374,6375,6376],{"id":439,"depth":271,"text":442,"children":6372},[6373],{"id":511,"depth":20,"text":511},{"id":547,"depth":271,"text":550},{"id":614,"depth":271,"text":617},{"id":1216,"depth":271,"text":1219},{"id":1276,"depth":262,"text":1279,"children":6378},[6379],{"id":1392,"depth":271,"text":1395,"children":6380},[6381,6382,6383,6384],{"id":1398,"depth":20,"text":1401},{"id":1437,"depth":20,"text":1440},{"id":1479,"depth":20,"text":1482},{"id":1521,"depth":20,"text":1524},{"id":1571,"depth":262,"text":1574,"children":6386},[6387,6388],{"id":1582,"depth":271,"text":1585},{"id":1724,"depth":271,"text":1727},{"id":2584,"depth":262,"text":6390,"children":6391},"五、缓存读写策略，别只会 cache aside",[6392,6393,6394,6395],{"id":2632,"depth":271,"text":2635},{"id":2987,"depth":271,"text":2990},{"id":3034,"depth":271,"text":3037},{"id":3081,"depth":271,"text":3084},{"id":3117,"depth":262,"text":3120,"children":6397},[6398,6401,6404,6407],{"id":3123,"depth":271,"text":3126,"children":6399},[6400],{"id":3139,"depth":20,"text":3139},{"id":3542,"depth":271,"text":3545,"children":6402},[6403],{"id":3553,"depth":20,"text":3139},{"id":3930,"depth":271,"text":3933,"children":6405},[6406],{"id":3946,"depth":20,"text":3139},{"id":3974,"depth":271,"text":3977},{"id":4034,"depth":262,"text":4037,"children":6409},[6410,6411,6412],{"id":4045,"depth":271,"text":4048},{"id":4093,"depth":271,"text":4096},{"id":4651,"depth":271,"text":4654},{"id":4683,"depth":262,"text":4686,"children":6414},[6415,6416,6417],{"id":4699,"depth":271,"text":4702},{"id":4733,"depth":271,"text":4736},{"id":4777,"depth":271,"text":4780},{"id":4846,"depth":262,"text":4849,"children":6419},[6420,6425],{"id":4857,"depth":271,"text":4860,"children":6421},[6422,6423,6424],{"id":4863,"depth":20,"text":4866},{"id":4897,"depth":20,"text":4900},{"id":5136,"depth":20,"text":5139},{"id":5194,"depth":271,"text":5197},{"id":5279,"depth":262,"text":5282,"children":6427},[6428,6429,6430],{"id":5295,"depth":271,"text":5298},{"id":5328,"depth":271,"text":5331},{"id":5439,"depth":271,"text":5442},{"id":5621,"depth":262,"text":5624,"children":6432},[6433,6434,6435,6436],{"id":5637,"depth":271,"text":5640},{"id":5648,"depth":271,"text":5651},{"id":5659,"depth":271,"text":5662},{"id":5708,"depth":271,"text":5711},{"id":5760,"depth":262,"text":5763,"children":6438},[6439,6440,6441,6442],{"id":5771,"depth":271,"text":5774},{"id":5921,"depth":271,"text":5924},{"id":5965,"depth":271,"text":5968},{"id":6004,"depth":271,"text":6007},{"id":6051,"depth":262,"text":6054,"children":6444},[6445,6446,6447,6448],{"id":6057,"depth":271,"text":6060},{"id":6107,"depth":271,"text":6110},{"id":6153,"depth":271,"text":6156},{"id":6208,"depth":271,"text":6208},{"id":6265,"depth":262,"text":6265},"markdown","content:topics:engineering:cache-layering-local-redis-cdn-guide.md","content","topics/engineering/cache-layering-local-redis-cdn-guide.md","topics/engineering/cache-layering-local-redis-cdn-guide","md",1777109948370]