2017-05-17 17 views
5

मैं अपने पाइथन कोड को अपने Redis सर्वर से कनेक्ट करने के लिए नियमित redis पैकेज का उपयोग कर रहा हूं।पायथन-रेडिस कुंजी() तारों की बजाय बाइट्स ऑब्जेक्ट्स की सूची लौटाती है

मेरे कोड के हिस्से के रूप में मैं जांचता हूं कि मेरी Redis सर्वर कुंजी में कोई स्ट्रिंग ऑब्जेक्ट मौजूद है या नहीं।

string = 'abcde' 
if string in redis.keys(): 
    do something.. 

कुछ कारणों के लिए, redis.keys(), जैसे [b'abcde'] बाइट्स वस्तुओं के साथ एक सूची लौटाती है, जबकि मेरी स्ट्रिंग, बेशक, एक str वस्तु।

मैंने पहले से ही अपने रेडिस जेनरेटर में charset, encoding और decode_responses सेट करने का प्रयास किया है, लेकिन इससे मदद नहीं मिली।

मेरा लक्ष्य डेटा को स्ट्रिंग के रूप में सम्मिलित करना है, और कुंजी सूची में पुनरावृत्ति नहीं करना है और प्रत्येक तत्व को स्ट्रिंग() को जांचते समय बदलना है।

धन्यवाद आगे

+1

संभव डुप्लिकेट [पायथन 3 में स्ट्रिंग को बाइट्स में कनवर्ट करने का सबसे अच्छा तरीका?] (Http://stackoverflow.com/questions/7585435/best-way-to-convert-string-to-bytes-in -पीथॉन -3) –

+0

इसके अलावा http://stackoverflow.com/questions/25745053 – Bemmu

उत्तर

6

आप EXISTS आदेश का उपयोग करें और अपने कोड के पुनर्गठन बंद बेहतर होगा की तरह:

string = 'abcde' 
if redis.exists(string): 
    do something.. 

KEYS आपरेशन अपने Redis डेटाबेस में हर कुंजी देता है और उत्पादन में गंभीर प्रदर्शन में ख़राबी हो जाएगा । साइड इफेक्ट के रूप में आप बाइनरी से स्ट्रिंग रूपांतरण से निपटने से बचते हैं।

आप स्वचालित रूप से StrictRedis निर्माता को decode_responses तर्क का उपयोग तार बाइट्स से प्रतिक्रिया कन्वर्ट करने के लिए Redis क्लाइंट कॉन्फ़िगर कर सकते हैं:

r = redis.StrictRedis('localhost', 6379, charset="utf-8", decode_responses=True) 

सुनिश्चित करें कि आप ग्राहकों के बीच charset विकल्प के साथ एक जैसे हों।

+1

धन्यवाद। और क्या होगा यदि मुझे शब्दकोश की कुंजी का उपयोग करने की आवश्यकता है? मैं इसे स्वचालित रूप से बाइट्स के बजाय स्ट्रिंग में कैसे परिवर्तित कर सकता हूं? – GMe

+1

मैंने decode_responses के बारे में जानकारी के साथ उत्तर अद्यतन किया। –

+0

फिर से धन्यवाद। मैंने कनेक्शन कनेक्शन के अंदर 'redis.Redis' के साथ यह कोशिश की और यह अच्छी तरह से काम नहीं किया गया .. क्या 'decode_responses' तर्क में' StrictRedis' और 'redis.Redis' के बीच कोई अंतर है? मैंने प्रलेखन में पाया कि वे दोनों इस तर्क के साथ ठीक होना चाहिए – GMe

5

यदि आप डिकोडिंग के लिए सूची को पुन: सक्रिय नहीं करना चाहते हैं, तो अपने रेडिस कनेक्शन को स्वचालित रूप से डीकोड करने के लिए सेट करें और आपको अपना आवश्यक परिणाम प्राप्त होगा। जैसा कि आपकी कनेक्शन स्ट्रिंग में है, कृपया decode_responses तर्क देखें:

rdb = redis.StrictRedis(host="localhost", charset="utf-8", port=6379, db=0, decode_responses=True) 

हैप्पी कोडिंग! :-)

संबंधित मुद्दे