【问题标题】:Merging and updating hash keys in Redis with Ruby使用 Ruby 合并和更新 Redis 中的哈希键
【发布时间】:2014-11-12 17:26:45
【问题描述】:

我有一个以下哈希列表:

{
  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”s 的值或/并插入不存在的键来更新现有键: 所以列表中的第二个哈希看起来像这样

{
  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 以检查密钥是否存在并更新或插入它们?

【问题讨论】:

    标签: ruby json redis


    【解决方案1】:

    最好的方法是将 JSON 解析回散列,否则您将很难弄清楚如何组合散列。

    要将它们结合起来,最好和最简单的是Hash#merge

    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 } }
    

    此代码假定 h1h2 中的键始终包含带有整数键的散列。

    【讨论】:

    • h1.merge(h2)h2.merge(h1) 一样吗?
    • @AlexanderSupertramp 是的,当您在一个块中进行手动合并时。只有v1v2 的顺序发生了变化。当您执行 h1.merge(h2) 时,Ruby 会选择 h2 作为重复键。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    • 2017-12-18
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    • 2021-02-02
    • 2011-11-19
    相关资源
    最近更新 更多