[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.'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)
from https://stackoverflow.com/questions/12830670/storing-a-messagepacked-hash-in-redis by cc-by-sa and MIT license
'REDIS' 카테고리의 다른 글
[REDIS] 어떻게 부팅시 자동으로 구조 노동자를 만들려면 어떻게해야합니까? (0) | 2020.01.23 |
---|---|
[REDIS] 세션 타임 아웃은 푸른 레디 스 캐시 세션 상태 제공자에 슬라이딩되지 않는다 (0) | 2020.01.23 |
[REDIS] 봄 RedisTemplate는 : 후 8 호출 방법 키 중단까지 (0) | 2020.01.23 |
[REDIS] 이 웹 브라우저에서 좋은의 레디 스 클라이언트를 구현하기 위해 무엇을 취할 것인가? (0) | 2020.01.23 |
[REDIS] 어떻게 레일에서 임의의 객체를 캐시 (시간 기준)? (0) | 2020.01.23 |