आपकी समस्या यह है कि आप एक रेडिस कनेक्शन के साथ एक साथ कई कमांड चलाने की कोशिश कर रहे हैं।
आप कुछ इस तरह की उम्मीद कर रहे हैं
Thread 1 Thread 2
LLEN test
1
LPOP test
command
LLEN test
0
लेकिन आपको
. मिल रहा हैThread 1 Thread 2
LLEN test
1
LPOP test
LLEN test
command
0
परिणाम उसी क्रम में वापस आते हैं, लेकिन किसी विशिष्ट परिणाम के लिए थ्रेड या कमांड को जोड़ने वाला कुछ भी नहीं है। व्यक्तिगत रेडिस कनेक्शन थ्रेड सुरक्षित नहीं हैं - आपको प्रत्येक कार्यकर्ता थ्रेड के लिए एक की आवश्यकता होगी।
यदि आप अनुपयुक्त तरीके से पाइपलाइनिंग का उपयोग करते हैं तो आप भी इसी तरह की समस्याएं देख सकते हैं - यह केवल परिदृश्यों को लिखने के लिए डिज़ाइन किया गया है जैसे कि एक सूची में बहुत सारे आइटम जोड़ना, जहां आप सर्वर को यह बताने की प्रतीक्षा करने के बजाय एलपीयूएसएच सफल मानते हुए प्रदर्शन में सुधार कर सकते हैं कि यह प्रत्येक के बाद सफल हुआ वस्तु। रेडिस अभी भी परिणाम लौटाएगा, लेकिन जरूरी नहीं कि वे भेजे गए अंतिम आदेश के परिणाम हों।
इसके अलावा, मूल दृष्टिकोण उचित है। हालांकि आप कुछ सुधार कर सकते हैं:
- लंबाई की जांच करने के बजाय, केवल गैर-अवरुद्ध एलपीओपी का उपयोग करें - यदि यह शून्य हो जाता है, तो सूची खाली है
- एक टाइमर जोड़ें ताकि अगर सूची खाली हो तो यह केवल एक और आदेश जारी करने के बजाय प्रतीक्षा करेगा।
- जबकि लूप कंडीशन में कैंसिलेशन चेक शामिल करें
- कनेक्शन त्रुटियों को संभालें - मैं एक बाहरी लूप सेट अप का उपयोग करता हूं ताकि यदि कनेक्शन विफल हो जाए तो कार्यकर्ता पुन:कनेक्ट करने का प्रयास करेगा (मूल रूप से मुख्य पुनरारंभ करें ) कार्यकर्ता प्रक्रिया को पूरी तरह समाप्त करने से पहले उचित संख्या में प्रयासों के लिए।