अद्यतन करें: नीचे 3.2 तक के रेडिस संस्करणों पर लागू होता है। उस संस्करण से, प्रभाव-आधारित प्रतिकृति गैर-निर्धारणवाद पर प्रतिबंध हटा देती है, इसलिए सभी दांव बंद हो जाते हैं (या बल्कि, चालू)।
आप SCAN
. को मिक्स नहीं कर सकते (और नहीं करना चाहिए) स्क्रिप्ट में किसी भी लेखन कमांड के साथ कमांड का परिवार क्योंकि पूर्व का उत्तर आंतरिक रेडिस डेटा संरचनाओं पर निर्भर है, जो बदले में, सर्वर प्रक्रिया के लिए अद्वितीय हैं। दूसरे शब्दों में, दो रेडिस प्रक्रियाएं (जैसे मास्टर और स्लेव) समान उत्तरों को वापस करने की गारंटी नहीं हैं (इसलिए रेडिस प्रतिकृति संदर्भ में [जो ऑपरेशन नहीं है- लेकिन कथन-आधारित] जो इसे तोड़ देगा)।
रेडिस किसी भी राइट कमांड (जैसे DEL
.) को ब्लॉक करके ऐसे मामलों से खुद को बचाने की कोशिश करता है ) अगर इसे एक रैंडम कमांड के बाद निष्पादित किया जाता है (जैसे SCAN
लेकिन साथ ही TIME
, SRANDMEMBER
और समान)। मुझे यकीन है कि इससे बचने के तरीके हैं, लेकिन क्या आप ऐसा करना चाहेंगे? याद रखें, आप अज्ञात क्षेत्र में जा रहे हैं जहां सिस्टम का व्यवहार परिभाषित नहीं है।
इसके बजाय, इस तथ्य को स्वीकार करें कि आपको यादृच्छिक पढ़ने और लिखने का मिश्रण नहीं करना चाहिए और अपनी समस्या को हल करने के लिए एक अलग दृष्टिकोण के बारे में सोचने का प्रयास करना चाहिए, अर्थात् परमाणु तरीके से एक पैटर्न के अनुसार चाबियों का एक गुच्छा हटाना।
पहले अपने आप से पूछें कि क्या आप किसी भी आवश्यकता को शिथिल कर सकते हैं। क्या यह परमाणु होना चाहिए? परमाणुता का अर्थ है कि हटाने की अवधि के लिए रेडिस को अवरुद्ध कर दिया जाएगा (अंतिम कार्यान्वयन की परवाह किए बिना) और ऑपरेशन की लंबाई नौकरी के आकार पर निर्भर करती है (अर्थात हटाए गए कुंजियों की संख्या और उनकी सामग्री [एक बड़े सेट को हटाना है उदाहरण के लिए एक छोटी स्ट्रिंग को हटाने की तुलना में अधिक महंगा])।
यदि परमाणुता आवश्यक नहीं है, तो समय-समय पर/आलसी SCAN
और छोटे बैचों में हटा दें। यदि यह जरूरी है, तो समझें कि आप मूल रूप से बुरा KEYS
का अनुकरण करने का प्रयास कर रहे हैं। कमांड :) लेकिन अगर आपको पैटर्न का पूर्व ज्ञान है तो आप बेहतर कर सकते हैं।
यह मानते हुए कि पैटर्न आपके एप्लिकेशन के रनटाइम के दौरान जाना जाता है, आप प्रासंगिक कुंजी (जैसे एक सेट में) एकत्र कर सकते हैं और फिर उस संग्रह का उपयोग परमाणु और प्रतिकृति-सुरक्षित तरीके से हटाने को वास्तविक बनाने के लिए कर सकते हैं जो पूरे कीस्पेस पर जाने की तुलना में अधिक कुशल है। ।
हालाँकि, सबसे "कठिन" समस्या यह है कि यदि आपको परमाणुता सुनिश्चित करते हुए तदर्थ पैटर्न मिलान चलाने की आवश्यकता है। यदि ऐसा है, तो समस्या तुरंत कीस्पेस के फ़िल्टर-दर-पैटर्न स्नैपशॉट प्राप्त करने के लिए उबलती है, जिसके बाद हटाए जाने का उत्तराधिकार होता है (फिर से जोर देना:जबकि डेटाबेस अवरुद्ध है)। उस स्थिति में आप KEYS
. का बहुत अच्छी तरह से उपयोग कर सकते हैं अपनी लुआ लिपि के भीतर और सर्वश्रेष्ठ के लिए आशा ... (लेकिन अच्छी तरह से जानते हुए कि आप SHUTDOWN NOSAVE
का सहारा ले सकते हैं। बहुत जल्दी :P).
लास्ट ऑप्टिमाइज़ेशन कीस्पेस को ही इंडेक्स करना है। दोनों SCAN
और KEYS
मूल रूप से पूर्ण तालिका स्कैन हैं, तो क्या होगा यदि हम उस तालिका को अनुक्रमित करें? चाबियों के नाम पर एक इंडेक्स रखने की कल्पना करें जिसे लेनदेन के दौरान पूछताछ की जा सकती है - आप शायद एक क्रमबद्ध सेट और शब्दावली श्रेणियों का उपयोग कर सकते हैं (एचटी @TwBert ) अधिकांश पैटर्न मिलान आवश्यकताओं को समाप्त करने के लिए। लेकिन एक महत्वपूर्ण लागत पर ... न केवल आप डबल बहीखाता पद्धति (रैम और सीपीयू में प्रत्येक कुंजी के नाम की लागत को संग्रहीत करना) कर रहे होंगे, आपको अपने आवेदन में जटिलता जोड़ने के लिए मजबूर किया जाएगा। जटिलता क्यों जोड़ रहे हैं? क्योंकि इस तरह के एक इंडेक्स को लागू करने के लिए आपको इसे स्वयं एप्लिकेशन लेयर (और संभवतः आपकी अन्य सभी लुआ स्क्रिप्ट) में बनाए रखना होगा, ध्यान से प्रत्येक लेखन ऑपरेशन को रेडिस में एक लेनदेन में लपेटना जो इंडेक्स को भी अपडेट करता है।
मान लें कि आपने वह सब किया है (और बग के लिए अतिरिक्त जटिलता की क्षमता जैसे स्पष्ट नुकसान को ध्यान में रखते हुए, रेडिस, रैम और सीपीयू पर कम से कम दोगुना लिखने का भार, स्केलिंग पर प्रतिबंध और आगे ...) आप खुद को थपथपा सकते हैं Redis का इस तरह से उपयोग करने के लिए खुद को बधाई दें, जिसके लिए इसे डिज़ाइन नहीं किया गया था। जबकि Redis के आगामी संस्करणों में इस चुनौती के लिए बेहतर समाधान शामिल हो सकते हैं (या नहीं भी हो सकते हैं) (@TwBert - एक संयुक्त RCP/contrib करना चाहते हैं और फिर से Redis को थोड़ा हैक करना चाहते हैं? ), इसे आज़माने से पहले, मैं वास्तव में आपसे मूल आवश्यकताओं पर पुनर्विचार करने और यह सत्यापित करने का आग्रह करता हूं कि आप Redis का सही उपयोग कर रहे हैं (यानी अपनी डेटा एक्सेस आवश्यकताओं के अनुसार अपनी "स्कीमा" को डिज़ाइन करना)।