Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Ruby合并和更新Redis中的哈希键_Ruby_Json_Redis - Fatal编程技术网

使用Ruby合并和更新Redis中的哈希键

使用Ruby合并和更新Redis中的哈希键,ruby,json,redis,Ruby,Json,Redis,我有一个包含以下哈希的列表: { key_main1: { k1: 1, k2: 11, k3: 33, k4: 146, k5: 12, # etc }, key_main2: { k1: 1, k2: 11, k3: 33, k4: 146, k5: 12, # etc }, # etc } 在redis中另存为json: redis_key1 = "redis_ke

我有一个包含以下哈希的列表:

{
  key_main1: {
    k1: 1,
    k2: 11,
    k3: 33,
    k4: 146,
    k5: 12,
    # etc
  },

  key_main2: {
    k1: 1,
    k2: 11,
    k3: 33,
    k4: 146,
    k5: 12,
    # etc
  },

  # etc  
}
在redis中另存为json:

redis_key1 = "redis_key1"
redis.set("redis_key", my_hash.to_json)
redis.get("redis_key") # =>
"{"key_main":{"k1":1,"k2":11,"k3":33,"k4":146,"k5":12}}"
哈希具有相同的结构,但可以有不同的键。在每次迭代中,我希望通过将“k”的值相加或/或插入不存在的键来更新现有键: 所以列表中的第二个散列如下所示

{
  key_main1: {
    k3: 44,
    k4: 14,
    k18: 99
  },

  key_main3: {
    k2: 77
  }

}
然后在第二次迭代后,Redis中的结果将如下所示:

{
  key_main1: {
    k1: 1,
    k2: 11,
    k3: 33,
    k4: 160,
    k5: 12,
    k18: 99

  },

  key_main2: {
    k1: 1,
    k2: 11,
    k3: 33,
    k4: 146,
    k5: 12
  },

  key_main3: {
    k2: 77
  }
}

最简单和最好的方法是什么?我是否必须在每次迭代中解析(还原)json以检查键是否存在并更新或插入它们?

最好的方法是将json解析回哈希,否则您将很难弄清楚如何组合哈希

要将它们结合起来,最好且最简单的方法是:


此代码假定
h1
h2
中的键始终包含一个带有整数键的哈希。

h1.merge(h2)
h2.merge(h1)
?@AlexanderSupertramp相同,当您在块中手动合并时,它是。只有
v1
v2
的顺序改变。如果没有块,Ruby会在执行
h1.merge(h2)
时为重复键选择
h2
h1 = { m1: { k1:  10, k2: 20, k3: 30 }, m2: { k1: 11, k2: 12 } }
h2 = { m1: { k1: 500, k2:  5, k4: 40 }, m3: { k2: 123 } }

pp h1.merge(h2) { |key, v1, v2|
   v1.merge(v2) { |key, v1, v2| v1 + v2 }
}

=> { :m1 => { :k1 => 510,:k2 => 25, :k3 => 30, :k4 => 40 },
     :m2 => { :k1 => 11, :k2 => 12},
     :m3 => { :k2 => 123 } }