2012-10-11 10 views
5

Mam problem z przechowywaniem skrótu MessagePacked w Redis. Wkleiłem poniższy przypadek testowy. Podczas wyciągania spakowanych danych z Redis i rozpakowania ich, skrót jest nieco uszkodzony. Wydaje się, że dzieje się tak, gdy wartości mieszania przekraczają pewną długość, chociaż nie mogę tego powiedzieć na pewno.Przechowywanie skrótu MessagePacked w Redis

Używam Redis 2.4.17 (domyślna konfiguracja), Ruby 1.9.3p194, MessagePack 0.4.7 i klej Redis 3.0.2. Ten sam problem występuje przy użyciu węzła, więc zakładam, że problem leży w MessagePack lub Redis. Jakieś pomysły?

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 

Odpowiedz

10

Pakiet MessagePack zawiera nieprzetworzone bajty, które są oznaczone jako "ASCII-8BIT". Jednak Twoje spakowane dane wracają z Redis oznaczonego jako kodowanie UTF-8. Aby pakiet MessagePack mógł się pomyślnie rozpakować, musisz go zmusić do zinterpretowania jako surowych bajtów.

Dlatego zmienić tę linię ...

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

do czegoś takiego ...

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