2012-10-11 6 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'인코딩으로 표시된 원시 바이트를 처리합니다. 그러나 포장 된 데이터는 UTF-8 인코딩으로 표시된 Redis에서 다시 나타납니다. MessagePack이 성공적으로 언팩 (unpack)되도록하려면, 원래 바이트로 해석되도록 강제해야합니다. 따라서

이 줄을 변경 ... 이런 식으로 뭔가에
result = MessagePack.unpack(redis.get('my_key')) 

...

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