{"id":86049,"date":"2024-11-29T22:01:40","date_gmt":"2024-11-29T18:31:40","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/top-5-caching-patterns-for-high-performance-applications-cg7\/"},"modified":"2024-11-29T22:01:40","modified_gmt":"2024-11-29T18:31:40","slug":"top-5-caching-patterns-for-high-performance-applications-cg7","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/top-5-caching-patterns-for-high-performance-applications-cg7\/","title":{"rendered":"5 \u0627\u0644\u06af\u0648\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0633\u0627\u0632\u06cc \u0628\u0631\u062a\u0631 \u0628\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc \u0628\u0627 \u06a9\u0627\u0631\u0627\u06cc\u06cc \u0628\u0627\u0644\u0627"},"content":{"rendered":"<p>Summarize this content to 400 words in Persian Lang<br \/>\n              \u06a9\u0634 \u06a9\u0631\u062f\u0646 \u06cc\u06a9 \u062a\u06a9\u0646\u06cc\u06a9 \u0642\u062f\u0631\u062a\u0645\u0646\u062f \u0628\u0631\u0627\u06cc \u0627\u0641\u0632\u0627\u06cc\u0634 \u0639\u0645\u0644\u06a9\u0631\u062f \u0648 \u0645\u0642\u06cc\u0627\u0633 \u067e\u0630\u06cc\u0631\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627 \u0627\u0633\u062a. \u0628\u0627 \u0630\u062e\u06cc\u0631\u0647 \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0628\u0647 \u0637\u0648\u0631 \u0645\u06a9\u0631\u0631 \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0647\u0633\u062a\u0646\u062f \u062f\u0631 \u0644\u0627\u06cc\u0647\u200c\u0647\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647\u200c\u0633\u0627\u0632\u06cc \u0633\u0631\u06cc\u0639\u200c\u062a\u0631\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u062a\u0623\u062e\u06cc\u0631 \u0631\u0627 \u06a9\u0627\u0647\u0634 \u062f\u0647\u06cc\u062f\u060c \u0628\u0627\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0631\u0627 \u06a9\u0627\u0647\u0634 \u062f\u0647\u06cc\u062f \u0648 \u062a\u062c\u0631\u0628\u0647 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0631\u0648\u0627\u0646\u200c\u062a\u0631\u06cc \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u06cc\u062f.<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647\u060c \u0645\u0627 \u067e\u0646\u062c \u0627\u0644\u06af\u0648\u06cc \u0628\u0631\u062a\u0631 \u0630\u062e\u06cc\u0631\u0647 \u0633\u0627\u0632\u06cc \u0631\u0627 \u06a9\u0647 \u0647\u0631 \u062a\u0648\u0633\u0639\u0647 \u062f\u0647\u0646\u062f\u0647 \u0627\u06cc \u0628\u0627\u06cc\u062f \u0628\u062f\u0627\u0646\u062f\u060c \u0628\u0631\u0631\u0633\u06cc \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f. \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 TypeScript \u0648 Node.js\u060c \u0646\u0634\u0627\u0646 \u062e\u0648\u0627\u0647\u06cc\u0645 \u062f\u0627\u062f \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646 \u0627\u06cc\u0646 \u0627\u0644\u06af\u0648\u0647\u0627 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0628\u0647\u06cc\u0646\u0647 \u0633\u0627\u0632\u06cc \u0639\u0645\u0644\u06a9\u0631\u062f \u0628\u0631\u0646\u0627\u0645\u0647 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0631\u062f.<\/p>\n<p>1\ufe0f\u20e3 \u06a9\u0634 \u062f\u0631\u0648\u0646 \u062d\u0627\u0641\u0638\u0647\u06cc\u06a9 \u06a9\u0634 \u062f\u0631\u0648\u0646 \u062d\u0627\u0641\u0638\u0647 \u062f\u0627\u062f\u0647 \u0647\u0627 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0639\u0645\u0644\u06cc\u0627\u062a \u062e\u0648\u0627\u0646\u062f\u0646 \u0648 \u0646\u0648\u0634\u062a\u0646 \u0633\u0631\u06cc\u0639 \u062f\u0631 \u062d\u0627\u0641\u0638\u0647 \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc \u06a9\u0646\u062f. \u0627\u06cc\u0646 \u0628\u0631\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u06a9\u0648\u0686\u06a9 \u0648 \u0627\u063a\u0644\u0628 \u0642\u0627\u0628\u0644 \u062f\u0633\u062a\u0631\u0633\u06cc \u0645\u0627\u0646\u0646\u062f \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062c\u0644\u0633\u0647 \u06cc\u0627 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0627\u06cc\u062f\u0647 \u0622\u0644 \u0627\u0633\u062a.<\/p>\n<p>\u0645\u062b\u0627\u0644: \u06a9\u0634 \u06a9\u0631\u062f\u0646 \u0628\u0627 Node.js<\/p>\n<p>class InMemoryCache&lt;T&gt; {<br \/>\n  private cache: Map&lt;string, T&gt; = new Map();<\/p>\n<p>  set(key: string, value: T) {<br \/>\n    this.cache.set(key, value);<br \/>\n  }<\/p>\n<p>  get(key: string): T | undefined {<br \/>\n    return this.cache.get(key);<br \/>\n  }<\/p>\n<p>  delete(key: string) {<br \/>\n    this.cache.delete(key);<br \/>\n  }<br \/>\n}<\/p>\n<p>\/\/ Usage<br \/>\nconst cache = new InMemoryCache&lt;number&gt;();<br \/>\ncache.set(&#8216;user:123&#8217;, 42);<br \/>\nconsole.log(cache.get(&#8216;user:123&#8217;)); \/\/ Output: 42<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>2\ufe0f\u20e3 \u0646\u0648\u0634\u062a\u0646 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u06a9\u0634<\/p>\n<p>\u062f\u0631 \u062d\u0627\u0641\u0638\u0647 \u067e\u0646\u0647\u0627\u0646 \u0646\u0648\u0634\u062a\u0646 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u06a9\u0634\u060c \u0627\u0628\u062a\u062f\u0627 \u0646\u0648\u0634\u062a\u0646 \u062f\u0631 \u062d\u0627\u0641\u0638\u0647 \u067e\u0646\u0647\u0627\u0646 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc \u0634\u0648\u062f \u0648 \u0633\u067e\u0633 \u0628\u0644\u0627\u0641\u0627\u0635\u0644\u0647 \u062f\u0631 \u0630\u062e\u06cc\u0631\u0647 \u0633\u0627\u0632\u06cc \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0632\u06cc\u0631\u06cc\u0646 \u0646\u0648\u0634\u062a\u0647 \u0645\u06cc \u0634\u0648\u062f. \u0627\u06cc\u0646 \u062a\u0636\u0645\u06cc\u0646 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u06a9\u0634 \u0647\u0645\u06cc\u0634\u0647 \u0628\u0627 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0647\u0645\u06af\u0627\u0645 \u0628\u0627\u0634\u062f.<\/p>\n<p>\u0645\u062b\u0627\u0644: \u0646\u0648\u0634\u062a\u0646 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u06a9\u0634<\/p>\n<p>class WriteThroughCache&lt;T&gt; {<br \/>\n  private cache: Map&lt;string, T&gt; = new Map();<\/p>\n<p>  async write(key: string, value: T, writeToDb: (key: string, value: T) =&gt; Promise&lt;void&gt;) {<br \/>\n    this.cache.set(key, value);<br \/>\n    await writeToDb(key, value); \/\/ Write to database<br \/>\n  }<\/p>\n<p>  get(key: string): T | undefined {<br \/>\n    return this.cache.get(key);<br \/>\n  }<br \/>\n}<\/p>\n<p>\/\/ Simulated database function<br \/>\nasync function dbWrite(key: string, value: any) {<br \/>\n  console.log(`Writing ${key}: ${value} to database`);<br \/>\n}<\/p>\n<p>\/\/ Usage<br \/>\nconst writeCache = new WriteThroughCache&lt;string&gt;();<br \/>\nwriteCache.write(&#8216;key1&#8217;, &#8216;value1&#8217;, dbWrite);<br \/>\nconsole.log(writeCache.get(&#8216;key1&#8217;)); \/\/ Output: &#8216;value1&#8217;<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>3\ufe0f\u20e3 \u0627\u0644\u06af\u0648\u06cc \u062d\u0627\u0641\u0638\u0647 \u067e\u0646\u0647\u0627\u0646<\/p>\n<p>\u062f\u0631 \u0627\u0644\u06af\u0648\u06cc cache-aside\u060c \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0628\u062a\u062f\u0627 \u062d\u0627\u0641\u0638\u0647 \u067e\u0646\u0647\u0627\u0646 \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u0645\u06cc \u06a9\u0646\u062f. \u0627\u06af\u0631 \u062f\u0627\u062f\u0647 \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0646\u0628\u0627\u0634\u062f\u060c \u0622\u0646 \u0631\u0627 \u0627\u0632 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0628\u0631\u0627\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0647\u0627\u06cc \u0628\u0639\u062f\u06cc \u062f\u0631 \u06a9\u0634 \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u0645\u062b\u0627\u0644: Cache-aside \u0628\u0627 Redis<\/p>\n<p>import redis from &#8216;redis&#8217;;<br \/>\nimport { promisify } from &#8216;util&#8217;;<\/p>\n<p>const client = redis.createClient();<br \/>\nconst getAsync = promisify(client.get).bind(client);<br \/>\nconst setAsync = promisify(client.set).bind(client);<\/p>\n<p>async function getData(key: string, fetchFromDb: () =&gt; Promise&lt;string&gt;): Promise&lt;string&gt; {<br \/>\n  const cachedValue = await getAsync(key);<\/p>\n<p>  if (cachedValue) {<br \/>\n    console.log(&#8216;Cache hit&#8217;);<br \/>\n    return cachedValue;<br \/>\n  }<\/p>\n<p>  console.log(&#8216;Cache miss&#8217;);<br \/>\n  const value = await fetchFromDb();<br \/>\n  await setAsync(key, value);<br \/>\n  return value;<br \/>\n}<\/p>\n<p>\/\/ Simulated database fetch<br \/>\nasync function fetchFromDb() {<br \/>\n  return &#8216;Database Value&#8217;;<br \/>\n}<\/p>\n<p>\/\/ Usage<br \/>\ngetData(&#8216;user:123&#8217;, fetchFromDb).then(console.log);<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>4\ufe0f\u20e3 \u06a9\u0634 \u062e\u0648\u0627\u0646\u062f\u0646\u06cc<\/p>\n<p>\u062f\u0631 \u06cc\u06a9 \u06a9\u0634 \u062e\u0648\u0627\u0646\u062f\u0646\u06cc\u060c \u062a\u0645\u0627\u0645 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc \u062e\u0648\u0627\u0646\u062f\u0646 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u06a9\u0634 \u0639\u0628\u0648\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0646\u062f. \u0627\u06af\u0631 \u062f\u0627\u062f\u0647 \u0648\u062c\u0648\u062f \u0646\u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u062f\u060c \u062d\u0627\u0641\u0638\u0647 \u067e\u0646\u0647\u0627\u0646 \u0622\u0646 \u0631\u0627 \u0627\u0632 \u0641\u0631\u0648\u0634\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0628\u0647 \u0637\u0648\u0631 \u062e\u0648\u062f\u06a9\u0627\u0631 \u0628\u0647 \u0631\u0648\u0632 \u0645\u06cc \u0634\u0648\u062f.<\/p>\n<p>\u0645\u062b\u0627\u0644: \u06a9\u0634 \u062e\u0648\u0627\u0646\u062f\u0646\u06cc<\/p>\n<p>class ReadThroughCache&lt;T&gt; {<br \/>\n  private cache: Map&lt;string, T&gt; = new Map();<\/p>\n<p>  async get(key: string, fetchFromDb: () =&gt; Promise&lt;T&gt;): Promise&lt;T&gt; {<br \/>\n    if (this.cache.has(key)) {<br \/>\n      console.log(&#8216;Cache hit&#8217;);<br \/>\n      return this.cache.get(key)!;<br \/>\n    }<\/p>\n<p>    console.log(&#8216;Cache miss&#8217;);<br \/>\n    const value = await fetchFromDb();<br \/>\n    this.cache.set(key, value);<br \/>\n    return value;<br \/>\n  }<br \/>\n}<\/p>\n<p>\/\/ Usage<br \/>\nconst readCache = new ReadThroughCache&lt;string&gt;();<br \/>\nreadCache.get(&#8216;user:123&#8217;, async () =&gt; &#8216;Fetched from DB&#8217;).then(console.log);<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>5\ufe0f\u20e3 \u062d\u0627\u0641\u0638\u0647 \u067e\u0646\u0647\u0627\u0646 \u062a\u0648\u0632\u06cc\u0639 \u0634\u062f\u0647<\/p>\n<p>\u062d\u0627\u0641\u0638\u0647 \u067e\u0646\u0647\u0627\u0646 \u062a\u0648\u0632\u06cc\u0639 \u0634\u062f\u0647 \u062f\u0627\u062f\u0647 \u0647\u0627 \u0631\u0627 \u062f\u0631 \u0686\u0646\u062f\u06cc\u0646 \u06af\u0631\u0647 \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0645\u0642\u06cc\u0627\u0633 \u067e\u0630\u06cc\u0631\u06cc \u0648 \u062a\u062d\u0645\u0644 \u062e\u0637\u0627 \u0631\u0627 \u062a\u0636\u0645\u06cc\u0646 \u0645\u06cc \u06a9\u0646\u062f. \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u062f\u0631 \u0633\u06cc\u0633\u062a\u0645\u200c\u0647\u0627\u06cc \u0645\u0642\u06cc\u0627\u0633 \u0628\u0632\u0631\u06af \u0628\u0631\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0627\u0631\u0622\u0645\u062f \u062a\u0631\u0627\u0641\u06cc\u06a9 \u0628\u0627\u0644\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u0634\u0648\u062f.<\/p>\n<p>\u0645\u062b\u0627\u0644: \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Redis \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06a9\u0634 \u062a\u0648\u0632\u06cc\u0639 \u0634\u062f\u0647<\/p>\n<p>import { createClient } from &#8216;redis&#8217;;<\/p>\n<p>const client = createClient();<\/p>\n<p>async function setCache(key: string, value: string) {<br \/>\n  await client.connect();<br \/>\n  await client.set(key, value);<br \/>\n  console.log(`Set ${key}: ${value}`);<br \/>\n  await client.disconnect();<br \/>\n}<\/p>\n<p>async function getCache(key: string) {<br \/>\n  await client.connect();<br \/>\n  const value = await client.get(key);<br \/>\n  console.log(`Get ${key}: ${value}`);<br \/>\n  await client.disconnect();<br \/>\n  return value;<br \/>\n}<\/p>\n<p>\/\/ Usage<br \/>\nsetCache(&#8216;session:abc&#8217;, &#8216;active&#8217;);<br \/>\ngetCache(&#8216;session:abc&#8217;);<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u0644\u06af\u0648\u0647\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0633\u0627\u0632\u06cc \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc \u0628\u0627 \u06a9\u0627\u0631\u0627\u06cc\u06cc \u0628\u0627\u0644\u0627 \u0648 \u0645\u0642\u06cc\u0627\u0633 \u067e\u0630\u06cc\u0631 \u0636\u0631\u0648\u0631\u06cc \u0647\u0633\u062a\u0646\u062f. \u0686\u0647 \u0627\u0632 \u06a9\u0634 \u0647\u0627\u06cc \u0633\u0627\u062f\u0647 \u062f\u0631 \u062d\u0627\u0641\u0638\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f \u06cc\u0627 \u0627\u0632 \u0631\u0627\u0647 \u062d\u0644 \u0647\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0633\u0627\u0632\u06cc \u062a\u0648\u0632\u06cc\u0639 \u0634\u062f\u0647 \u067e\u06cc\u0686\u06cc\u062f\u0647\u060c \u0627\u0646\u062a\u062e\u0627\u0628 \u0627\u0644\u06af\u0648\u06cc \u0645\u0646\u0627\u0633\u0628 \u0628\u0631\u0627\u06cc \u0645\u0648\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0634\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0628\u0647 \u0637\u0648\u0631 \u0642\u0627\u0628\u0644 \u062a\u0648\u062c\u0647\u06cc \u0633\u0631\u0639\u062a \u0648 \u0642\u0627\u0628\u0644\u06cc\u062a \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0631\u0627 \u0628\u0647\u0628\u0648\u062f \u0628\u062e\u0634\u062f.<\/p>\n<p>\u0628\u0627 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0627\u06cc\u0646 \u0627\u0644\u06af\u0648\u0647\u0627 \u062f\u0631 Node.js \u0628\u0627 TypeScript\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0639\u0645\u0644\u06a9\u0631\u062f \u0633\u06cc\u0633\u062a\u0645 \u062e\u0648\u062f \u0631\u0627 \u0628\u0647\u06cc\u0646\u0647 \u06a9\u0646\u06cc\u062f \u0648 \u062a\u062c\u0631\u0628\u0647 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0631\u0627 \u0627\u0641\u0632\u0627\u06cc\u0634 \u062f\u0647\u06cc\u062f. \u0628\u0627 \u062a\u0648\u0633\u0639\u0647 \u0646\u06cc\u0627\u0632\u0647\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f\u060c \u0628\u0627 \u0627\u0635\u0648\u0644 \u0627\u0648\u0644\u06cc\u0647 \u0648 \u0645\u0642\u06cc\u0627\u0633 \u0634\u0631\u0648\u0639 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u06a9\u062f \u0646\u0648\u06cc\u0633\u06cc \u0645\u0628\u0627\u0631\u06a9 \u2764\ufe0f<\/p>\n<div data-article-id=\"2127208\" id=\"article-body\">\n<p>\u06a9\u0634 \u06a9\u0631\u062f\u0646 \u06cc\u06a9 \u062a\u06a9\u0646\u06cc\u06a9 \u0642\u062f\u0631\u062a\u0645\u0646\u062f \u0628\u0631\u0627\u06cc \u0627\u0641\u0632\u0627\u06cc\u0634 \u0639\u0645\u0644\u06a9\u0631\u062f \u0648 \u0645\u0642\u06cc\u0627\u0633 \u067e\u0630\u06cc\u0631\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627 \u0627\u0633\u062a. \u0628\u0627 \u0630\u062e\u06cc\u0631\u0647 \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0628\u0647 \u0637\u0648\u0631 \u0645\u06a9\u0631\u0631 \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0647\u0633\u062a\u0646\u062f \u062f\u0631 \u0644\u0627\u06cc\u0647\u200c\u0647\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647\u200c\u0633\u0627\u0632\u06cc \u0633\u0631\u06cc\u0639\u200c\u062a\u0631\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u062a\u0623\u062e\u06cc\u0631 \u0631\u0627 \u06a9\u0627\u0647\u0634 \u062f\u0647\u06cc\u062f\u060c \u0628\u0627\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0631\u0627 \u06a9\u0627\u0647\u0634 \u062f\u0647\u06cc\u062f \u0648 \u062a\u062c\u0631\u0628\u0647 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0631\u0648\u0627\u0646\u200c\u062a\u0631\u06cc \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u06cc\u062f.<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647\u060c \u0645\u0627 \u067e\u0646\u062c \u0627\u0644\u06af\u0648\u06cc \u0628\u0631\u062a\u0631 \u0630\u062e\u06cc\u0631\u0647 \u0633\u0627\u0632\u06cc \u0631\u0627 \u06a9\u0647 \u0647\u0631 \u062a\u0648\u0633\u0639\u0647 \u062f\u0647\u0646\u062f\u0647 \u0627\u06cc \u0628\u0627\u06cc\u062f \u0628\u062f\u0627\u0646\u062f\u060c \u0628\u0631\u0631\u0633\u06cc \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f. \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 TypeScript \u0648 Node.js\u060c \u0646\u0634\u0627\u0646 \u062e\u0648\u0627\u0647\u06cc\u0645 \u062f\u0627\u062f \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646 \u0627\u06cc\u0646 \u0627\u0644\u06af\u0648\u0647\u0627 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0628\u0647\u06cc\u0646\u0647 \u0633\u0627\u0632\u06cc \u0639\u0645\u0644\u06a9\u0631\u062f \u0628\u0631\u0646\u0627\u0645\u0647 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0631\u062f.<\/p>\n<p>1\ufe0f\u20e3 <strong>\u06a9\u0634 \u062f\u0631\u0648\u0646 \u062d\u0627\u0641\u0638\u0647<\/strong><br \/>\u06cc\u06a9 \u06a9\u0634 \u062f\u0631\u0648\u0646 \u062d\u0627\u0641\u0638\u0647 \u062f\u0627\u062f\u0647 \u0647\u0627 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0639\u0645\u0644\u06cc\u0627\u062a \u062e\u0648\u0627\u0646\u062f\u0646 \u0648 \u0646\u0648\u0634\u062a\u0646 \u0633\u0631\u06cc\u0639 \u062f\u0631 \u062d\u0627\u0641\u0638\u0647 \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc \u06a9\u0646\u062f. \u0627\u06cc\u0646 \u0628\u0631\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u06a9\u0648\u0686\u06a9 \u0648 \u0627\u063a\u0644\u0628 \u0642\u0627\u0628\u0644 \u062f\u0633\u062a\u0631\u0633\u06cc \u0645\u0627\u0646\u0646\u062f \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062c\u0644\u0633\u0647 \u06cc\u0627 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0627\u06cc\u062f\u0647 \u0622\u0644 \u0627\u0633\u062a.<\/p>\n<p><strong>\u0645\u062b\u0627\u0644: \u06a9\u0634 \u06a9\u0631\u062f\u0646 \u0628\u0627 Node.js<\/strong><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"kd\">class<\/span> <span class=\"nc\">InMemoryCache<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">T<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">private<\/span> <span class=\"na\">cache<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Map<\/span><span class=\"o\">&lt;<\/span><span class=\"kr\">string<\/span><span class=\"p\">,<\/span> <span class=\"nx\">T<\/span><span class=\"o\">&gt;<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Map<\/span><span class=\"p\">();<\/span>\n\n  <span class=\"nf\">set<\/span><span class=\"p\">(<\/span><span class=\"na\">key<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">,<\/span> <span class=\"na\">value<\/span><span class=\"p\">:<\/span> <span class=\"nx\">T<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">cache<\/span><span class=\"p\">.<\/span><span class=\"nf\">set<\/span><span class=\"p\">(<\/span><span class=\"nx\">key<\/span><span class=\"p\">,<\/span> <span class=\"nx\">value<\/span><span class=\"p\">);<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"na\">key<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">):<\/span> <span class=\"nx\">T<\/span> <span class=\"o\">|<\/span> <span class=\"kc\">undefined<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">cache<\/span><span class=\"p\">.<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"nx\">key<\/span><span class=\"p\">);<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"k\">delete<\/span><span class=\"p\">(<\/span><span class=\"na\">key<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">cache<\/span><span class=\"p\">.<\/span><span class=\"k\">delete<\/span><span class=\"p\">(<\/span><span class=\"nx\">key<\/span><span class=\"p\">);<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"c1\">\/\/ Usage<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">cache<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">InMemoryCache<\/span><span class=\"o\">&lt;<\/span><span class=\"kr\">number<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">();<\/span>\n<span class=\"nx\">cache<\/span><span class=\"p\">.<\/span><span class=\"nf\">set<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">user:123<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"mi\">42<\/span><span class=\"p\">);<\/span>\n<span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">log<\/span><span class=\"p\">(<\/span><span class=\"nx\">cache<\/span><span class=\"p\">.<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">user:123<\/span><span class=\"dl\">'<\/span><span class=\"p\">));<\/span> <span class=\"c1\">\/\/ Output: 42<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>2\ufe0f\u20e3 <strong>\u0646\u0648\u0634\u062a\u0646 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u06a9\u0634<\/strong><\/p>\n<p>\u062f\u0631 \u062d\u0627\u0641\u0638\u0647 \u067e\u0646\u0647\u0627\u0646 \u0646\u0648\u0634\u062a\u0646 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u06a9\u0634\u060c \u0627\u0628\u062a\u062f\u0627 \u0646\u0648\u0634\u062a\u0646 \u062f\u0631 \u062d\u0627\u0641\u0638\u0647 \u067e\u0646\u0647\u0627\u0646 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc \u0634\u0648\u062f \u0648 \u0633\u067e\u0633 \u0628\u0644\u0627\u0641\u0627\u0635\u0644\u0647 \u062f\u0631 \u0630\u062e\u06cc\u0631\u0647 \u0633\u0627\u0632\u06cc \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0632\u06cc\u0631\u06cc\u0646 \u0646\u0648\u0634\u062a\u0647 \u0645\u06cc \u0634\u0648\u062f. \u0627\u06cc\u0646 \u062a\u0636\u0645\u06cc\u0646 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u06a9\u0634 \u0647\u0645\u06cc\u0634\u0647 \u0628\u0627 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0647\u0645\u06af\u0627\u0645 \u0628\u0627\u0634\u062f.<\/p>\n<p><strong>\u0645\u062b\u0627\u0644: \u0646\u0648\u0634\u062a\u0646 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u06a9\u0634<\/strong><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"kd\">class<\/span> <span class=\"nc\">WriteThroughCache<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">T<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">private<\/span> <span class=\"na\">cache<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Map<\/span><span class=\"o\">&lt;<\/span><span class=\"kr\">string<\/span><span class=\"p\">,<\/span> <span class=\"nx\">T<\/span><span class=\"o\">&gt;<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Map<\/span><span class=\"p\">();<\/span>\n\n  <span class=\"k\">async<\/span> <span class=\"nf\">write<\/span><span class=\"p\">(<\/span><span class=\"na\">key<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">,<\/span> <span class=\"na\">value<\/span><span class=\"p\">:<\/span> <span class=\"nx\">T<\/span><span class=\"p\">,<\/span> <span class=\"na\">writeToDb<\/span><span class=\"p\">:<\/span> <span class=\"p\">(<\/span><span class=\"na\">key<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">,<\/span> <span class=\"na\">value<\/span><span class=\"p\">:<\/span> <span class=\"nx\">T<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nb\">Promise<\/span><span class=\"o\">&lt;<\/span><span class=\"k\">void<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">cache<\/span><span class=\"p\">.<\/span><span class=\"nf\">set<\/span><span class=\"p\">(<\/span><span class=\"nx\">key<\/span><span class=\"p\">,<\/span> <span class=\"nx\">value<\/span><span class=\"p\">);<\/span>\n    <span class=\"k\">await<\/span> <span class=\"nf\">writeToDb<\/span><span class=\"p\">(<\/span><span class=\"nx\">key<\/span><span class=\"p\">,<\/span> <span class=\"nx\">value<\/span><span class=\"p\">);<\/span> <span class=\"c1\">\/\/ Write to database<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"na\">key<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">):<\/span> <span class=\"nx\">T<\/span> <span class=\"o\">|<\/span> <span class=\"kc\">undefined<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">cache<\/span><span class=\"p\">.<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"nx\">key<\/span><span class=\"p\">);<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"c1\">\/\/ Simulated database function<\/span>\n<span class=\"k\">async<\/span> <span class=\"kd\">function<\/span> <span class=\"nf\">dbWrite<\/span><span class=\"p\">(<\/span><span class=\"nx\">key<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">,<\/span> <span class=\"nx\">value<\/span><span class=\"p\">:<\/span> <span class=\"kr\">any<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">log<\/span><span class=\"p\">(<\/span><span class=\"s2\">`Writing <\/span><span class=\"p\">${<\/span><span class=\"nx\">key<\/span><span class=\"p\">}<\/span><span class=\"s2\">: <\/span><span class=\"p\">${<\/span><span class=\"nx\">value<\/span><span class=\"p\">}<\/span><span class=\"s2\"> to database`<\/span><span class=\"p\">);<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"c1\">\/\/ Usage<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">writeCache<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">WriteThroughCache<\/span><span class=\"o\">&lt;<\/span><span class=\"kr\">string<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">();<\/span>\n<span class=\"nx\">writeCache<\/span><span class=\"p\">.<\/span><span class=\"nf\">write<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">key1<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">value1<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">dbWrite<\/span><span class=\"p\">);<\/span>\n<span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">log<\/span><span class=\"p\">(<\/span><span class=\"nx\">writeCache<\/span><span class=\"p\">.<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">key1<\/span><span class=\"dl\">'<\/span><span class=\"p\">));<\/span> <span class=\"c1\">\/\/ Output: 'value1'<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>3\ufe0f\u20e3 <strong>\u0627\u0644\u06af\u0648\u06cc \u062d\u0627\u0641\u0638\u0647 \u067e\u0646\u0647\u0627\u0646<\/strong><\/p>\n<p>\u062f\u0631 \u0627\u0644\u06af\u0648\u06cc cache-aside\u060c \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0628\u062a\u062f\u0627 \u062d\u0627\u0641\u0638\u0647 \u067e\u0646\u0647\u0627\u0646 \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u0645\u06cc \u06a9\u0646\u062f. \u0627\u06af\u0631 \u062f\u0627\u062f\u0647 \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0646\u0628\u0627\u0634\u062f\u060c \u0622\u0646 \u0631\u0627 \u0627\u0632 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0628\u0631\u0627\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0647\u0627\u06cc \u0628\u0639\u062f\u06cc \u062f\u0631 \u06a9\u0634 \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p><strong>\u0645\u062b\u0627\u0644: Cache-aside \u0628\u0627 Redis<\/strong><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"k\">import<\/span> <span class=\"nx\">redis<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">redis<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">promisify<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">util<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">client<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">redis<\/span><span class=\"p\">.<\/span><span class=\"nf\">createClient<\/span><span class=\"p\">();<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">getAsync<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">promisify<\/span><span class=\"p\">(<\/span><span class=\"nx\">client<\/span><span class=\"p\">.<\/span><span class=\"kd\">get<\/span><span class=\"p\">).<\/span><span class=\"nf\">bind<\/span><span class=\"p\">(<\/span><span class=\"nx\">client<\/span><span class=\"p\">);<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">setAsync<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">promisify<\/span><span class=\"p\">(<\/span><span class=\"nx\">client<\/span><span class=\"p\">.<\/span><span class=\"kd\">set<\/span><span class=\"p\">).<\/span><span class=\"nf\">bind<\/span><span class=\"p\">(<\/span><span class=\"nx\">client<\/span><span class=\"p\">);<\/span>\n\n<span class=\"k\">async<\/span> <span class=\"kd\">function<\/span> <span class=\"nf\">getData<\/span><span class=\"p\">(<\/span><span class=\"nx\">key<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">,<\/span> <span class=\"nx\">fetchFromDb<\/span><span class=\"p\">:<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nb\">Promise<\/span><span class=\"o\">&lt;<\/span><span class=\"kr\">string<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">):<\/span> <span class=\"nb\">Promise<\/span><span class=\"o\">&lt;<\/span><span class=\"kr\">string<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">cachedValue<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nf\">getAsync<\/span><span class=\"p\">(<\/span><span class=\"nx\">key<\/span><span class=\"p\">);<\/span>\n\n  <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">cachedValue<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">log<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">Cache hit<\/span><span class=\"dl\">'<\/span><span class=\"p\">);<\/span>\n    <span class=\"k\">return<\/span> <span class=\"nx\">cachedValue<\/span><span class=\"p\">;<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">log<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">Cache miss<\/span><span class=\"dl\">'<\/span><span class=\"p\">);<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">value<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nf\">fetchFromDb<\/span><span class=\"p\">();<\/span>\n  <span class=\"k\">await<\/span> <span class=\"nf\">setAsync<\/span><span class=\"p\">(<\/span><span class=\"nx\">key<\/span><span class=\"p\">,<\/span> <span class=\"nx\">value<\/span><span class=\"p\">);<\/span>\n  <span class=\"k\">return<\/span> <span class=\"nx\">value<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"c1\">\/\/ Simulated database fetch<\/span>\n<span class=\"k\">async<\/span> <span class=\"kd\">function<\/span> <span class=\"nf\">fetchFromDb<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">return<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">Database Value<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"c1\">\/\/ Usage<\/span>\n<span class=\"nf\">getData<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">user:123<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">fetchFromDb<\/span><span class=\"p\">).<\/span><span class=\"nf\">then<\/span><span class=\"p\">(<\/span><span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nx\">log<\/span><span class=\"p\">);<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>4\ufe0f\u20e3 <strong>\u06a9\u0634 \u062e\u0648\u0627\u0646\u062f\u0646\u06cc<\/strong><\/p>\n<p>\u062f\u0631 \u06cc\u06a9 \u06a9\u0634 \u062e\u0648\u0627\u0646\u062f\u0646\u06cc\u060c \u062a\u0645\u0627\u0645 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc \u062e\u0648\u0627\u0646\u062f\u0646 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u06a9\u0634 \u0639\u0628\u0648\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0646\u062f. \u0627\u06af\u0631 \u062f\u0627\u062f\u0647 \u0648\u062c\u0648\u062f \u0646\u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u062f\u060c \u062d\u0627\u0641\u0638\u0647 \u067e\u0646\u0647\u0627\u0646 \u0622\u0646 \u0631\u0627 \u0627\u0632 \u0641\u0631\u0648\u0634\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0628\u0647 \u0637\u0648\u0631 \u062e\u0648\u062f\u06a9\u0627\u0631 \u0628\u0647 \u0631\u0648\u0632 \u0645\u06cc \u0634\u0648\u062f.<\/p>\n<p><strong>\u0645\u062b\u0627\u0644: \u06a9\u0634 \u062e\u0648\u0627\u0646\u062f\u0646\u06cc<\/strong><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"kd\">class<\/span> <span class=\"nc\">ReadThroughCache<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">T<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">private<\/span> <span class=\"na\">cache<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Map<\/span><span class=\"o\">&lt;<\/span><span class=\"kr\">string<\/span><span class=\"p\">,<\/span> <span class=\"nx\">T<\/span><span class=\"o\">&gt;<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Map<\/span><span class=\"p\">();<\/span>\n\n  <span class=\"k\">async<\/span> <span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"na\">key<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">,<\/span> <span class=\"na\">fetchFromDb<\/span><span class=\"p\">:<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nb\">Promise<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">T<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">):<\/span> <span class=\"nb\">Promise<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">T<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">cache<\/span><span class=\"p\">.<\/span><span class=\"nf\">has<\/span><span class=\"p\">(<\/span><span class=\"nx\">key<\/span><span class=\"p\">))<\/span> <span class=\"p\">{<\/span>\n      <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">log<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">Cache hit<\/span><span class=\"dl\">'<\/span><span class=\"p\">);<\/span>\n      <span class=\"k\">return<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">cache<\/span><span class=\"p\">.<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"nx\">key<\/span><span class=\"p\">)<\/span><span class=\"o\">!<\/span><span class=\"p\">;<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">log<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">Cache miss<\/span><span class=\"dl\">'<\/span><span class=\"p\">);<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">value<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nf\">fetchFromDb<\/span><span class=\"p\">();<\/span>\n    <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">cache<\/span><span class=\"p\">.<\/span><span class=\"nf\">set<\/span><span class=\"p\">(<\/span><span class=\"nx\">key<\/span><span class=\"p\">,<\/span> <span class=\"nx\">value<\/span><span class=\"p\">);<\/span>\n    <span class=\"k\">return<\/span> <span class=\"nx\">value<\/span><span class=\"p\">;<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"c1\">\/\/ Usage<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">readCache<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">ReadThroughCache<\/span><span class=\"o\">&lt;<\/span><span class=\"kr\">string<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">();<\/span>\n<span class=\"nx\">readCache<\/span><span class=\"p\">.<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">user:123<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"k\">async <\/span><span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">Fetched from DB<\/span><span class=\"dl\">'<\/span><span class=\"p\">).<\/span><span class=\"nf\">then<\/span><span class=\"p\">(<\/span><span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nx\">log<\/span><span class=\"p\">);<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>5\ufe0f\u20e3 <strong>\u062d\u0627\u0641\u0638\u0647 \u067e\u0646\u0647\u0627\u0646 \u062a\u0648\u0632\u06cc\u0639 \u0634\u062f\u0647<\/strong><\/p>\n<p>\u062d\u0627\u0641\u0638\u0647 \u067e\u0646\u0647\u0627\u0646 \u062a\u0648\u0632\u06cc\u0639 \u0634\u062f\u0647 \u062f\u0627\u062f\u0647 \u0647\u0627 \u0631\u0627 \u062f\u0631 \u0686\u0646\u062f\u06cc\u0646 \u06af\u0631\u0647 \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0645\u0642\u06cc\u0627\u0633 \u067e\u0630\u06cc\u0631\u06cc \u0648 \u062a\u062d\u0645\u0644 \u062e\u0637\u0627 \u0631\u0627 \u062a\u0636\u0645\u06cc\u0646 \u0645\u06cc \u06a9\u0646\u062f. \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u062f\u0631 \u0633\u06cc\u0633\u062a\u0645\u200c\u0647\u0627\u06cc \u0645\u0642\u06cc\u0627\u0633 \u0628\u0632\u0631\u06af \u0628\u0631\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0627\u0631\u0622\u0645\u062f \u062a\u0631\u0627\u0641\u06cc\u06a9 \u0628\u0627\u0644\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u0634\u0648\u062f.<\/p>\n<p><strong>\u0645\u062b\u0627\u0644: \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Redis \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06a9\u0634 \u062a\u0648\u0632\u06cc\u0639 \u0634\u062f\u0647<\/strong><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">createClient<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">redis<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">client<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">createClient<\/span><span class=\"p\">();<\/span>\n\n<span class=\"k\">async<\/span> <span class=\"kd\">function<\/span> <span class=\"nf\">setCache<\/span><span class=\"p\">(<\/span><span class=\"nx\">key<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">,<\/span> <span class=\"nx\">value<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">await<\/span> <span class=\"nx\">client<\/span><span class=\"p\">.<\/span><span class=\"nf\">connect<\/span><span class=\"p\">();<\/span>\n  <span class=\"k\">await<\/span> <span class=\"nx\">client<\/span><span class=\"p\">.<\/span><span class=\"nf\">set<\/span><span class=\"p\">(<\/span><span class=\"nx\">key<\/span><span class=\"p\">,<\/span> <span class=\"nx\">value<\/span><span class=\"p\">);<\/span>\n  <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">log<\/span><span class=\"p\">(<\/span><span class=\"s2\">`Set <\/span><span class=\"p\">${<\/span><span class=\"nx\">key<\/span><span class=\"p\">}<\/span><span class=\"s2\">: <\/span><span class=\"p\">${<\/span><span class=\"nx\">value<\/span><span class=\"p\">}<\/span><span class=\"s2\">`<\/span><span class=\"p\">);<\/span>\n  <span class=\"k\">await<\/span> <span class=\"nx\">client<\/span><span class=\"p\">.<\/span><span class=\"nf\">disconnect<\/span><span class=\"p\">();<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">async<\/span> <span class=\"kd\">function<\/span> <span class=\"nf\">getCache<\/span><span class=\"p\">(<\/span><span class=\"nx\">key<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">await<\/span> <span class=\"nx\">client<\/span><span class=\"p\">.<\/span><span class=\"nf\">connect<\/span><span class=\"p\">();<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">value<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">client<\/span><span class=\"p\">.<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"nx\">key<\/span><span class=\"p\">);<\/span>\n  <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">log<\/span><span class=\"p\">(<\/span><span class=\"s2\">`Get <\/span><span class=\"p\">${<\/span><span class=\"nx\">key<\/span><span class=\"p\">}<\/span><span class=\"s2\">: <\/span><span class=\"p\">${<\/span><span class=\"nx\">value<\/span><span class=\"p\">}<\/span><span class=\"s2\">`<\/span><span class=\"p\">);<\/span>\n  <span class=\"k\">await<\/span> <span class=\"nx\">client<\/span><span class=\"p\">.<\/span><span class=\"nf\">disconnect<\/span><span class=\"p\">();<\/span>\n  <span class=\"k\">return<\/span> <span class=\"nx\">value<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"c1\">\/\/ Usage<\/span>\n<span class=\"nf\">setCache<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">session:abc<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">active<\/span><span class=\"dl\">'<\/span><span class=\"p\">);<\/span>\n<span class=\"nf\">getCache<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">session:abc<\/span><span class=\"dl\">'<\/span><span class=\"p\">);<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<hr\/>\n<p>\u0627\u0644\u06af\u0648\u0647\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0633\u0627\u0632\u06cc \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc \u0628\u0627 \u06a9\u0627\u0631\u0627\u06cc\u06cc \u0628\u0627\u0644\u0627 \u0648 \u0645\u0642\u06cc\u0627\u0633 \u067e\u0630\u06cc\u0631 \u0636\u0631\u0648\u0631\u06cc \u0647\u0633\u062a\u0646\u062f. \u0686\u0647 \u0627\u0632 \u06a9\u0634 \u0647\u0627\u06cc \u0633\u0627\u062f\u0647 \u062f\u0631 \u062d\u0627\u0641\u0638\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f \u06cc\u0627 \u0627\u0632 \u0631\u0627\u0647 \u062d\u0644 \u0647\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0633\u0627\u0632\u06cc \u062a\u0648\u0632\u06cc\u0639 \u0634\u062f\u0647 \u067e\u06cc\u0686\u06cc\u062f\u0647\u060c \u0627\u0646\u062a\u062e\u0627\u0628 \u0627\u0644\u06af\u0648\u06cc \u0645\u0646\u0627\u0633\u0628 \u0628\u0631\u0627\u06cc \u0645\u0648\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0634\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0628\u0647 \u0637\u0648\u0631 \u0642\u0627\u0628\u0644 \u062a\u0648\u062c\u0647\u06cc \u0633\u0631\u0639\u062a \u0648 \u0642\u0627\u0628\u0644\u06cc\u062a \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0631\u0627 \u0628\u0647\u0628\u0648\u062f \u0628\u062e\u0634\u062f.<\/p>\n<p><\/p>\n<p>\u0628\u0627 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0627\u06cc\u0646 \u0627\u0644\u06af\u0648\u0647\u0627 \u062f\u0631 Node.js \u0628\u0627 TypeScript\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0639\u0645\u0644\u06a9\u0631\u062f \u0633\u06cc\u0633\u062a\u0645 \u062e\u0648\u062f \u0631\u0627 \u0628\u0647\u06cc\u0646\u0647 \u06a9\u0646\u06cc\u062f \u0648 \u062a\u062c\u0631\u0628\u0647 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0631\u0627 \u0627\u0641\u0632\u0627\u06cc\u0634 \u062f\u0647\u06cc\u062f. \u0628\u0627 \u062a\u0648\u0633\u0639\u0647 \u0646\u06cc\u0627\u0632\u0647\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f\u060c \u0628\u0627 \u0627\u0635\u0648\u0644 \u0627\u0648\u0644\u06cc\u0647 \u0648 \u0645\u0642\u06cc\u0627\u0633 \u0634\u0631\u0648\u0639 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u06a9\u062f \u0646\u0648\u06cc\u0633\u06cc \u0645\u0628\u0627\u0631\u06a9 \u2764\ufe0f<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Summarize this content to 400 words in Persian Lang \u06a9\u0634 \u06a9\u0631\u062f\u0646 \u06cc\u06a9 \u062a\u06a9\u0646\u06cc\u06a9 \u0642\u062f\u0631\u062a\u0645\u0646\u062f \u0628\u0631\u0627\u06cc \u0627\u0641\u0632\u0627\u06cc\u0634 \u0639\u0645\u0644\u06a9\u0631\u062f \u0648 \u0645\u0642\u06cc\u0627\u0633 \u067e\u0630\u06cc\u0631\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627 \u0627\u0633\u062a. \u0628\u0627 \u0630\u062e\u06cc\u0631\u0647 \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0628\u0647 \u0637\u0648\u0631 \u0645\u06a9\u0631\u0631 \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0647\u0633\u062a\u0646\u062f \u062f\u0631 \u0644\u0627\u06cc\u0647\u200c\u0647\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647\u200c\u0633\u0627\u0632\u06cc \u0633\u0631\u06cc\u0639\u200c\u062a\u0631\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u062a\u0623\u062e\u06cc\u0631 \u0631\u0627 \u06a9\u0627\u0647\u0634 \u062f\u0647\u06cc\u062f\u060c \u0628\u0627\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0631\u0627 \u06a9\u0627\u0647\u0634 \u062f\u0647\u06cc\u062f \u0648 \u062a\u062c\u0631\u0628\u0647 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0631\u0648\u0627\u0646\u200c\u062a\u0631\u06cc \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u06cc\u062f. \u062f\u0631 &hellip;<\/p>\n","protected":false},"author":2,"featured_media":86050,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-86049","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/86049","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=86049"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/86049\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/86050"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=86049"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=86049"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=86049"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}