Go (Golang) में कैशिंग: Redis, in-memory और अन्य समाधान

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

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

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

Go (Golang) में कैशिंग: Redis, in-memory और अन्य समाधान

\n\n

कैशिंग Go में एप्लिकेशन के प्रदर्शन को बढ़ाने और डेटाबेस पर लोड कम करने की प्रमुख रणनीतियों में से एक है। इस लेख में, हम कैशिंग को लागू करने के मुख्य दृष्टिकोणों और लाइब्रेरीज़ पर विचार करेंगे: सरल in-memory समाधानों से लेकर Redis-आधारित वितरित कैश तक। आप जानेंगे कि कब कौन सा उपकरण चुनना है और Go प्रोजेक्ट्स में कैश को सही तरीके से कैसे व्यवस्थित करना है।

\n\n

1. बिल्ट-इन क्षमताएँ: map और sync.Map

\n\n

Go में कैशिंग का सबसे सरल तरीका म्यूटेक्स के साथ सामान्य map या थ्रेड-सेफ sync.Map का उपयोग करना है। ये दृष्टिकोण छोटे प्रोजेक्ट्स या प्रोटोटाइप के लिए उपयुक्त हैं, जहाँ जटिल इनवैलिडेशन नीति की आवश्यकता नहीं होती है।

\n\n

sync.Map के साथ उदाहरण:

\n\n
package main\n\nimport (\n    "fmt"\n    "sync"\n)\n\ntype Cache struct {\n    data sync.Map\n}\n\nfunc (c *Cache) Set(key string, value interface{}) {\n    c.data.Store(key, value)\n}\n\nfunc (c *Cache) Get(key string) (interface{}, bool) {\n    return c.data.Load(key)\n}\n\nfunc main() {\n    cache := &Cache{}\n    cache.Set("user:1", "Alice")\n    if val, ok := cache.Get("user:1"); ok {\n        fmt.Println("Found:", val)\n    }\n}
\n\n

लाभ: सरलता, शून्य निर्भरताएँ।
\nनुकसान: कोई TTL नहीं, कोई स्वचालित सफाई नहीं, मेमोरी सीमित नहीं है।

\n\n

2. TTL के साथ In-memory कैश: freecache

\n\n

Freecache TTL (एंट्री का जीवनकाल) के समर्थन के साथ एक तेज़ in-memory कैश लाइब्रेरी है। यह लॉकिंग को कम करने और मेमोरी को कुशलतापूर्वक प्रबंधित करने के लिए सेगमेंटेड आर्किटेक्चर का उपयोग करती है।

\n\n

स्थापना:

\n
go get github.com/coocood/freecache
\n\n

उपयोग का उदाहरण:

\n\n
package main\n\nimport (\n    "fmt"\n    "github.com/coocood/freecache"\n)\n\nfunc main() {\n    // 100 MB आकार का कैश बनाएँ\n    cache := freecache.NewCache(100 * 1024 * 1024)\n\n    // 10 सेकंड के TTL के साथ मान सेट करें\n    cache.Set([]byte("mykey"), []byte("myvalue"), 10)\n\n    // मान प्राप्त करें\n    if val, err := cache.Get([]byte("mykey")); err == nil {\n        fmt.Println("Value:", string(val))\n    } else {\n        fmt.Println("Key not found or expired")\n    }\n}
\n\n

लाभ: TTL द्वारा स्वचालित सफाई, कम CPU खपत, बड़ी डेटा मात्रा का समर्थन।
\nनुकसान: केवल एक प्रक्रिया के लिए (वितरित नहीं)।

\n\n

3. BigCache — freecache का विकल्प

\n\n

BigCache एक और लोकप्रिय in-memory लाइब्रेरी है, जो न्यूनतम एक्सेस समय के साथ बड़ी संख्या में एंट्रीज़ (लाखों) को संग्रहीत करने के लिए अनुकूलित है। यह TTL और पुराने डेटा की स्वचालित निकासी का भी समर्थन करती है।

\n\n

उदाहरण:

\n\n
package main\n\nimport (\n    "fmt"\n    "github.com/allegro/bigcache/v3"\n    "time"\n)\n\nfunc main() {\n    config := bigcache.Config{\n        Shards:             1024,\n        LifeWindow:         10 * time.Minute,\n        CleanWindow:        5 * time.Minute,\n        MaxEntriesInWindow: 1000 * 10 * 60,\n        MaxEntrySize:       500,\n        Verbose:            true,\n    }\n\n    cache, _ := bigcache.NewBigCache(config)\n    cache.Set("mykey", []byte("bigcache value"))\n    val, _ := cache.Get("mykey")\n    fmt.Println(string(val))\n}
\n\n

लाभ: बड़ी संख्या में कुंजियों के साथ उच्च प्रदर्शन, लचीला कॉन्फ़िगरेशन।
\nनुकसान: freecache की तरह — स्थानीय कैश।

\n\n

4. Redis और go-redis के साथ वितरित कैशिंग

\n\n

वितरित सिस्टम के लिए, जहाँ एप्लिकेशन के कई इंस्टेंस में एक समान कैश होना चाहिए, Redis का उपयोग किया जाता है। Go के लिए सबसे लोकप्रिय क्लाइंट go-redis (पूर्व में go-redis/redis) है।

\n\n

स्थापना:

\n
go get github.com/redis/go-redis/v9
\n\n

बेसिक कैशिंग का उदाहरण:

अनुशंसाएँ