2012-10-11 92 views
5

我在Redis中存儲MessagePacked散列時遇到問題。下面我粘貼了一個測試用例。從Redis中提取打包數據並將其解包時,散列會輕微損壞。這似乎發生在散列值超出特定長度時,儘管我無法確定這一點。在Redis中存儲MessagePacked散列

我使用Redis 2.4.17(默認配置),Ruby 1.9.3p194,MessagePack 0.4.7和Redis gem 3.0.2。使用節點會發生同樣的問題,所以我假設問題在MessagePack或Redis中。有任何想法嗎?

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

MessagePack處理原始字節,標記爲'ASCII-8BIT'編碼。但是,您的打包數據將從Redis標記爲UTF-8編碼。爲了使MessagePack成功解壓縮,您需要強制它解釋爲原始字節。

因此,改變這一行...

result = MessagePack.unpack(redis.get('my_key')) 

到這樣的事情...

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