5

我在 Redis 中存储 MessagePacked 哈希时遇到问题。我在下面粘贴了一个测试用例。从 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 回答