存储Redis的一个MessagePacked哈希(Storing a MessagePacked

2019-09-23 22:50发布

我在存储Redis的一个MessagePacked散的问题。 我已经粘贴下面的测试情况。 当从Redis的拉出数据打包和拆包它,哈希轻微损坏。 这似乎当散列值超过一定长度的情况发生,但我不能说肯定。

我使用Redis的2.4.17(默认配置),红宝石1.9.3p194,MessagePack 0.4.7和Redis的宝石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

Answer 1:

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)


文章来源: Storing a MessagePacked hash in Redis