小编典典

在Redis中存储MessagePacked哈希

redis

我在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

阅读 356

收藏
2020-06-20

共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)
2020-06-20