2012-10-11 34 views
5

Tengo un problema al almacenar un hash MessagePacked en Redis. He pegado un caso de prueba a continuación. Al extraer los datos empaquetados de Redis y desempacarlos, el hash está ligeramente dañado. Esto parece suceder cuando los valores hash están más allá de cierta longitud, aunque no puedo decir eso con seguridad.Almacenar un hash MessagePacked en Redis

Estoy usando Redis 2.4.17 (configuración predeterminada), Ruby 1.9.3p194, MessagePack 0.4.7, y Redis gem 3.0.2. El mismo problema ocurre con el nodo, así que supongo que el problema está en MessagePack o Redis. ¿Algunas ideas?

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 

Respuesta

10

MessagePack se trata en bytes sin procesar, que están marcados como codificación 'ASCII-8BIT'. Sin embargo, sus datos empaquetados vuelven de Redis marcados como en codificación UTF-8. Para que MessagePack se pueda descomprimir correctamente, debe forzarlo a interpretarlo como bytes sin formato.

Por lo tanto, cambiar esta línea ...

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

a algo como esto ...

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