복붙노트

[REDIS] 레디 스에서 MessagePacked 해시를 저장

REDIS

레디 스에서 MessagePacked 해시를 저장

나는 레디 스에서 MessagePacked 해시를 저장하는 데 문제가 있어요. 나는 아래의 테스트 케이스를 붙여 넣습니다. 레디 스에서 압축 된 데이터를 당기고 포장을 풀 때, 해시가 약간 손상되었습니다. 해시 값이 일정 길이 이상 때 ​​내가 확실히 말할 수는 없지만이 나타납니다가 발생합니다.

나는 레디 스 2.4.17 (기본 설정), 루비 1.9.3p194, MessagePack 0.4.7, 그리고 레디 스 보석 3.0.2을 사용하고 있습니다. 같은 문제는 문제가 MessagePack 또는 레디 스 내에 있으리라 믿고있어, 그래서 노드를 사용하여 발생합니다. 어떤 아이디어?

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. ==============================

    1.'ASCII-8BIT'인코딩으로 표시됩니다 원시 바이트에 거래를 MessagePack. 레디 스에서 그러나 당신의 압축 된 데이터가오고 다시는 UTF-8 인코딩에있는 것으로 표시했다. 성공적으로 압축을 풀 MessagePack 위해서는, 당신은 원시 바이트로 해석되고 다시 강제 할 필요가있다.

    'ASCII-8BIT'인코딩으로 표시됩니다 원시 바이트에 거래를 MessagePack. 레디 스에서 그러나 당신의 압축 된 데이터가오고 다시는 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)
    
  2. from https://stackoverflow.com/questions/12830670/storing-a-messagepacked-hash-in-redis by cc-by-sa and MIT license