डेटा करप्शन से जुड़ी समस्याएं #
एक समस्या जिसे डिबग करना कठिन हो सकता है यदि वही RedisClient
. है उदाहरण कई थ्रेड्स में साझा किया जाता है जिसके परिणामस्वरूप दूषित डेटा वापस आ सकता है। आमतौर पर, यह IRedisClient
. का उपयोग करने का परिणाम है एक सिंगलटन उदाहरण में फ़ील्ड या इसे स्थिर उदाहरण के रूप में साझा करना। इसे रोकने के लिए, रेडिस का उपयोग करने वाले प्रत्येक थ्रेड को रेडिस क्लाइंट को एक प्रयोग कथन के भीतर पुनः प्राप्त करना चाहिए, जैसे:
using var redis = redisManager.GetClient();
//...
दुर्भाग्य से कॉल-साइट जो दूषित प्रतिक्रिया या रनटाइम अपवाद देता है, यह पहचान नहीं करता है कि रेडिस क्लाइंट इंस्टेंस का और कहां उपयोग किया जा रहा था। यह पहचानने में सहायता के लिए कि क्लाइंट इंस्टेंस का उपयोग कहां किया जा रहा है, आप यह दावा कर सकते हैं कि क्लाइंट का उपयोग केवल उस थ्रेड में किया जाता है जिसने इसे पूल से हल किया:
RedisConfig.AssertAccessOnlyOnSameThread = true;
यह थ्रेड के स्टैकट्रेस को कैप्चर करता है जब भी क्लाइंट को पूल से हल किया जाता है, क्योंकि यह बहुत अधिक ओवरहेड जोड़ता है, केवल कनेक्शन समस्याओं को डीबग करते समय सक्षम किया जाना चाहिए।
यदि यह पता लगाता है कि क्लाइंट को किसी भिन्न थ्रेड से एक्सेस किया जा रहा है तो यह एक InvalidAccessException
फेंक देगा। विभिन्न थ्रेड आईडी . वाले संदेश के साथ और मूल स्टैकट्रेस जहां ग्राहक को पूल से हल किया गया था। आप इसकी तुलना अपवाद के स्टैकट्रेस से कर सकते हैं ताकि उम्मीद की जा सके कि क्लाइंट का अनुचित तरीके से उपयोग किया जा रहा है।
समवर्ती उपयोग की समस्याओं से बचना #
IRedisClient
के एकाधिक समवर्ती उपयोग से बचने के लिए अपने कोड-बेस में क्या देखना है उदाहरण:
IRedisClient
का उपयोग करें एकusing
. के भीतर रेडिस इंस्टेंस क्लाइंट बयान- किसी क्लाइंट इंस्टेंस को डिस्पोज़ किए जाने के बाद कभी भी उसका उपयोग न करें
- क्लाइंट के निपटान के बाद कभी भी "सर्वर संग्रह या संसाधन" (जैसे Redis.Lists, lock) का उपयोग (या वापस) न करें
- एक सिंगलटन या
static
कभी न रखें एक रेडिस क्लाइंट के लिए उदाहरण (सिर्फIRedisClientsManager
कारखाना) - कभी भी एक ही रेडिस क्लाइंट को कई थ्रेड्स में उपयोग न करें, यानी प्रत्येक थ्रेड को फ़ैक्टरी से अपने क्लाइंट को हल करने के लिए कहें