2014-04-23 11 views
6

मैंने फ्लास्क माइक्रोफ्रेमवर्क के साथ खेला, और कुछ आंकड़ों को रेडिस में कैश करना चाहता था। मान लीजिए कि मैं इस dict करते हैं:redis-py और hgetall व्यवहार

mydict = {} 
mydict["test"] = "test11" 

मैं साथ Redis करने के लिए इसे बचाया

redis.hmset("test:key", mydict) 

हालांकि बाद बहाल

stored = redis.hgetall("test:key") 
print(str(stored)) 

मैं अजीब देख {b'test': b'test11'} तो stored.get("test") मुझे कोई नहीं

देता है mydict str विधि परिणाम ठीक दिखता है {'test': 'test11'}। तो, इस बाइनरी मार्कर को पुनर्स्थापित डेटा में क्यों जोड़ा गया? मैंने रेडिस-क्ली में भी जांच की और स्पष्ट बी मार्करों को वहां नहीं देखा। Hgetall के साथ कुछ गलत है?

+1

कोई रुचि रखते हैं, यहाँ डेवलपर की ओर से जवाब है, तो: https://github.com/andymccurdy/redis-py/issues/463#issuecomment-41229918 – Tommi

उत्तर

12

यह इच्छित व्यवहार है। डिफ़ॉल्ट रूप से, Redis से बाहर आने वाले स्ट्रिंग डीकोड नहीं होते हैं। आपके पास कुछ विकल्प हैं:

  • डेटा को डीकोड करें।
  • decode_responses तर्क के साथ क्लाइंट उदाहरण बनाएं, उदाहरण के लिए, StrictRedis(decode_responses=True)। यह सभी स्ट्रिंग्स को डीकोड करेगा जो charset तर्क (जो को utf-8 पर डिफ़ॉल्ट करता है) के आधार पर रेडिस से आते हैं। केवल यह करें कि आप सुनिश्चित हैं कि रेडिस के प्रत्येक प्रतिक्रिया में स्ट्रिंग डेटा है जिसे आप utf-8 को डीकोड करना चाहते हैं। यदि आप एक मसालेदार वस्तु जैसे द्विआधारी डेटा प्राप्त करने के लिए क्लाइंट इंस्टेंस का उपयोग कर रहे हैं, तो आप इस विकल्प का उपयोग नहीं करना चाहिए। उस स्थिति में, मैं बाइनरी डेटा के लिए एक अलग क्लाइंट इंस्टेंस का उपयोग करने का सुझाव दूंगा।

स्रोत: https://github.com/andymccurdy/redis-py/issues/463#issuecomment-41229918

+1

यह तर्क गैर-दस्तावेजी है और यह काम करने लगता है नहीं करता है: 'python3' ' >>> आयात redis' '>>> पूल = redis.ConnectionPool (मेजबान = 'localhost', पोर्ट = 6379, डीबी = 0)' '>>> डेटास्टोर = redis.StrictRedis (कनेक्शन_पूल = पुल, decode_responses = सही) ' ' >>> mydict = {} ' ' >>> mydict ["test"] = "test11" ' ' >>> डेटास्टोर.hmset ("test: key", mydict) ' ' ट्रू' '>>> संग्रहित = डेटास्टोर.hgetall (" परीक्षण: कुंजी ")' '>>> संग्रहीत ' ' {b'test': b'test11 '} ' – mezzomondo

+0

वही, यहां लेंज या स्मेम्बर के लिए काम नहीं करता है – eugene

2
POOL = redis.ConnectionPool(host='localhost', **decode_responses=True**, port=6379, db=0) 
datastore = redis.StrictRedis(connection_pool=POOL) 

अगर आप ConnectionPool उपयोग करते हैं, आप ConnectionPool के निर्माता को decode_responses = सच बढ़ना चाहिए।

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