2012-10-11 30 views
5

Tôi gặp sự cố khi lưu trữ một băm MessagePacked trong Redis. Tôi đã dán một trường hợp thử nghiệm dưới đây. Khi rút ra các dữ liệu đóng gói từ Redis và giải nén nó, băm là hơi bị hỏng. Điều này dường như xảy ra khi các giá trị băm vượt quá một độ dài nhất định, mặc dù tôi không thể nói chắc chắn.Lưu trữ một băm MessagePacked trong Redis

Tôi đang sử dụng Redis 2.4.17 (cấu hình mặc định), Ruby 1.9.3p194, MessagePack 0.4.7 và đá quý Redis 3.0.2. Vấn đề tương tự xảy ra khi sử dụng nút, vì vậy tôi giả định rằng vấn đề nằm trong MessagePack hoặc Redis. Bất kỳ ý tưởng?

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 

Trả lời

10

Ưu đãi gói trong byte nguyên, được đánh dấu là mã hóa 'ASCII-8BIT'. Tuy nhiên, dữ liệu được đóng gói của bạn sẽ trở lại từ Redis được đánh dấu là mã hóa UTF-8. Để MessagePack được giải nén thành công, bạn cần buộc nó trở lại để được hiểu là byte thô.

Do đó, thay đổi dòng này ...

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

một cái gì đó như thế này ...

redis_val = redis.get('my_key').force_encoding('ASCII-8BIT') 
result = MessagePack.unpack(redis_val) 
Các vấn đề liên quan