2012-10-11 16 views
5

में एक संदेश पैक किए गए हैश को संग्रहीत करना मुझे रेडिस में एक संदेश पैक किए गए हैश को संग्रहीत करने में समस्या आ रही है। मैंने नीचे एक टेस्ट केस चिपकाया है। रेडिस से पैक किए गए डेटा को खींचते समय और इसे अनपॅक करते समय, हैश थोड़ा दूषित हो जाता है। ऐसा तब होता है जब हैश मान एक निश्चित लंबाई से परे होते हैं, हालांकि मैं निश्चित रूप से यह नहीं कह सकता।रेडिस

मैं रेडिस 2.4.17 (डिफ़ॉल्ट कॉन्फ़िगरेशन), रूबी 1.9.3p194, संदेशपैक 0.4.7, और रेडिस मणि 3.0.2 का उपयोग कर रहा हूं। नोड का उपयोग करके एक ही समस्या होती है, इसलिए मुझे लगता है कि समस्या संदेशपैक या रेडिस के भीतर है। कोई विचार?

require 'redis' 
require 'msgpack' 

class Test 

    def self.run(url) 
    redis = Redis.new 
    data = {'number' => 13498935756, 'hash' => {'url' => url}} 
    redis.set('my_key', MessagePack.pack(data)) 

    result = MessagePack.unpack(redis.get('my_key')) 
    puts result 
    puts result['hash']['url'] == data['hash']['url'] 
    end 

end 

Test.run('http://fake.example.com') # works 
=> {"number"=>13498935756, "hash"=>{"url"=>"http://fake.example.com"}} 
=> true 

Test.run('http://fakeurl.example.com') # does not work 
=> {"number"=>13498935756, "hash"=>{"url"=>"ttp://fakeurl.example.com"}} 
=> false 

उत्तर

10

संदेशपैक कच्चे बाइट्स में सौदों, जिन्हें 'ASCII-8BIT' एन्कोडिंग के रूप में चिह्नित किया गया है। हालांकि आपका पैक किया गया डेटा यूटीएफ -8 एन्कोडिंग में चिह्नित रेडिस से वापस आ रहा है। संदेशपैक को सफलतापूर्वक अनपैक करने के लिए, आपको कच्चे बाइट्स के रूप में व्याख्या करने के लिए इसे मजबूर करने की आवश्यकता है।

इसलिए, इस लाइन को बदलने ...

result = MessagePack.unpack(redis.get('my_key')) 
कुछ इस तरह के

...

redis_val = redis.get('my_key').force_encoding('ASCII-8BIT') 
result = MessagePack.unpack(redis_val)