Ruby 在Redis中存储MessagePacked哈希

Ruby 在Redis中存储MessagePacked哈希,ruby,redis,msgpack,messagepack,Ruby,Redis,Msgpack,Messagepack,我在Redis中存储MessagePacked哈希时遇到问题。我在下面粘贴了一个测试用例。当从Redis中取出打包的数据并将其解包时,散列会稍微损坏。当散列值超过一定长度时,就会出现这种情况,尽管我不能肯定这一点 我使用的是Redis2.4.17(默认配置)、Ruby1.9.3p194、MessagePack 0.4.7和RedisGem3.0.2。使用node时也会出现同样的问题,所以我假设问题出现在MessagePack或Redis中。有什么想法吗 require 'redis' requi

我在Redis中存储MessagePacked哈希时遇到问题。我在下面粘贴了一个测试用例。当从Redis中取出打包的数据并将其解包时,散列会稍微损坏。当散列值超过一定长度时,就会出现这种情况,尽管我不能肯定这一点

我使用的是Redis2.4.17(默认配置)、Ruby1.9.3p194、MessagePack 0.4.7和RedisGem3.0.2。使用node时也会出现同样的问题,所以我假设问题出现在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

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)