Go (Golang) में कैशिंग: Redis, in-memory और अन्य समाधान
\n\nकैशिंग Go में एप्लिकेशन के प्रदर्शन को बढ़ाने और डेटाबेस पर लोड कम करने की प्रमुख रणनीतियों में से एक है। इस लेख में, हम कैशिंग को लागू करने के मुख्य दृष्टिकोणों और लाइब्रेरीज़ पर विचार करेंगे: सरल in-memory समाधानों से लेकर Redis-आधारित वितरित कैश तक। आप जानेंगे कि कब कौन सा उपकरण चुनना है और Go प्रोजेक्ट्स में कैश को सही तरीके से कैसे व्यवस्थित करना है।
\n\n1. बिल्ट-इन क्षमताएँ: map और sync.Map
\n\nGo में कैशिंग का सबसे सरल तरीका म्यूटेक्स के साथ सामान्य map या थ्रेड-सेफ sync.Map का उपयोग करना है। ये दृष्टिकोण छोटे प्रोजेक्ट्स या प्रोटोटाइप के लिए उपयुक्त हैं, जहाँ जटिल इनवैलिडेशन नीति की आवश्यकता नहीं होती है।
sync.Map के साथ उदाहरण:
\n\npackage 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 नहीं, कोई स्वचालित सफाई नहीं, मेमोरी सीमित नहीं है।
2. TTL के साथ In-memory कैश: freecache
\n\nFreecache TTL (एंट्री का जीवनकाल) के समर्थन के साथ एक तेज़ in-memory कैश लाइब्रेरी है। यह लॉकिंग को कम करने और मेमोरी को कुशलतापूर्वक प्रबंधित करने के लिए सेगमेंटेड आर्किटेक्चर का उपयोग करती है।
\n\nस्थापना:
\ngo get github.com/coocood/freecache\n\nउपयोग का उदाहरण:
\n\npackage 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नुकसान: केवल एक प्रक्रिया के लिए (वितरित नहीं)।
3. BigCache — freecache का विकल्प
\n\nBigCache एक और लोकप्रिय in-memory लाइब्रेरी है, जो न्यूनतम एक्सेस समय के साथ बड़ी संख्या में एंट्रीज़ (लाखों) को संग्रहीत करने के लिए अनुकूलित है। यह TTL और पुराने डेटा की स्वचालित निकासी का भी समर्थन करती है।
\n\nउदाहरण:
\n\npackage 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 की तरह — स्थानीय कैश।
4. Redis और go-redis के साथ वितरित कैशिंग
\n\nवितरित सिस्टम के लिए, जहाँ एप्लिकेशन के कई इंस्टेंस में एक समान कैश होना चाहिए, Redis का उपयोग किया जाता है। Go के लिए सबसे लोकप्रिय क्लाइंट go-redis (पूर्व में go-redis/redis) है।
\n\nस्थापना:
\ngo get github.com/redis/go-redis/v9\n\n