2012-10-19 2 views
35

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

कुछ बुनियादी ट्यूटोरियल के माध्यम से पढ़ना मैंने रेडिस क्लास का उपयोग करके कनेक्शन बनाए, लेकिन कनेक्शन को बंद करने का कोई तरीका नहीं मिला है, क्योंकि यह पहली बार है जब मैं रेडिस का उपयोग कर रहा हूं। मुझे यकीन नहीं है कि क्या मैं कनेक्शन के प्रबंधन के लिए सबसे अच्छा तरीका उपयोग कर रहा हूं, इसलिए मुझे इसके लिए कुछ सलाह चाहिए। इस तरह मैं set टिंग या get टिंग अब एक चर कर रहा हूँ:

import redis 

def getVariable(variable_name): 
    my_server = redis.Redis("10.0.0.1") 
    response = my_server.get(variable_name) 
    return response 

def setVariable(variable_name, variable_value): 
    my_server = redis.Redis("10.0.0.1") 
    my_server.set(variable_name, variable_value) 

मैं मूल रूप से पिछले कनेक्शन के समय स्टोर करने के लिए इस कोड का उपयोग या मेरे ऐप और सामान की तरह करने के लिए किया अनुरोध प्रति सेकंड के एक औसत प्राप्त करने के लिए उस।

आपकी सलाह के लिए धन्यवाद।

उत्तर

54

पाइथन ऑब्जेक्ट्स से निपटने के लिए संदर्भ काउंटर तंत्र का उपयोग करता है, इसलिए ब्लॉक के अंत में, my_server ऑब्जेक्ट स्वचालित रूप से नष्ट हो जाएगा और कनेक्शन बंद हो जाएगा। आपको इसे स्पष्ट रूप से बंद करने की आवश्यकता नहीं है।

अब यह नहीं है कि आपको रेडिस कनेक्शन का प्रबंधन कैसे करना है। प्रत्येक ऑपरेशन के लिए कनेक्ट/डिस्कनेक्ट करना बहुत महंगा है, इसलिए कनेक्शन को खोलने के लिए यह बेहतर है। redis-py के साथ यह कनेक्शन की एक पूल की घोषणा के द्वारा किया जा सकता है:

import redis 

POOL = redis.ConnectionPool(host='10.0.0.1', port=6379, db=0) 

def getVariable(variable_name): 
    my_server = redis.Redis(connection_pool=POOL) 
    response = my_server.get(variable_name) 
    return response 

def setVariable(variable_name, variable_value): 
    my_server = redis.Redis(connection_pool=POOL) 
    my_server.set(variable_name, variable_value) 

कृपया ध्यान दें कनेक्शन पूल प्रबंधन ज्यादातर स्वचालित है और redis-py के भीतर किया।

+0

धन्यवाद मुझे इसके बारे में पता नहीं था, लेकिन अगर मैं कनेक्शन पूल बना देता हूं, तो क्या मेरे पास इस मॉड्यूल से बाहर निकलने पर यह किसी भी तरह से बंद करने का तरीका है या यह स्वीकार्य नहीं है? – jeruki

+2

आवश्यक नहीं है। पाइथन कनेक्शन बंद कर देगा जब पुल ऑब्जेक्ट का अंतिम संदर्भ नष्ट हो जाएगा (यहां स्क्रिप्ट के अंत में)। –

+0

आपको बहुत धन्यवाद, मुझे – jeruki

2

@ sg1990 क्या होगा यदि आपके पास 10.000 उपयोगकर्ताओं को एक ही समय में रेडिस की आवश्यकता है? वे एक कनेक्शन साझा नहीं कर सकते हैं और आपने अभी खुद को एक बाधा बना दी है।

कनेक्शन की एक पूल आप कनेक्शन की एक मनमाना संख्या बना सकते हैं और बस redis-py docs से get_connection() और release(), का उपयोग के साथ

प्रति उपयोगकर्ता एक कनेक्शन एक विशाल ओवरकिल है, क्योंकि प्रत्येक कनेक्शन को खुली सॉकेट बनाए रखने की आवश्यकता होती है। इस तरह आप स्वचालित रूप से कई संख्याओं को कम कर देंगे समवर्ती websocket उपयोगकर्ता जो आपकी मशीन आधे से संभाल सकते हैं।

+0

AFAIK कनेक्शन पूल स्वचालित रूप से बनाया गया है या तो आप इसे स्पष्ट रूप से निर्दिष्ट करते हैं या नहीं।यह स्रोत के लिए मैं सच देख सकता हूं https://github.com/andymccurdy/redis-py/blob/master/redis/client.py#L493 –