English | العربية | বাংলা | Bosanski | Deutsch | Español | Français | हिन्दी | Italiano | 日本語 | 한국어 | मराठी | Português | Русский | Kiswahili | தமிழ் | తెలుగు | Türkçe | اردو | Tiếng Việt | 中文
- परिचय
- स्थापना
- उपयोग
- कॉन्फ़िगरेशन
- उन्नत उपयोग
- अनुकूलन
- सामान्य पैटर्न
- सीमाएँ
- समर्थन दिशानिर्देश
- लाइसेंस - MIT लाइसेंस
परिचय
Recall Laravel के लिए एक उच्च-प्रदर्शन Redis क्लाइंट-साइड कैशिंग पैकेज है। यह Redis 6 की क्लाइंट-साइड कैशिंग विशेषता का उपयोग करता है जिसमें स्वचालित अमान्यकरण होता है जो Redis के राउंड ट्रिप और विलंबता को नाटकीय रूप से कम कर देता है। विशेष रूप से Laravel Octane पर्यावरण के लिए बनाया गया, यह APCu या Swoole Table का उपयोग करता है जो Redis के साथ अमान्यकरण संदेशों के माध्यम से समन्वयित रहता है।
जब आप Redis से एक मान प्राप्त करते हैं, Recall उसे स्थानीय रूप से संग्रहीत करता है। जब वह मान Redis में बदलता है (किसी भी क्लाइंट से), Redis ऑटोमेटिक रूप से Recall को स्थानीय कॉपी को अमान्य करने के लिए सूचित करता है। यह आपको मेमोरी में कैशिंग की गति देता है वहीं Redis की स्थिरता की गारंटी भी होती है।
प्रमुख विशेषताएँ
- स्वचालित अमान्यकरण: जब कैश की चाबियाँ बदलती हैं तो Redis आपके एप्लिकेशन को सूचित करता है, जिससे कैश की संगति सुनिश्चित होती है
- शून्य कॉन्फ़िगरेशन: समझदारी से पूर्व निर्धारित सेटिंग्स के साथ आउट ऑफ द बॉक्स काम करता है
- Octane एकीकरण: स्वचालित कनेक्शन वार्मिंग, अनुरोध-आधारित अमान्यकरण प्रसंस्करण, और सहज शटडाउन
- डुअल ड्राइवर समर्थन: सभी Octane सर्वरों के लिए APCu, Swoole/OpenSwoole पर्यावरण के लिए Swoole Table
- चयनात्मक कैशिंग: स्थानीय रूप से कैश करने के लिए किस कुंजी प्रिफिक्स को कॉन्फ़िगर करें
- रेस कंडीशन सुरक्षा: लंबित अनुरोध ट्रैकिंग समवर्ती अमान्यकरण के दौरान पुराने डेटा को कैश करने से रोकती है
उदाहरण
// Recall को अपने कैश ड्राइवर के रूप में कॉन्फ़िगर करें// config/cache.php'stores' => [ 'recall' => [ 'driver' => 'recall', ],], // इसका उपयोग किसी भी Laravel कैश की तरह करेंuse Illuminate\Support\Facades\Cache; // पहला कॉल: Redis से प्राप्त करता है, स्थानीय रूप से संग्रहीत करता है$user = Cache::store('recall')->get('user:1'); // अगला कॉल: स्थानीय APCu/Swoole Table से सेवा करता है (माइक्रोसेकंड में)$user = Cache::store('recall')->get('user:1'); // जब user:1 कहीं भी अपडेट होता है, Redis Recall को सूचित करता हैCache::store('recall')->put('user:1', $newUserData, 3600);// सभी श्रमिकों पर स्थानीय कैश स्वचालित रूप से अमान्य कर दिया जाता है
स्थापना
पैकेज को कंपोज़र के माध्यम से स्थापित करें:
composer require defectivecode/laravel-recall
आवश्यकताएँ
- PHP >= 8.4
- Laravel 11.x या 12.x
- Laravel Octane
- Redis 6.0+ (क्लाइंट-साइड कैशिंग समर्थन के लिए)
- ext-apcu या ext-swoole (स्थानीय कैश के लिए कम से कम एक आवश्यक है)
उपयोग
मूल सेटअप
- Recall कैश स्टोर को अपने
config/cache.phpमें जोड़ें:
'stores' => [ // ... अन्य स्टोर 'recall' => [ 'driver' => 'recall', ],],
- अपने एप्लिकेशन में कैश स्टोर का उपयोग करें:
use Illuminate\Support\Facades\Cache; // एक मान संग्रहीत करें (Redis में लिखता है)Cache::store('recall')->put('key', 'value', 3600); // एक मान प्राप्त करें (पहला कॉल Redis को हिट करता है, अगले कॉल स्थानीय कैश का उपयोग करते हैं)$value = Cache::store('recall')->get('key'); // एक मान हटाएँCache::store('recall')->forget('key');
यह कैसे काम करता है
- पहली पढ़ाई: मान Redis से प्राप्त किया जाता है और स्थानीय APCu/Swoole Table कैश में संग्रहीत किया जाता है
- अगली पढ़ाई: मान सीधे स्थानीय मेमोरी से पेश किया जाता है (उप-मिलिसेकेंड)
- कहीं भी लिखें: जब कोई भी क्लाइंट Redis में कुंजी को संशोधित करता है, Redis एक अमान्यकरण संदेश भेजता है
- स्वचालित अमान्यकरण: Recall संदेश प्राप्त करता है और स्थानीय कैश से कुंजी को हटा देता है
- अगली पढ़ाई: ताजा मान Redis से फिर से प्राप्त किया जाता है और स्थानीय रूप से कैश किया जाता है
यह पैटर्न विशेष रूप से Laravel Octane व्यक्तियों में शक्तिशाली है जहाँ श्रमिक अनुरोधों के बीच स्थायी रहते हैं, स्थानीय कैश को विकसित करने और मेमोरी से कई अनुरोधों को सेवा देने की अनुमति मिलती है।
Octane एकीकरण
जब उपलब्ध हो, Recall स्वचालित रूप से Laravel Octane के साथ एकीकृत होता है:
- कार्यकर्ता शुरू करना: Redis अमान्यकरण कनेक्शन स्थापित करता है (वार्म स्टार्ट)
- अनुरोध प्राप्त करना: किसी भी लंबित अमान्यकरण संदेश को संसाधित करता है
- कार्यकर्ता रोकना: कनेक्शन को सहजता से बंद करता है
कोई अतिरिक्त कॉन्फ़िगरेशन की आवश्यकता नहीं है। जब Octane स्थापित होता है, तो एकीकरण स्वचालित होता है।
कॉन्फ़िगरेशन
कॉन्फ़िगरेशन फ़ाइल प्रकाशित करें:
php artisan vendor:publish --tag=recall-config
यह config/recall.php को निम्नलिखित विकल्पों के साथ बनाता है:
सक्षम/अक्षम
'enabled' => env('RECALL_ENABLED', true),
जब अक्षम होता है, Recall सीधे Redis की ओर जाता है बिना स्थानीय कैश लेयर का उपयोग किए। डिबगिंग या क्रमिक रोलआउट के लिए उपयोगी।
Redis स्टोर
'redis_store' => env('RECALL_REDIS_STORE', 'redis'),
Redis संचालन के लिए उपयोग करने के लिए Laravel कैश स्टोर। यह आपके config/cache.php में कॉन्फ़िगर किए गए Redis स्टोर का संदर्भ देना चाहिए।
कैश प्रिफिक्स
'cache_prefixes' => [],
केवल उन कुंजी को स्थानीय रूप से कैश करें जो इन प्रिफिक्स से मेल खाती हैं। सभी कुंजी को कैश करने के लिए खाली छोड़ दें।
// केवल उपयोगकर्ता और सेटिंग्स कुंजी को स्थानीय रूप से कैश करें'cache_prefixes' => ['users:', 'settings:', 'config:'],
यह तब उपयोगी होता है जब आपके पास उच्च-वॉल्यूम कुंजी होती हैं जो अक्सर बदलती हैं और उन्हे स्थानीय रूप से कैश नहीं किया जाना चाहिए।
स्थानीय कैश कॉन्फ़िगरेशन
'local_cache' => [ // ड्राइवर: "apcu" या "swoole" 'driver' => env('RECALL_LOCAL_DRIVER', 'apcu'), // स्थानीय कैश कुंजियों के लिए प्रिफिक्स 'key_prefix' => env('RECALL_LOCAL_PREFIX', 'recall:'), // डिफ़ॉल्ट TTL सेकंड में (यदि अमान्यकरण चूक जाए तो सुरक्षा जाल) 'default_ttl' => (int) env('RECALL_LOCAL_TTL', 3600), // Swoole Table आकार (2 की शक्ति, केवल swoole ड्राइवर के लिए) 'table_size' => (int) env('RECALL_SWOOLE_TABLE_SIZE', 65536), // Swoole Table में प्रत्येक मान के लिए अधिकतम बाइट्स (केवल swoole ड्राइवर के लिए) 'value_size' => (int) env('RECALL_SWOOLE_VALUE_SIZE', 8192),],
APCu ड्राइवर (डिफ़ॉल्ट)
APCu ड्राइवर सभी PHP वातावरण और Octane सर्वरों (Swoole, RoadRunner, FrankenPHP) के साथ काम करता है। यह कैश किए गए मानों को सभी PHP प्रक्रियाओं के लिए साझा मेमोरी में संग्रहीत करता है।
आवश्यकताएँ:
- ext-apcu स्थापित और सक्षम
- CLI उपयोग के लिए php.ini में
apc.enable_cli=1
Swoole Table ड्राइवर
Swoole Table ड्राइवर Swoole की साझा मेमोरी तालिकाओं का उपयोग करता है, जो समान श्रमिक में सहायक प्रक्रियाओं के बीच सुसंगत पहुंच प्रदान करता है। यह Swoole/OpenSwoole वातावरण के लिए सबसे अच्छा है।
कॉन्फ़िगरेशन टिप्स:
table_size: 2 की शक्ति होना चाहिए (जैसे, 65536, 131072)। अधिकतम प्रविष्टियों की संख्या निर्धारित करता है।value_size: अनुक्रमित मानों के लिए अधिकतम बाइट्स। बड़े मान चुपचाप समाप्त हो जाते हैं।
Octane श्रोता
'listeners' => [ // कार्यकर्ता के प्रारंभ पर कनेक्शन गर्म करे (पहले अनुरोध की विलंबता को कम करता है) 'warm' => env('RECALL_LISTEN_WARM', true), // टिक इवेंट्स पर अमान्यकरणों को संसाधित करता है (अधिक संवेदनशील, थोड़ी सी ओवरहेड) 'tick' => env('RECALL_LISTEN_TICK', false),],
गर्म कनेक्शन
जब सक्षम हो, Recall Octane श्रमिक शुरू होने पर Redis अमान्यकरण सब्सक्रिप्शन स्थापित करता है। यह पहले अनुरोध पर कनेक्शन की विलंबता को समाप्त करता है।
टिक प्रोसेसिंग
जब सक्षम हो, Recall अनुरोध इवेंट्स के अलावा Octane टिक इवेंट्स पर अमान्यकरण संदेशों को संसाधित करता है। यह थोड़ा अधिक ओवरहेड की कीमत पर अधिक प्रतिक्रियाशील कैश अमान्यकरण प्रदान करता है।
उन्नत उपयोग
मैनुअल अमान्यकरण प्रसंस्करण
यदि आपको पूरक रूप से अमान्यकरण को मैन्युअल रूप से संसाधित करने की आवश्यकता होती है (जैसे, एक लंबे समय तक चलने वाली प्रक्रिया में):
use DefectiveCode\Recall\RecallManager; $manager = app(RecallManager::class);$manager->processInvalidations();
स्थानीय कैश को साफ़ करना
केवल स्थानीय कैश को साफ़ करें बिना Redis को प्रभावित किए:
use DefectiveCode\Recall\RecallManager; $manager = app(RecallManager::class);$manager->flushLocalCache();
कनेक्शन प्रबंधन
use DefectiveCode\Recall\RecallManager; $manager = app(RecallManager::class); // जांचें कि अमान्यकरण सब्सक्रिप्शन कनेक्टेड है या नहींif ($manager->isConnected()) { // ...} // मैन्युअल रूप से डिस्कनेक्ट करें$manager->disconnect();
अनुकूलन
कार्यकर्ता अनुरोध सीमाएँ
Laravel Octane कार्यकर्ताओं को एक कॉन्फ़िगर की गई संख्या के अनुरोधों के बाद चक्रित करता है ताकि मेमोरी लीक को रोका जा सके। जब एक कार्यकर्ता चक्रित होता है, तो उसकी स्थानीय कैश साफ़ हो जाती है। इस सीमा को बढ़ाने से Recall की स्थानीय कैश लंबी अवधि तक बनी रहती है, कैश हिट दरों में सुधार होता है।
आपके config/octane.php में:
// डिफ़ॉल्ट 500 अनुरोधों से पहले चक्रित होता है'max_requests' => 10000,
उच्च मानों का मतलब बेहतर कैश उपयोग है लेकिन आपको यह विश्वास होना चाहिए कि आपके एप्लिकेशन में मेमोरी लीक नहीं हैं। इस मान को समायोजित करते समय अपने कार्यकर्ता की मेमोरी उपयोग की निगरानी करें।
प्रिफिक्स के साथ चयनात्मक कैशिंग
स्थानीय रूप से कैश की जाने वाली कुंजियों को नियंत्रित करने के लिए cache_prefixes का उपयोग करें। यह तब मूल्यवान होता है जब:
- उच्च-चाल कुंजी: कुछ कुंजियाँ इतनी जल्दी बदलती हैं कि स्थानीय कैशिंग में न्यूनतम लाभ होता है
- बड़े मान: केवल छोटे, बार-बार पढ़े जाने वाले कुंजियों को कैश करके मेमोरी दबाव को कम करें
- संवेदनशील डेटा: सुरक्षा या अनुपालन कारणों से कुछ डेटा केवल Redis में रखें
// config/recall.php'cache_prefixes' => [ 'users:', // स्थानीय रूप से उपयोगकर्ता डेटा कैश करें 'settings:', // एप्लिकेशन सेटिंग्स कैश करें 'products:', // उत्पाद कैटलॉग कैश करें],
इन प्रिफिक्स के साथ मेल नहीं खाने वाली कुंजियाँ अभी भी कार्य करेंगी लेकिन स्थानीय कैशिंग को बायपास कर देंगी, सीधे Redis पर जाएँगी।
मेमोरी पर विचार
APCu मेमोरी
APCu सभी PHP प्रक्रियाओं के बीच मेमोरी साझा करता है। php.ini में मेमोरी सीमा कॉन्फ़िगर करें:
; डिफ़ॉल्ट 32MB है, बड़े कैश की जरूरतों के लिए बढ़ाएँapc.shm_size = 128M
APCu उपयोग की निगरानी करें apcu_cache_info() के साथ:
$info = apcu_cache_info();$memory = $info['mem_size']; // वर्तमान मेमोरी उपयोग बाइट्स में
Swoole Table आकार
Swoole तालिकाएँ निर्माण के समय निर्धारित स्थिर क्षमता होती हैं। अपनी अपेक्षित कैश आकार के लिए योजना बनाएं:
'local_cache' => [ // अधिकतम प्रविष्टियाँ (2 की शक्ति होनी चाहिए) 'table_size' => 65536, // 64K प्रविष्टियाँ // बाइट्स में अनुक्रमित मान का अधिकतम आकार 'value_size' => 8192, // प्रति मान 8KB],
मेमोरी उपयोग: table_size × (value_size + overhead)। 65536 प्रविष्टियों और 8KB मान के साथ एक तालिका लगभग 512MB का उपयोग करती है।
सामान्य पैटर्न
एप्लिकेशन कॉन्फ़िगरेशन
// कैश फीचर फ्लैग और सेटिंग्स$features = Cache::store('recall')->remember('config:features', 3600, function () { return Feature::all()->pluck('enabled', 'name')->toArray();}); // जब सेटिंग बदलती है, सभी श्रमिक स्वचालित रूप से अपडेट प्राप्त करते हैं
बार-बार पहुंची जाने वाली संदर्भ डेटा
// उत्पाद श्रेणियों को कैश करें$categories = Cache::store('recall')->remember('categories:all', 3600, function () { return Category::with('children')->whereNull('parent_id')->get();}); // मुद्रा विनिमय दरों को कैश करें$rates = Cache::store('recall')->remember('rates:exchange', 300, function () { return ExchangeRate::all()->pluck('rate', 'currency')->toArray();});
कैश टैग विकल्प
Recall कैश टैग का समर्थन नहीं करता है, लेकिन आप प्रिफिक्स के साथ समान कार्यक्षमता प्राप्त कर सकते हैं:
// टैग के बजाय, लगातार प्रिफिक्स का उपयोग करेंCache::store('recall')->put("blog:posts:{$id}", $post, 3600);Cache::store('recall')->put("blog:comments:{$postId}", $comments, 3600); // प्रिफिक्स द्वारा सभी ब्लॉग-संबंधित कैश को साफ़ करें (मैन्युअल कार्यान्वयन की आवश्यकता)// या डेटा बदलने पर स्वचालित अमान्यकरण पर भरोसा करें
सीमाएँ
Redis क्लस्टर मोड
Recall Redis क्लस्टर मोड का समर्थन नहीं करता है। CLIENT TRACKING कमांड का REDIRECT विकल्प डेटा कनेक्शन और अमान्यकरण सदस्यता कनेक्शन दोनों को एक ही Redis नोड पर होना आवश्यक है। क्लस्टर में, कुंजियाँ हैश स्लॉट्स के आधार पर कई नोड्स में वितरित होती हैं, जिससे विभिन्न नोड्स पर संगृहीत कुंजियों के लिए अमान्यकरण प्राप्त करना असंभव हो जाता है।
क्लस्टर्ड Redis परिनियोजन के लिए, विचार करें:
- कैश किए गए डेटा के लिए एकल Redis उदाहरण का उपयोग करें जो क्लाइंट-साइड कैशिंग का लाभ उठा सके
- अन्य डेटा के लिए Redis क्लस्टर का उपयोग करें जबकि बार-बार पढ़े जाने वाले, स्थिर डेटा को एक अलग उदाहरण पर रखें
समर्थन दिशानिर्देश
हमारे ओपन सोर्स पैकेज को चुनने के लिए धन्यवाद! कृपया इन समर्थन दिशानिर्देशों को देखने के लिए एक क्षण निकालें। ये आपको हमारे प्रोजेक्ट का अधिकतम लाभ उठाने में मदद करेंगे।
सामुदायिक संचालित समर्थन
हमारा ओपन-सोर्स प्रोजेक्ट हमारी शानदार सामुदायिक द्वारा संचालित होता है। यदि आपके पास प्रश्न हैं या सहायता की आवश्यकता है, तो StackOverflow और अन्य ऑनलाइन संसाधन आपके लिए सबसे अच्छे विकल्प हैं।
बग और विशेषता प्राथमिकता
एक ओपन-सोर्स प्रोजेक्ट का प्रबंधन करने की वास्तविकता का मतलब है कि हम तुरंत हर रिपोर्ट की गई बग या विशेषता अनुरोध को संबोधित नहीं कर सकते। हम मुद्दों को निम्नलिखित क्रम में प्राथमिकता देते हैं:
1. हमारे भुगतान किए गए उत्पादों को प्रभावित करने वाले बग
जो बग हमारे भुगतान किए गए उत्पादों को प्रभावित करते हैं, वे हमेशा हमारी सर्वोच्च प्राथमिकता होंगे। कुछ मामलों में, हम केवल उन बग को संबोधित कर सकते हैं जो हमें सीधे प्रभावित करते हैं।
2. सामुदायिक पुल अनुरोध
यदि आपने एक बग पहचाना है और एक समाधान है, तो कृपया एक पुल अनुरोध जमा करें। हमारे उत्पादों को प्रभावित करने वाले मुद्दों के बाद, हम इन सामुदायिक संचालित सुधारों को अगली उच्चतम प्राथमिकता देते हैं। एक बार समीक्षित और अनुमोदित होने के बाद, हम आपके समाधान को मिलाएंगे और आपके योगदान को मान्यता देंगे।
3. वित्तीय समर्थन
उक्त श्रेणियों के बाहर के मुद्दों के लिए, आप उनके समाधान के लिए धन देने का विकल्प चुन सकते हैं। प्रत्येक खुले मुद्दे को एक आदेश फॉर्म से जोड़ा गया है जहाँ आप वित्तीय रूप से योगदान कर सकते हैं। हम प्रदान किए गए धनराशि के आधार पर इन मुद्दों को प्राथमिकता देते हैं।
सामुदायिक योगदान
ओपन सोर्स तब फलता-फूलता है जब इसका समुदाय सक्रिय होता है। भले ही आप बग ठीक नहीं कर रहे हों, कोड सुधार, दस्तावेज़ अपडेट, ट्यूटोरियल के माध्यम से या सामुदायिक चैनलों में अन्य लोगों की सहायता करके योगदान करने पर विचार करें। हम हर किसी को, एक समुदाय के रूप में, ओपन-सोर्स कार्य का समर्थन करने के लिए बहुत प्रोत्साहित करते हैं।
दोहराने के लिए, DefectiveCode हमारे भुगतान किए गए उत्पादों पर प्रभाव, सामुदायिक पुल अनुरोध और मुद्दों के लिए प्राप्त वित्तीय समर्थन के आधार पर बग को प्राथमिकता देगा.
लाइसेंस - MIT लाइसेंस
कॉपीराइट © डेफेक्टिव कोड, एलएलसी। सर्वाधिकार सुरक्षित
इस सॉफ़्टवेयर और संबंधित दस्तावेज़ फ़ाइलों (जिसे "सॉफ़्टवेयर" कहा जाता है) की एक प्रति प्राप्त करने वाले किसी भी व्यक्ति को बिना किसी शुल्क के समझौता किया जाता है, सॉफ़्टवेयर में बिना किसी रोक-टोक के, जिसमें बिना सीमा के निम्नलिखित अधिकार शामिल हैं: उपयोग करने, कॉपी करने, संशोधित करने, विलय करने, प्रकाशित करने, वितरित करने, उप-लाइसेंस देने और/या सॉफ़्टवेयर की प्रतियों को बेचने के लिए, और उन व्यक्तियों को अनुमति देने के लिए जिन्हें सॉफ़्टवेयर प्रदान किया गया है कि वे ऐसा कर सकें, निम्नलिखित शर्तों के अधीन:
उपरोक्त कॉपीराइट सूचना और यह अनुमति सूचना सभी प्रतियों या सॉफ़्टवेयर के महत्वपूर्ण भागों में शामिल की जानी चाहिए।
सॉफ़्टवेयर "जैसा है" प्रदान किया गया है, बिना किसी प्रकार की वारंटी के, स्पष्ट या अंतर्निहित, जिसमें वाणिज्यिकता, किसी विशेष उद्देश्य के लिए उपयुक्तता और अवमानना की वारंटी शामिल नहीं हैं, लेकिन इनमें सीमित नहीं हैं। किसी भी स्थिति में लेखकों या कॉपीराइट धारकों को किसी भी दावे, क्षति या अन्य दायित्व के लिए उत्तरदायी नहीं ठहराया जाएगा, चाहे वह अनुबंध, टॉर्ट या अन्यथा में हो, जो सॉफ़्टवेयर या सॉफ़्टवेयर के उपयोग या अन्य लेन-देन से उत्पन्न हो।