2012-10-11 10 views
5

Ho riscontrato un problema durante l'archiviazione di un hash MessagePacked in Redis. Ho incollato un caso di test qui sotto. Quando estrae i dati compressi da Redis e li spacchetta, l'hash è leggermente danneggiato. Questo sembra accadere quando i valori hash sono oltre una certa lunghezza, anche se non posso dirlo con certezza.Memorizzazione di un hash di MessagePacked in Redis

Sto usando Redis 2.4.17 (configurazione di default), Ruby 1.9.3p194, MessagePack 0.4.7 e Redis gemma 3.0.2. Lo stesso problema si verifica usando il nodo, quindi presumo che il problema sia in MessagePack o Redis. Qualche idea?

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 

risposta

10

Le offerte di MessagePack in byte non elaborati, contrassegnate come codifiche ASCII-8BIT. Tuttavia, i dati compressi tornano da Redis contrassegnati con la codifica UTF-8. Per poter decomprimere con successo MessagePack, devi forzarlo a interpretare come byte non elaborati.

Pertanto, modificare questa riga ...

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

a qualcosa di simile ...

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