Go में कैशिंग: एप्लिकेशन को 100 गुना तेज़ कैसे करें और पागल न हों

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

आपका Go एप्लिकेशन धीमा क्यों चल रहा है? सबसे अधिक संभावना है, आप कैश के बारे में भूल गए

\n\n

आपने Go में एक आदर्श एप्लिकेशन लिखा है। आपको goroutines, channels और तेज़ कंपाइलर पर गर्व है। लेकिन जब लोड 1000 RPS तक पहुँचता है, तो सब कुछ चरमराने लगता है। डेटाबेस क्रैश हो जाता है, API 5 सेकंड में जवाब देता है, उपयोगकर्ता प्रतिस्पर्धियों के पास चले जाते हैं।

\n\n

परिचित स्थिति? उस दुनिया में आपका स्वागत है जहाँ Go में कैशिंग के बिना काम नहीं चलता। इस लेख में, हम देखेंगे कि आपके धीमे एप्लिकेशन को चीते में कैसे बदलें। बिना पानी के, वास्तविक उदाहरणों और तैयार समाधानों के साथ।

\n\n

वैसे, मेरा नाम Python है, और यह PythonLib है। हाँ, मुझे पता है कि हम Go के बारे में बात कर रहे हैं। लेकिन अच्छा कोड भाषाओं की सीमाओं को नहीं जानता, और हम हर चीज़ के बारे में उपयोगी लेख लिखते हैं। चलिए शुरू करते हैं!

\n\n

कैशिंग क्या है और Go में इसकी आवश्यकता क्यों है?

\n\n

डेटा कैशिंग का अर्थ है बार-बार अनुरोधित डेटा को तेज़ स्टोरेज (RAM, Redis, फ़ाइलें) में सहेजना, ताकि हर बार धीमे स्रोत (डेटाबेस, बाहरी API, फ़ाइल सिस्टम) को कॉल न करना पड़े।

\n\n

Go उच्च-लोड सिस्टम के लिए एक भाषा है। लेकिन Go में भी धीमा कोड लिखा जा सकता है यदि कैश का उपयोग न किया जाए। कल्पना करें: आप PostgreSQL से प्रति सेकंड 1000 बार देशों की सूची माँग रहे हैं। DB पर 1000 अनुरोधों के बजाय, आप केवल 1 कर सकते हैं, और शेष 999 बार in-memory cache Go से डेटा दे सकते हैं।

\n\n

परिणाम: प्रतिक्रिया समय 50 ms से घटकर 0.5 ms हो जाता है। 100 गुना का अंतर। यह जादू नहीं, बल्कि सही आर्किटेक्चर है।

\n\n

कैश कब अनिवार्य है?

\n
    \n
  • उच्च लोड (प्रति सेकंड 1000+ अनुरोध)
  • \n
  • धीमे बाहरी API (भुगतान, मौसम, मुद्रा दरें)
  • \n
  • भारी गणनाएँ (रिपोर्ट, विश्लेषण)
  • \n
  • बार-बार अनुरोधित संदर्भ डेटा (शहरों की सूची, उत्पाद श्रेणियाँ)
  • \n
\n\n

कैशिंग रणनीतियाँ: सही का चयन करें

\n\n

कैश को एंटी-पैटर्न बनने से बचाने के लिए, सही कैशिंग रणनीति चुननी होगी। यहाँ मुख्य विकल्प हैं जो Go में काम करते हैं:

\n\n

1. Cache-Aside (आलसी कैशिंग)

\n

सबसे लोकप्रिय पैटर्न। एप्लिकेशन पहले कैश की जाँच करता है। यदि डेटा नहीं है (cache miss) — DB में जाता है, परिणाम को कैश में सहेजता है और क्लाइंट को लौटाता है।

\n\n
func GetUser(cache *redis.Client, db *sql.DB, userID int) (*User, error) {\n    // कैश से लाने का प्रयास करें\n    val, err := cache.Get(ctx, "user:"+strconv.Itoa(userID)).Result()\n    if err == nil {\n        user := &User{}\n        json.Unmarshal([]byte(val), user)\n        return user, nil\n    }\n\n    // कैश मिस — DB में जाएँ\n    user, err := db.Query("SELECT * FROM users WHERE id = ?", userID)\n    if err != nil {\n        return nil, err\n    }\n\n    // 1 घंटे के लिए कैश में सहेजें\n    data, _ := json.Marshal(user)\n    cache.Set(ctx, "user:"+strconv.Itoa(userID), data, time.Hour)\n\n    return user, nil\n}
\n\n

2. Write-Through (सीधा लेखन)

\n

डेटा एक साथ कैश और DB दोनों में लिखा जाता है। लाभ: कैश हमेशा अप-टू-डेट रहता है। नुकसान: लेखन थोड़ा धीमा होता है।

\n\n

3. TTL (Time To Live)

\n

कैश इनवैलिडेशन का सबसे सरल तरीका। डेटा एक निश्चित समय तक जीवित रहता है, फिर स्वचालित रूप से हटा दिया जाता है।

\n\n
// 5 मिनट का कैश\ncache.Set(ctx, "key", value, 5*time.Minute)
\n\n

Go में अपना खुद का in-memory कैश लागू करना

\n\n

कभी-कभी कुछ कुंजियों के लिए Redis सेटअप करने का मन नहीं करता। ऐसे मामलों के लिए in-memory cache Go एकदम सही है। आइए एक सरल लेकिन काम करने वाला संस्करण लिखें:

\n\n
package cache\n\nimport (\n    "sync"\n    "time"\n)\n\ntype Item struct {\n    Value      interface{}\n    Expiration int64\n}\n\ntype Cache struct {\n    items map[string]Item\n    mu    sync.RWMutex\n}\n\nfunc New() *Cache {\n    c := &Cache{\n        items: make(map[string]Item),\n    }\n    // समाप्त हो चुकी प्रविष्टियों को साफ करने के लिए goroutine शुरू करें\n    go c.cleanup()\n    return c\n}\n\nfunc (c *Cache) Set(key string, value interface{}, ttl time.Duration) {\n    c.mu.Lock()\n    defer c.mu.Un                

ब्लॉग

पुस्तक अनुशंसाएँ