2012-10-11 9 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が正常に解凍されるためには、元のバイトとして解釈される必要があります。

したがって、この行を変更...

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

このようなものには...

redis_val = redis.get('my_key').force_encoding('ASCII-8BIT') 
result = MessagePack.unpack(redis_val) 
関連する問題