在Redis中存储一个MessagePacked哈希

5
我在存储一个MessagePacked哈希表到Redis时遇到了问题。下面是一个测试用例。当从Redis中取出打包的数据并解包时,哈希表会略微损坏。虽然我不能确定,但这似乎发生在哈希值超过某个长度时。
我使用的是Redis 2.4.17(默认配置),Ruby 1.9.3p194,MessagePack 0.4.7和Redis gem 3.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
1个回答

10

MessagePack处理原始字节,这些字节标记为“ASCII-8BIT”编码。然而,从Redis返回的打包数据标记为UTF-8编码。为了使MessagePack成功解包,您需要强制将其重新解释为原始字节。

因此,请更改此行...

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

转换成像这样的东西...

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接