5

MessagePacked ハッシュを Redis に保存する際に問題が発生しています。以下にテストケースを貼り付けました。圧縮されたデータを Redis から取り出して展開すると、ハッシュがわずかに壊れています。確かなことは言えませんが、これはハッシュ値が特定の長さを超えている場合に発生するようです。

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
4

1 に答える 1

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)
于 2012-10-11T03:59:10.553 に答える