2012-05-15 11 views
9

मैं एक वेब सेवा डिज़ाइन कर रहा हूं जो रेडिस को डेटाबेस के रूप में उपयोग करता है, और मैं स्टैक सेवा क्लाइंट से कनेक्ट रेडिस का उपयोग करने के लिए सर्वोत्तम प्रथाओं को जानना चाहता हूं।रेडिस सर्विसस्टैक पूल कनेक्शन कनेक्शन क्लाइंट

बिंदु यह है कि मैं रेडिस के बारे में पढ़ रहा हूं और मैंने पाया कि सर्वर के साथ बातचीत करने का सबसे अच्छा तरीका एक समवर्ती कनेक्शन का उपयोग कर है।

समस्या यह है कि मैं PooledRedisClientManager हर बार है कि एक वेब ग्राहक वेब सेवा मैं एक एक और कनेक्ट किए गए ग्राहक (खोला कनेक्शन) redis सर्वर से प्राप्त करने के लिए एक अनुरोध और जुड़े ग्राहक की इस संख्या में आता है का उपयोग कर रहा के बावजूद अधिक से अधिक स्मृति उपभोग सीमा के बिना बढ़ता है।

नमूना 'गलती' कोड:

PooledRedisClientManager pooledClientManager = new PooledRedisClientManager("localhost"); 
var redisClient = pooledClientManager.GetClient(); 
using (redisClient) 
{ 
    redisClient.Set("key1", "value1"); 
} 

क्या मैं समस्या को हल करने में किया था, एक स्थिर RedisClient वर के साथ सिंगलटन पैटर्न को लागू करने के लिए एक वर्ग बनाने है, जो redisClient प्रारंभ नहीं हुआ है, एक नया बनाता है, और यदि यह है, तो प्रारंभिक एक लौटाता है।

समाधान:

public class CustomRedisPooledClient 
{ 
    private static CustomRedisPooledClient _instance = null; 
    public RedisClient redisClient = null; 

    // Objeto sincronización para hacer el Lock 
    private static object syncLock = new object(); 

    private CustomRedisPooledClient() 
    { 
     redisClient = new RedisClient("localhost"); 
    } 

    public static CustomRedisPooledClient GetPooledClient() 
    { 
     if (_instance == null) 
     { 
      lock (syncLock) 
      { 
       if (_instance == null) 
       { 
        _instance = new CustomRedisPooledClient(); 
       } 
      } 
     } 
     return _instance; 
    } 
} 

CustomRedisPooledClient customRedisPooledClient = CustomRedisPooledClient.GetPooledClient(); 
using (customRedisPooledClient.redisClient) 
{ 
    customRedisPooledClient.redisClient.Set("key1", "value1"); 
} 

यह एक अच्छा अभ्यास है?

अग्रिम धन्यवाद!

+0

आपने पूल से ** redisClient ** क्यों खींचा लेकिन इसका उपयोग नहीं कर रहे हैं? लेकिन इसके बजाय ** pooledClientManager ** का उपयोग कर रहे हैं? – mythz

+0

यह प्रश्न लिखने में गलती थी, अब इसे –

+1

के सही किया गया है, इसलिए मैं आपका प्रश्न संपादित करूँगा क्योंकि आपका 'गलती कोड' अब काम करता है और प्रदान किया गया ** समाधान ** आदर्श नहीं है। समस्या क्या थी और आदर्श समाधान के लिए स्वीकृत उत्तर का संदर्भ लें। – mythz

उत्तर

16

मैं PooledRedisClientManager का इस्तेमाल किया और यह ठीक काम करता है:

नमूना कोड है कि मैं केवल एक बार चलाएँ:

static PooledRedisClientManager pooledClientManager = new PooledRedisClientManager("localhost"); 

और कोड मैं कई धागे पर चलने:

var redisClient = pooledClientManager.GetClient(); 
using (redisClient) 
{ 
    redisClient.Set("key" + i.ToString(), "value1"); 
} 

और मैं सर्वर से जुड़े केवल 11 क्लाइंट हैं।

+0

यदि मैं वही करता हूं तो मुझे ब्राउज़र द्वारा किए गए हर अनुरोध पर एक नया धागा मिलता है। जब मैंने redisClient.Set ("key" + i.ToString(), "value1") लाइन बनाई है तो मैंने इसे डिबग किया है और एक नया थ्रेड (क्लाइंट) बनाया है; निष्पादित किया गया है और मैं नियंत्रण खो देता हूं और लगता है कि यह हमेशा के लिए खुला होगा। मैंने वेब पेज को रीफ्रेश करने का परीक्षण किया जो सेवा यूआरएल को कॉल करता है और मैं 100 कनेक्टेड क्लाइंट्स पर पहुंच गया हूं –

+0

शायद समस्या यह है कि मैं हर अनुरोध पर कोड चलाता हूं, है ना? –

+0

क्या आप वाकई "PooledRedisClientManager pooledClientManager = new PooledRedisClientManager (" localhost ") नहीं चलाते हैं;" हर बार? – eyossi