[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"dev-typescript-advanced-patterns":3,"dev-all":674},{"id":4,"title":5,"body":6,"category":660,"date":661,"description":662,"extension":663,"meta":664,"navigation":127,"path":665,"readTime":666,"seo":667,"stem":668,"tags":669,"__hash__":673},"dev\u002Fdev\u002Ftypescript-advanced-patterns.md","TypeScript Patterns That Actually Ship",{"type":7,"value":8,"toc":655},"minimark",[9,18,23,222,229,233,496,503,507,639,646,651],[10,11,12,13,17],"p",{},"TypeScript gets called verbose when people fight the type system instead of working ",[14,15,16],"em",{},"with"," it. These three patterns flipped that script for me.",[19,20,22],"h2",{"id":21},"discriminated-unions-for-api-responses","Discriminated Unions for API Responses",[24,25,30],"pre",{"className":26,"code":27,"language":28,"meta":29,"style":29},"language-typescript shiki shiki-themes github-light github-dark","type ApiResponse\u003CT> = \n  | { success: true; data: T }\n  | { success: false; error: string }\n\nconst response: ApiResponse\u003CUser> = await fetchUser()\n\nif (response.success) {\n  \u002F\u002F TypeScript knows response.data is User\n  response.data.email\n} else {\n  \u002F\u002F TypeScript knows response.error exists\n  console.error(response.error)\n}\n","typescript","",[31,32,33,62,96,122,129,160,165,174,181,187,199,205,216],"code",{"__ignoreMap":29},[34,35,38,42,46,50,53,56,59],"span",{"class":36,"line":37},"line",1,[34,39,41],{"class":40},"szBVR","type",[34,43,45],{"class":44},"sScJk"," ApiResponse",[34,47,49],{"class":48},"sVt8B","\u003C",[34,51,52],{"class":44},"T",[34,54,55],{"class":48},"> ",[34,57,58],{"class":40},"=",[34,60,61],{"class":48}," \n",[34,63,65,68,71,75,78,82,85,88,90,93],{"class":36,"line":64},2,[34,66,67],{"class":40},"  |",[34,69,70],{"class":48}," { ",[34,72,74],{"class":73},"s4XuR","success",[34,76,77],{"class":40},":",[34,79,81],{"class":80},"sj4cs"," true",[34,83,84],{"class":48},"; ",[34,86,87],{"class":73},"data",[34,89,77],{"class":40},[34,91,92],{"class":44}," T",[34,94,95],{"class":48}," }\n",[34,97,99,101,103,105,107,110,112,115,117,120],{"class":36,"line":98},3,[34,100,67],{"class":40},[34,102,70],{"class":48},[34,104,74],{"class":73},[34,106,77],{"class":40},[34,108,109],{"class":80}," false",[34,111,84],{"class":48},[34,113,114],{"class":73},"error",[34,116,77],{"class":40},[34,118,119],{"class":80}," string",[34,121,95],{"class":48},[34,123,125],{"class":36,"line":124},4,[34,126,128],{"emptyLinePlaceholder":127},true,"\n",[34,130,132,135,138,140,142,144,147,149,151,154,157],{"class":36,"line":131},5,[34,133,134],{"class":40},"const",[34,136,137],{"class":80}," response",[34,139,77],{"class":40},[34,141,45],{"class":44},[34,143,49],{"class":48},[34,145,146],{"class":44},"User",[34,148,55],{"class":48},[34,150,58],{"class":40},[34,152,153],{"class":40}," await",[34,155,156],{"class":44}," fetchUser",[34,158,159],{"class":48},"()\n",[34,161,163],{"class":36,"line":162},6,[34,164,128],{"emptyLinePlaceholder":127},[34,166,168,171],{"class":36,"line":167},7,[34,169,170],{"class":40},"if",[34,172,173],{"class":48}," (response.success) {\n",[34,175,177],{"class":36,"line":176},8,[34,178,180],{"class":179},"sJ8bj","  \u002F\u002F TypeScript knows response.data is User\n",[34,182,184],{"class":36,"line":183},9,[34,185,186],{"class":48},"  response.data.email\n",[34,188,190,193,196],{"class":36,"line":189},10,[34,191,192],{"class":48},"} ",[34,194,195],{"class":40},"else",[34,197,198],{"class":48}," {\n",[34,200,202],{"class":36,"line":201},11,[34,203,204],{"class":179},"  \u002F\u002F TypeScript knows response.error exists\n",[34,206,208,211,213],{"class":36,"line":207},12,[34,209,210],{"class":48},"  console.",[34,212,114],{"class":44},[34,214,215],{"class":48},"(response.error)\n",[34,217,219],{"class":36,"line":218},13,[34,220,221],{"class":48},"}\n",[10,223,224,225,228],{},"No more ",[31,226,227],{},"if (response.error)"," guesswork. The compiler guards every branch.",[19,230,232],{"id":231},"generic-composables-in-vue","Generic Composables in Vue",[24,234,236],{"className":26,"code":235,"language":28,"meta":29,"style":29},"\u002F\u002F composables\u002FuseFetch.ts\nexport const useFetch = \u003CT>() => {\n  const data = ref\u003CT | null>(null)\n  const error = ref\u003Cstring | null>(null)\n  \n  const fetch = async (url: string) => {\n    const res = await fetch(url)\n    if (!res.ok) {\n      error.value = 'Failed'\n      return\n    }\n    data.value = await res.json() as T\n  }\n  \n  return { data, error, fetch }\n}\n\n\u002F\u002F Usage knows the exact return type\nconst { data } = useFetch\u003CUserProfile>()\n",[31,237,238,243,270,302,328,333,362,379,392,403,408,413,437,442,447,456,461,466,472],{"__ignoreMap":29},[34,239,240],{"class":36,"line":37},[34,241,242],{"class":179},"\u002F\u002F composables\u002FuseFetch.ts\n",[34,244,245,248,251,254,257,260,262,265,268],{"class":36,"line":64},[34,246,247],{"class":40},"export",[34,249,250],{"class":40}," const",[34,252,253],{"class":44}," useFetch",[34,255,256],{"class":40}," =",[34,258,259],{"class":48}," \u003C",[34,261,52],{"class":44},[34,263,264],{"class":48},">() ",[34,266,267],{"class":40},"=>",[34,269,198],{"class":48},[34,271,272,275,278,280,283,285,287,290,293,296,299],{"class":36,"line":98},[34,273,274],{"class":40},"  const",[34,276,277],{"class":80}," data",[34,279,256],{"class":40},[34,281,282],{"class":44}," ref",[34,284,49],{"class":48},[34,286,52],{"class":44},[34,288,289],{"class":40}," |",[34,291,292],{"class":80}," null",[34,294,295],{"class":48},">(",[34,297,298],{"class":80},"null",[34,300,301],{"class":48},")\n",[34,303,304,306,309,311,313,315,318,320,322,324,326],{"class":36,"line":124},[34,305,274],{"class":40},[34,307,308],{"class":80}," error",[34,310,256],{"class":40},[34,312,282],{"class":44},[34,314,49],{"class":48},[34,316,317],{"class":80},"string",[34,319,289],{"class":40},[34,321,292],{"class":80},[34,323,295],{"class":48},[34,325,298],{"class":80},[34,327,301],{"class":48},[34,329,330],{"class":36,"line":131},[34,331,332],{"class":48},"  \n",[34,334,335,337,340,342,345,348,351,353,355,358,360],{"class":36,"line":162},[34,336,274],{"class":40},[34,338,339],{"class":44}," fetch",[34,341,256],{"class":40},[34,343,344],{"class":40}," async",[34,346,347],{"class":48}," (",[34,349,350],{"class":73},"url",[34,352,77],{"class":40},[34,354,119],{"class":80},[34,356,357],{"class":48},") ",[34,359,267],{"class":40},[34,361,198],{"class":48},[34,363,364,367,370,372,374,376],{"class":36,"line":167},[34,365,366],{"class":40},"    const",[34,368,369],{"class":80}," res",[34,371,256],{"class":40},[34,373,153],{"class":40},[34,375,339],{"class":44},[34,377,378],{"class":48},"(url)\n",[34,380,381,384,386,389],{"class":36,"line":176},[34,382,383],{"class":40},"    if",[34,385,347],{"class":48},[34,387,388],{"class":40},"!",[34,390,391],{"class":48},"res.ok) {\n",[34,393,394,397,399],{"class":36,"line":183},[34,395,396],{"class":48},"      error.value ",[34,398,58],{"class":40},[34,400,402],{"class":401},"sZZnC"," 'Failed'\n",[34,404,405],{"class":36,"line":189},[34,406,407],{"class":40},"      return\n",[34,409,410],{"class":36,"line":201},[34,411,412],{"class":48},"    }\n",[34,414,415,418,420,422,425,428,431,434],{"class":36,"line":207},[34,416,417],{"class":48},"    data.value ",[34,419,58],{"class":40},[34,421,153],{"class":40},[34,423,424],{"class":48}," res.",[34,426,427],{"class":44},"json",[34,429,430],{"class":48},"() ",[34,432,433],{"class":40},"as",[34,435,436],{"class":44}," T\n",[34,438,439],{"class":36,"line":218},[34,440,441],{"class":48},"  }\n",[34,443,445],{"class":36,"line":444},14,[34,446,332],{"class":48},[34,448,450,453],{"class":36,"line":449},15,[34,451,452],{"class":40},"  return",[34,454,455],{"class":48}," { data, error, fetch }\n",[34,457,459],{"class":36,"line":458},16,[34,460,221],{"class":48},[34,462,464],{"class":36,"line":463},17,[34,465,128],{"emptyLinePlaceholder":127},[34,467,469],{"class":36,"line":468},18,[34,470,471],{"class":179},"\u002F\u002F Usage knows the exact return type\n",[34,473,475,477,479,481,484,486,488,490,493],{"class":36,"line":474},19,[34,476,134],{"class":40},[34,478,70],{"class":48},[34,480,87],{"class":80},[34,482,483],{"class":48}," } ",[34,485,58],{"class":40},[34,487,253],{"class":44},[34,489,49],{"class":48},[34,491,492],{"class":44},"UserProfile",[34,494,495],{"class":48},">()\n",[10,497,498,499,502],{},"20 lines upfront, zero ",[31,500,501],{},"any"," debugging later.",[19,504,506],{"id":505},"zod-at-the-boundary","Zod at the Boundary",[24,508,510],{"className":26,"code":509,"language":28,"meta":29,"style":29},"const userSchema = z.object({\n  id: z.number(),\n  email: z.string().email(),\n  name: z.string()\n})\n\nconst response = await fetch('\u002Fapi\u002Fuser')\nconst user = userSchema.parse(await response.json())\n\n\u002F\u002F Everything past this point is 100% typed\nuser.email \u002F\u002F string, guaranteed\n",[31,511,512,530,541,556,565,570,574,594,622,626,631],{"__ignoreMap":29},[34,513,514,516,519,521,524,527],{"class":36,"line":37},[34,515,134],{"class":40},[34,517,518],{"class":80}," userSchema",[34,520,256],{"class":40},[34,522,523],{"class":48}," z.",[34,525,526],{"class":44},"object",[34,528,529],{"class":48},"({\n",[34,531,532,535,538],{"class":36,"line":64},[34,533,534],{"class":48},"  id: z.",[34,536,537],{"class":44},"number",[34,539,540],{"class":48},"(),\n",[34,542,543,546,548,551,554],{"class":36,"line":98},[34,544,545],{"class":48},"  email: z.",[34,547,317],{"class":44},[34,549,550],{"class":48},"().",[34,552,553],{"class":44},"email",[34,555,540],{"class":48},[34,557,558,561,563],{"class":36,"line":124},[34,559,560],{"class":48},"  name: z.",[34,562,317],{"class":44},[34,564,159],{"class":48},[34,566,567],{"class":36,"line":131},[34,568,569],{"class":48},"})\n",[34,571,572],{"class":36,"line":162},[34,573,128],{"emptyLinePlaceholder":127},[34,575,576,578,580,582,584,586,589,592],{"class":36,"line":167},[34,577,134],{"class":40},[34,579,137],{"class":80},[34,581,256],{"class":40},[34,583,153],{"class":40},[34,585,339],{"class":44},[34,587,588],{"class":48},"(",[34,590,591],{"class":401},"'\u002Fapi\u002Fuser'",[34,593,301],{"class":48},[34,595,596,598,601,603,606,609,611,614,617,619],{"class":36,"line":176},[34,597,134],{"class":40},[34,599,600],{"class":80}," user",[34,602,256],{"class":40},[34,604,605],{"class":48}," userSchema.",[34,607,608],{"class":44},"parse",[34,610,588],{"class":48},[34,612,613],{"class":40},"await",[34,615,616],{"class":48}," response.",[34,618,427],{"class":44},[34,620,621],{"class":48},"())\n",[34,623,624],{"class":36,"line":183},[34,625,128],{"emptyLinePlaceholder":127},[34,627,628],{"class":36,"line":189},[34,629,630],{"class":179},"\u002F\u002F Everything past this point is 100% typed\n",[34,632,633,636],{"class":36,"line":201},[34,634,635],{"class":48},"user.email ",[34,637,638],{"class":179},"\u002F\u002F string, guaranteed\n",[10,640,641,645],{},[642,643,644],"strong",{},"Result",": Last Laravel + Vue project refactor eliminated 80% of runtime type errors. The compiler became my QA team.",[10,647,648],{},[642,649,650],{},"Ship faster. Type smarter.",[652,653,654],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}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);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"title":29,"searchDepth":64,"depth":64,"links":656},[657,658,659],{"id":21,"depth":64,"text":22},{"id":231,"depth":64,"text":232},{"id":505,"depth":64,"text":506},"TypeScript","2026-04-19","Three techniques that cut Vue + Laravel API bugs by 80%—no verbosity, just results.","md",{},"\u002Fdev\u002Ftypescript-advanced-patterns","10 min read",{"title":5,"description":662},"dev\u002Ftypescript-advanced-patterns",[660,670,671,672],"Vue","Laravel","API","WQ5r26dYx0WOWNZq1U-ZFhbuE74Mfz7o_qGgpE44oKM",[675,984],{"id":676,"title":677,"body":678,"category":972,"date":661,"description":973,"extension":663,"meta":974,"navigation":127,"path":975,"readTime":976,"seo":977,"stem":978,"tags":979,"__hash__":983},"dev\u002Fdev\u002Flaravel-caching-from-memory-leaks-to-fast-apis.md","Laravel Caching: From Memory Leaks to fast APIs",{"type":7,"value":679,"toc":965},[680,683,687,733,743,747,785,794,798,851,855,889,893,957,962],[10,681,682],{},"Laravel gets called \"slow\" when people skip caching patterns that work. These strategies cut API response times from seconds to milliseconds.",[19,684,686],{"id":685},"cacheremember-cacheput","Cache::remember() > Cache::put()",[24,688,692],{"className":689,"code":690,"language":691,"meta":29,"style":29},"language-php shiki shiki-themes github-light github-dark","\u002F\u002F ❌ Wrong: Manual expiration management\nCache::put('user-posts', $posts, now()->addHour());\n$posts = Cache::get('user-posts');\n\n\u002F\u002F ✅ Right: Automatic refresh\n$posts = Cache::remember(\"user.{$user->id}.posts\", now()->addHour(), function () use ($user) {\n    return $user->posts()->with('comments')->get();\n});\n","php",[31,693,694,699,704,709,713,718,723,728],{"__ignoreMap":29},[34,695,696],{"class":36,"line":37},[34,697,698],{},"\u002F\u002F ❌ Wrong: Manual expiration management\n",[34,700,701],{"class":36,"line":64},[34,702,703],{},"Cache::put('user-posts', $posts, now()->addHour());\n",[34,705,706],{"class":36,"line":98},[34,707,708],{},"$posts = Cache::get('user-posts');\n",[34,710,711],{"class":36,"line":124},[34,712,128],{"emptyLinePlaceholder":127},[34,714,715],{"class":36,"line":131},[34,716,717],{},"\u002F\u002F ✅ Right: Automatic refresh\n",[34,719,720],{"class":36,"line":162},[34,721,722],{},"$posts = Cache::remember(\"user.{$user->id}.posts\", now()->addHour(), function () use ($user) {\n",[34,724,725],{"class":36,"line":167},[34,726,727],{},"    return $user->posts()->with('comments')->get();\n",[34,729,730],{"class":36,"line":176},[34,731,732],{},"});\n",[10,734,735,738,739,742],{},[642,736,737],{},"Why",": ",[31,740,741],{},"remember()"," guarantees fresh data on cache miss. No stale data bugs.",[19,744,746],{"id":745},"cache-tags-for-related-data","Cache Tags for Related Data",[24,748,750],{"className":689,"code":749,"language":691,"meta":29,"style":29},"\u002F\u002F Tag entire user data tree\nCache::tags(['user', \"user:{$user->id}\"])->rememberForever(\"user:{$user->id}:profile\", function () use ($user) {\n    return $user->load(['posts', 'posts.comments']);\n});\n\n\u002F\u002F Invalidate everything when user updates\nCache::tags(['user', \"user:{$user->id}\"])->flush();\n",[31,751,752,757,762,767,771,775,780],{"__ignoreMap":29},[34,753,754],{"class":36,"line":37},[34,755,756],{},"\u002F\u002F Tag entire user data tree\n",[34,758,759],{"class":36,"line":64},[34,760,761],{},"Cache::tags(['user', \"user:{$user->id}\"])->rememberForever(\"user:{$user->id}:profile\", function () use ($user) {\n",[34,763,764],{"class":36,"line":98},[34,765,766],{},"    return $user->load(['posts', 'posts.comments']);\n",[34,768,769],{"class":36,"line":124},[34,770,732],{},[34,772,773],{"class":36,"line":131},[34,774,128],{"emptyLinePlaceholder":127},[34,776,777],{"class":36,"line":162},[34,778,779],{},"\u002F\u002F Invalidate everything when user updates\n",[34,781,782],{"class":36,"line":167},[34,783,784],{},"Cache::tags(['user', \"user:{$user->id}\"])->flush();\n",[10,786,787,789,790,793],{},[642,788,644],{},": One ",[31,791,792],{},"flush()"," clears profile + posts + comments. No hunting cache keys.",[19,795,797],{"id":796},"routemodel-caching-that-survives-production","Route\u002FModel Caching That Survives Production",[24,799,801],{"className":689,"code":800,"language":691,"meta":29,"style":29},"\u002F\u002F Route caching (CLI only)\nRoute::middleware('cache.headers:public;max_age=3600')->get('\u002Fapi\u002Fposts', function () {\n    return Cache::remember('public-posts', 3600, fn() => Post::published()->get();\n});\n\n\u002F\u002F Model query caching\nPost::published()\n    ->remember(3600)\n    ->orderBy('published_at')\n    ->get();\n",[31,802,803,808,813,818,822,826,831,836,841,846],{"__ignoreMap":29},[34,804,805],{"class":36,"line":37},[34,806,807],{},"\u002F\u002F Route caching (CLI only)\n",[34,809,810],{"class":36,"line":64},[34,811,812],{},"Route::middleware('cache.headers:public;max_age=3600')->get('\u002Fapi\u002Fposts', function () {\n",[34,814,815],{"class":36,"line":98},[34,816,817],{},"    return Cache::remember('public-posts', 3600, fn() => Post::published()->get();\n",[34,819,820],{"class":36,"line":124},[34,821,732],{},[34,823,824],{"class":36,"line":131},[34,825,128],{"emptyLinePlaceholder":127},[34,827,828],{"class":36,"line":162},[34,829,830],{},"\u002F\u002F Model query caching\n",[34,832,833],{"class":36,"line":167},[34,834,835],{},"Post::published()\n",[34,837,838],{"class":36,"line":176},[34,839,840],{},"    ->remember(3600)\n",[34,842,843],{"class":36,"line":183},[34,844,845],{},"    ->orderBy('published_at')\n",[34,847,848],{"class":36,"line":189},[34,849,850],{},"    ->get();\n",[19,852,854],{"id":853},"redis-json-for-complex-objects","Redis JSON for Complex Objects",[24,856,858],{"className":689,"code":857,"language":691,"meta":29,"style":29},"\u002F\u002F Store JSON directly (faster than serialization)\nCache::store('redis')->put('dashboard-stats', json_encode($stats), 1800);\n\n\u002F\u002F Driver-specific: Redis JSON commands\nRedis::connection()->json()->set(\"user:{$user->id}\", '$', $user->toArray());\nRedis::connection()->json()->get(\"user:{$user->id}\");\n",[31,859,860,865,870,874,879,884],{"__ignoreMap":29},[34,861,862],{"class":36,"line":37},[34,863,864],{},"\u002F\u002F Store JSON directly (faster than serialization)\n",[34,866,867],{"class":36,"line":64},[34,868,869],{},"Cache::store('redis')->put('dashboard-stats', json_encode($stats), 1800);\n",[34,871,872],{"class":36,"line":98},[34,873,128],{"emptyLinePlaceholder":127},[34,875,876],{"class":36,"line":124},[34,877,878],{},"\u002F\u002F Driver-specific: Redis JSON commands\n",[34,880,881],{"class":36,"line":131},[34,882,883],{},"Redis::connection()->json()->set(\"user:{$user->id}\", '$', $user->toArray());\n",[34,885,886],{"class":36,"line":162},[34,887,888],{},"Redis::connection()->json()->get(\"user:{$user->id}\");\n",[19,890,892],{"id":891},"the-production-checklist","The Production Checklist",[24,894,896],{"className":689,"code":895,"language":691,"meta":29,"style":29},"\u002F\u002F .env\nCACHE_STORE=redis\nREDIS_CLIENT=phpredis\nSESSION_DRIVER=redis\n\n\u002F\u002F config\u002Fcache.php\n'tags' => [\n    'redis' => [\n        'driver' => 'redis',\n        'connection' => 'cache',\n    ],\n],\n",[31,897,898,903,908,913,918,922,927,932,937,942,947,952],{"__ignoreMap":29},[34,899,900],{"class":36,"line":37},[34,901,902],{},"\u002F\u002F .env\n",[34,904,905],{"class":36,"line":64},[34,906,907],{},"CACHE_STORE=redis\n",[34,909,910],{"class":36,"line":98},[34,911,912],{},"REDIS_CLIENT=phpredis\n",[34,914,915],{"class":36,"line":124},[34,916,917],{},"SESSION_DRIVER=redis\n",[34,919,920],{"class":36,"line":131},[34,921,128],{"emptyLinePlaceholder":127},[34,923,924],{"class":36,"line":162},[34,925,926],{},"\u002F\u002F config\u002Fcache.php\n",[34,928,929],{"class":36,"line":167},[34,930,931],{},"'tags' => [\n",[34,933,934],{"class":36,"line":176},[34,935,936],{},"    'redis' => [\n",[34,938,939],{"class":36,"line":183},[34,940,941],{},"        'driver' => 'redis',\n",[34,943,944],{"class":36,"line":189},[34,945,946],{},"        'connection' => 'cache',\n",[34,948,949],{"class":36,"line":201},[34,950,951],{},"    ],\n",[34,953,954],{"class":36,"line":207},[34,955,956],{},"],\n",[10,958,959],{},[642,960,961],{},"Cache smart. Ship fast.",[652,963,964],{},"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);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":29,"searchDepth":64,"depth":64,"links":966},[967,968,969,970,971],{"id":685,"depth":64,"text":686},{"id":745,"depth":64,"text":746},{"id":796,"depth":64,"text":797},{"id":853,"depth":64,"text":854},{"id":891,"depth":64,"text":892},"Dev","Practical caching patterns that ship faster than your uncached endpoints.",{},"\u002Fdev\u002Flaravel-caching-from-memory-leaks-to-fast-apis","10 min",{"title":677,"description":973},"dev\u002Flaravel-caching-from-memory-leaks-to-fast-apis",[671,980,981,982],"Caching","Performance","Redis","X5GW_GstX-4dBwpdsLAPvI3zkuuZ0d_7hL7FL8G2Jpg",{"id":4,"title":5,"body":985,"category":660,"date":661,"description":662,"extension":663,"meta":1470,"navigation":127,"path":665,"readTime":666,"seo":1471,"stem":668,"tags":1472,"__hash__":673},{"type":7,"value":986,"toc":1465},[987,991,993,1127,1131,1133,1341,1345,1347,1455,1459,1463],[10,988,12,989,17],{},[14,990,16],{},[19,992,22],{"id":21},[24,994,995],{"className":26,"code":27,"language":28,"meta":29,"style":29},[31,996,997,1013,1035,1057,1061,1085,1089,1095,1099,1103,1111,1115,1123],{"__ignoreMap":29},[34,998,999,1001,1003,1005,1007,1009,1011],{"class":36,"line":37},[34,1000,41],{"class":40},[34,1002,45],{"class":44},[34,1004,49],{"class":48},[34,1006,52],{"class":44},[34,1008,55],{"class":48},[34,1010,58],{"class":40},[34,1012,61],{"class":48},[34,1014,1015,1017,1019,1021,1023,1025,1027,1029,1031,1033],{"class":36,"line":64},[34,1016,67],{"class":40},[34,1018,70],{"class":48},[34,1020,74],{"class":73},[34,1022,77],{"class":40},[34,1024,81],{"class":80},[34,1026,84],{"class":48},[34,1028,87],{"class":73},[34,1030,77],{"class":40},[34,1032,92],{"class":44},[34,1034,95],{"class":48},[34,1036,1037,1039,1041,1043,1045,1047,1049,1051,1053,1055],{"class":36,"line":98},[34,1038,67],{"class":40},[34,1040,70],{"class":48},[34,1042,74],{"class":73},[34,1044,77],{"class":40},[34,1046,109],{"class":80},[34,1048,84],{"class":48},[34,1050,114],{"class":73},[34,1052,77],{"class":40},[34,1054,119],{"class":80},[34,1056,95],{"class":48},[34,1058,1059],{"class":36,"line":124},[34,1060,128],{"emptyLinePlaceholder":127},[34,1062,1063,1065,1067,1069,1071,1073,1075,1077,1079,1081,1083],{"class":36,"line":131},[34,1064,134],{"class":40},[34,1066,137],{"class":80},[34,1068,77],{"class":40},[34,1070,45],{"class":44},[34,1072,49],{"class":48},[34,1074,146],{"class":44},[34,1076,55],{"class":48},[34,1078,58],{"class":40},[34,1080,153],{"class":40},[34,1082,156],{"class":44},[34,1084,159],{"class":48},[34,1086,1087],{"class":36,"line":162},[34,1088,128],{"emptyLinePlaceholder":127},[34,1090,1091,1093],{"class":36,"line":167},[34,1092,170],{"class":40},[34,1094,173],{"class":48},[34,1096,1097],{"class":36,"line":176},[34,1098,180],{"class":179},[34,1100,1101],{"class":36,"line":183},[34,1102,186],{"class":48},[34,1104,1105,1107,1109],{"class":36,"line":189},[34,1106,192],{"class":48},[34,1108,195],{"class":40},[34,1110,198],{"class":48},[34,1112,1113],{"class":36,"line":201},[34,1114,204],{"class":179},[34,1116,1117,1119,1121],{"class":36,"line":207},[34,1118,210],{"class":48},[34,1120,114],{"class":44},[34,1122,215],{"class":48},[34,1124,1125],{"class":36,"line":218},[34,1126,221],{"class":48},[10,1128,224,1129,228],{},[31,1130,227],{},[19,1132,232],{"id":231},[24,1134,1135],{"className":26,"code":235,"language":28,"meta":29,"style":29},[31,1136,1137,1141,1161,1185,1209,1213,1237,1251,1261,1269,1273,1277,1295,1299,1303,1309,1313,1317,1321],{"__ignoreMap":29},[34,1138,1139],{"class":36,"line":37},[34,1140,242],{"class":179},[34,1142,1143,1145,1147,1149,1151,1153,1155,1157,1159],{"class":36,"line":64},[34,1144,247],{"class":40},[34,1146,250],{"class":40},[34,1148,253],{"class":44},[34,1150,256],{"class":40},[34,1152,259],{"class":48},[34,1154,52],{"class":44},[34,1156,264],{"class":48},[34,1158,267],{"class":40},[34,1160,198],{"class":48},[34,1162,1163,1165,1167,1169,1171,1173,1175,1177,1179,1181,1183],{"class":36,"line":98},[34,1164,274],{"class":40},[34,1166,277],{"class":80},[34,1168,256],{"class":40},[34,1170,282],{"class":44},[34,1172,49],{"class":48},[34,1174,52],{"class":44},[34,1176,289],{"class":40},[34,1178,292],{"class":80},[34,1180,295],{"class":48},[34,1182,298],{"class":80},[34,1184,301],{"class":48},[34,1186,1187,1189,1191,1193,1195,1197,1199,1201,1203,1205,1207],{"class":36,"line":124},[34,1188,274],{"class":40},[34,1190,308],{"class":80},[34,1192,256],{"class":40},[34,1194,282],{"class":44},[34,1196,49],{"class":48},[34,1198,317],{"class":80},[34,1200,289],{"class":40},[34,1202,292],{"class":80},[34,1204,295],{"class":48},[34,1206,298],{"class":80},[34,1208,301],{"class":48},[34,1210,1211],{"class":36,"line":131},[34,1212,332],{"class":48},[34,1214,1215,1217,1219,1221,1223,1225,1227,1229,1231,1233,1235],{"class":36,"line":162},[34,1216,274],{"class":40},[34,1218,339],{"class":44},[34,1220,256],{"class":40},[34,1222,344],{"class":40},[34,1224,347],{"class":48},[34,1226,350],{"class":73},[34,1228,77],{"class":40},[34,1230,119],{"class":80},[34,1232,357],{"class":48},[34,1234,267],{"class":40},[34,1236,198],{"class":48},[34,1238,1239,1241,1243,1245,1247,1249],{"class":36,"line":167},[34,1240,366],{"class":40},[34,1242,369],{"class":80},[34,1244,256],{"class":40},[34,1246,153],{"class":40},[34,1248,339],{"class":44},[34,1250,378],{"class":48},[34,1252,1253,1255,1257,1259],{"class":36,"line":176},[34,1254,383],{"class":40},[34,1256,347],{"class":48},[34,1258,388],{"class":40},[34,1260,391],{"class":48},[34,1262,1263,1265,1267],{"class":36,"line":183},[34,1264,396],{"class":48},[34,1266,58],{"class":40},[34,1268,402],{"class":401},[34,1270,1271],{"class":36,"line":189},[34,1272,407],{"class":40},[34,1274,1275],{"class":36,"line":201},[34,1276,412],{"class":48},[34,1278,1279,1281,1283,1285,1287,1289,1291,1293],{"class":36,"line":207},[34,1280,417],{"class":48},[34,1282,58],{"class":40},[34,1284,153],{"class":40},[34,1286,424],{"class":48},[34,1288,427],{"class":44},[34,1290,430],{"class":48},[34,1292,433],{"class":40},[34,1294,436],{"class":44},[34,1296,1297],{"class":36,"line":218},[34,1298,441],{"class":48},[34,1300,1301],{"class":36,"line":444},[34,1302,332],{"class":48},[34,1304,1305,1307],{"class":36,"line":449},[34,1306,452],{"class":40},[34,1308,455],{"class":48},[34,1310,1311],{"class":36,"line":458},[34,1312,221],{"class":48},[34,1314,1315],{"class":36,"line":463},[34,1316,128],{"emptyLinePlaceholder":127},[34,1318,1319],{"class":36,"line":468},[34,1320,471],{"class":179},[34,1322,1323,1325,1327,1329,1331,1333,1335,1337,1339],{"class":36,"line":474},[34,1324,134],{"class":40},[34,1326,70],{"class":48},[34,1328,87],{"class":80},[34,1330,483],{"class":48},[34,1332,58],{"class":40},[34,1334,253],{"class":44},[34,1336,49],{"class":48},[34,1338,492],{"class":44},[34,1340,495],{"class":48},[10,1342,498,1343,502],{},[31,1344,501],{},[19,1346,506],{"id":505},[24,1348,1349],{"className":26,"code":509,"language":28,"meta":29,"style":29},[31,1350,1351,1365,1373,1385,1393,1397,1401,1419,1441,1445,1449],{"__ignoreMap":29},[34,1352,1353,1355,1357,1359,1361,1363],{"class":36,"line":37},[34,1354,134],{"class":40},[34,1356,518],{"class":80},[34,1358,256],{"class":40},[34,1360,523],{"class":48},[34,1362,526],{"class":44},[34,1364,529],{"class":48},[34,1366,1367,1369,1371],{"class":36,"line":64},[34,1368,534],{"class":48},[34,1370,537],{"class":44},[34,1372,540],{"class":48},[34,1374,1375,1377,1379,1381,1383],{"class":36,"line":98},[34,1376,545],{"class":48},[34,1378,317],{"class":44},[34,1380,550],{"class":48},[34,1382,553],{"class":44},[34,1384,540],{"class":48},[34,1386,1387,1389,1391],{"class":36,"line":124},[34,1388,560],{"class":48},[34,1390,317],{"class":44},[34,1392,159],{"class":48},[34,1394,1395],{"class":36,"line":131},[34,1396,569],{"class":48},[34,1398,1399],{"class":36,"line":162},[34,1400,128],{"emptyLinePlaceholder":127},[34,1402,1403,1405,1407,1409,1411,1413,1415,1417],{"class":36,"line":167},[34,1404,134],{"class":40},[34,1406,137],{"class":80},[34,1408,256],{"class":40},[34,1410,153],{"class":40},[34,1412,339],{"class":44},[34,1414,588],{"class":48},[34,1416,591],{"class":401},[34,1418,301],{"class":48},[34,1420,1421,1423,1425,1427,1429,1431,1433,1435,1437,1439],{"class":36,"line":176},[34,1422,134],{"class":40},[34,1424,600],{"class":80},[34,1426,256],{"class":40},[34,1428,605],{"class":48},[34,1430,608],{"class":44},[34,1432,588],{"class":48},[34,1434,613],{"class":40},[34,1436,616],{"class":48},[34,1438,427],{"class":44},[34,1440,621],{"class":48},[34,1442,1443],{"class":36,"line":183},[34,1444,128],{"emptyLinePlaceholder":127},[34,1446,1447],{"class":36,"line":189},[34,1448,630],{"class":179},[34,1450,1451,1453],{"class":36,"line":201},[34,1452,635],{"class":48},[34,1454,638],{"class":179},[10,1456,1457,645],{},[642,1458,644],{},[10,1460,1461],{},[642,1462,650],{},[652,1464,654],{},{"title":29,"searchDepth":64,"depth":64,"links":1466},[1467,1468,1469],{"id":21,"depth":64,"text":22},{"id":231,"depth":64,"text":232},{"id":505,"depth":64,"text":506},{},{"title":5,"description":662},[660,670,671,672]]