2012-01-24 12 views
8

में एकाधिक कनेक्शन बनाना और प्रबंधित करना मैं दो डेटाबेस को स्टोर करने के लिए रेडिस का उपयोग कर रहा हूं: 0 और 1 Redis-py क्लाइंट लाइब्रेरी के माध्यम से। मैं प्रत्येक डेटाबेस के लिए दो कनेक्शन बनाना चाहता हूं। वर्तमान में, मैं यह कर रहा हूं:रेडिस पायथन

>>> connection0 = redis.Connection(host = 'localhost', port = 6379, db = 0) 
>>> connection1 = redis.Connection(host = 'localhost', port = 6379, db = 1) 
>>> connection0.connect() 

हालांकि, मैं कनेक्शन से एक Redis वस्तु बनाने के लिए एक रास्ता खोजने के लिए नहीं है।

>>> store0 = redis.Redis(connection0) 
>>> store0.info() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Library/Frameworks/Python.framework/Versions/7.0/lib/python2.7/site-packages/redis-2.4.11-py2.7.egg/redis/client.py", line 341, in info 
    return self.execute_command('INFO') 
    File "/Library/Frameworks/Python.framework/Versions/7.0/lib/python2.7/site-packages/redis-2.4.11-py2.7.egg/redis/client.py", line 278, in execute_command 
    connection.send_command(*args) 
    File "/Library/Frameworks/Python.framework/Versions/7.0/lib/python2.7/site-packages/redis-2.4.11-py2.7.egg/redis/connection.py", line 258, in send_command 
    self.send_packed_command(self.pack_command(*args)) 
    File "/Library/Frameworks/Python.framework/Versions/7.0/lib/python2.7/site-packages/redis-2.4.11-py2.7.egg/redis/connection.py", line 241, in send_packed_command 
    self.connect() 
    File "/Library/Frameworks/Python.framework/Versions/7.0/lib/python2.7/site-packages/redis-2.4.11-py2.7.egg/redis/connection.py", line 187, in connect 
    sock = self._connect() 
    File "/Library/Frameworks/Python.framework/Versions/7.0/lib/python2.7/site-packages/redis-2.4.11-py2.7.egg/redis/connection.py", line 198, in _connect 
    sock.connect((self.host, self.port)) 
    File "/Library/Frameworks/Python.framework/Versions/7.0/lib/python2.7/socket.py", line 224, in meth 
    return getattr(self._sock,name)(*args) 
TypeError: coercing to Unicode: need string or buffer, Connection found 

क्या मैं यहां एक रूकी गलती कर रहा हूं?

उत्तर

10

आपको वास्तव में ऐसे कनेक्शन नहीं बनाना चाहिए। मुझे रेडिस-पीई दस्तावेज उद्धृत करने दें।

दृश्यों के पीछे, रेडिस-पीई रेडिस सर्वर से कनेक्शन प्रबंधित करने के लिए कनेक्शन पूल का उपयोग करता है। डिफ़ॉल्ट रूप से, प्रत्येक Redis उदाहरण आपको बनाता है बदले में अपना कनेक्शन पूल बना देगा। आप इस व्यवहार को ओवरराइड कर सकते हैं और को पहले से ही कनेक्शन पूल उदाहरण को कनेक्शन_पूल रेडिस क्लास के तर्क में पास करके मौजूदा कनेक्शन पूल का उपयोग कर सकते हैं। आप को क्लाइंट साइड शेर्डिंग को लागू करने के लिए ऐसा कर सकते हैं या कनेक्शन प्रबंधित किए जाने के बारे में बेहतर अनाज नियंत्रण प्राप्त कर सकते हैं।

>>> pool = redis.ConnectionPool(host='localhost', port=6379, db=0) 
>>> r = redis.StrictRedis(connection_pool=pool) 

आप एक ही कनेक्शन निर्दिष्ट नहीं कर सकते पुस्तकालय के साथ इस्तेमाल किया जा रहा। प्रत्येक रेडिस इंस्टेंस का अपना कनेक्शन पूल होगा। जब execute_command() कहा जाता है, तो यह पूल से कनेक्शन पॉप करेगा (या एक नया खोलें) और उस कनेक्शन का उपयोग करें। यदि आप केवल अपने क्लाइंट को एक समय में अधिकतम एक कनेक्शन चाहते हैं, तो अधिकतम_कनेक्शन को 1.

पर सेट करें