2012-10-11 8 views
5

Ich habe ein Problem beim Speichern eines MessagePacked-Hash in Redis. Ich habe unten einen Testfall eingefügt. Wenn die gepackten Daten aus Redis herausgezogen und entpackt werden, ist der Hash leicht beschädigt. Dies scheint zu passieren, wenn die Hashwerte eine bestimmte Länge überschreiten, obwohl ich das nicht sicher sagen kann.Speichern eines MessagePacked-Hashs in Redis

Ich verwende Redis 2.4.17 (Standardkonfiguration), Ruby 1.9.3p194, MessagePack 0.4.7 und das Redis Juwel 3.0.2. Das selbe Problem tritt bei der Verwendung von Knoten auf, daher nehme ich an, dass das Problem innerhalb von MessagePack oder Redis liegt. Irgendwelche Ideen?

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 

Antwort

10

MessagePack behandelt in rohen Bytes, die als 'ASCII-8BIT' Codierung markiert sind. Ihre gepackten Daten stammen jedoch von Redis, das als UTF-8-Codierung gekennzeichnet ist. Damit MessagePack erfolgreich entpackt werden kann, müssen Sie es erneut als unformatierte Bytes interpretieren.

Daher diese Zeile ändern ...

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

zu so etwas wie ...

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