在Redis中存储MessagePacked哈希

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

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) 
Interesting Posts