当前位置: 首页 > 面试题库 >

在Redis中存储MessagePacked哈希

郤旭东
2023-03-14
问题内容

我在Redis中存储MessagePacked哈希时遇到问题。我在下面粘贴了一个html" target="_blank">测试用例。从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)


 类似资料:
  • 问题内容: 我对Redis还是很陌生,希望看看是否有可能。想象一下我正在接收这样的数据: 并为另一个帐户接收此数据: 我想以类似的格式将这些数据保留在Redis中: 对于xyz: 所以问题是我应该使用哪种数据类型来存储此Redis? 问题答案: 如果您的目标是检查是否用作该帐户的解决方案,则解决方案应类似于: 样本数据 执行此操作( 使用redis集 ): 然后,您可以通过以下命令检查是否用作该帐

  • 问题内容: 我想在redis中存储哈希数组,最好的编码方法是什么? 问题答案: AFAIK的唯一方法是取消引用它们。假设您有2个散列数组,例如:。 您将它们分别存储,然后创建一个引用它们全部的SET: 然后,您可以通过查询set:来检索它们全部,然后调用所有返回的键来重建原始的哈希数组。 我希望这是有道理的。而且,如果您找到了更聪明的方法,我将很高兴听到。

  • 问题内容: 我有一个简单的问题,当我想将SHA1哈希的结果存储在MySQL数据库中时发生: 我将散列结果存储在 VARCHAR 字段中多长时间? 问题答案: 我将使用可变长度的数据,但不使用固定长度的数据。由于SHA-1值 始终为 160位长,因此将仅在固定长度字段的长度上浪费一个额外的字节。 而且我也不会存储返回的值。因为每个字符只使用4位,因此需要160/4 = 40个字符。但是,如果每个字符

  • 问题内容: 我有很多不同提供商的IP范围。例如 我将此IP转换为int32: 我的任务: 通过用户IP地址查找提供者名称(例如192.168.2.20(3232236052)) 在MySQL中很简单: Redis怎么做? 问题答案: 这取决于您是否认为您的IP范围可以重叠。如果不是,则解决方案非常简单: 使用哈希的集合来存储提供者数据 使用zset索引范围的最大值 检索最大值大于IP的(唯一)范围

  • 问题内容: 可以说我有一个由几个属性(ID,名称,Surename,Age)组成的对象(用户)。哪种方法最好在Redis中存储该对象? 将每个属性值存储在专用密钥中,例如,用户:{id}:id,用户:{id}:name,用户:{id}:surename,用户:{id}:age 将整个User对象作为JSON字符串存储在一个密钥中,例如user:{id}:json(密钥的值将如下所示:{“ ID”:

  • 问题内容: 这就是事情- 我想在特定键下的redis中存储本机JS(node.js)对象(闪存套接字引用)。当我简单地做到这一点时,它存储为一个字符串。当我尝试获得价值时,我得到的只是一个字符串。 有机会工作吗?这是我的代码: 问题答案: 下载者:这里的上下文是SET命令,可以存储任意对象。 不,你不能那样做。您应该接受以下事实:Redis将所有内容存储为字符串(毕竟,协议是基于文本的)。Redi