【问题标题】:Complex data structures Redis复杂的数据结构 Redis
【发布时间】:2012-02-07 06:19:51
【问题描述】:

假设我有一个散列的散列,例如

$data = {
    'harry' : {
         'age' : 25,
         'weight' : 75,
    },
    'sally' : {
        'age' : 25,
        'weight' : 75,
    }
}
  1. 存储这种数据结构的“通常”方式是什么(或者您不会?)
  2. 你能直接得到一个值吗(例如 get harry : age ?
  3. 存储后是否可以直接更改子键的值(例如 sally : weight = 100)

【问题讨论】:

  • 另外,我们如何在 Redis 中对这些数据进行排序?就像我想前 10 名获得体重最高的名字。

标签: redis


【解决方案1】:

存储这种数据结构的“通常”方式是什么(或 你不是吗?)

例如,harry 和 sally 将分别存储在单独的 hashes 中,其中的字段表示它们的属性,例如年龄和体重。然后set 结构将保存您存储在 redis 中的所有成员(harry,sally,...)。

你能直接得到一个值吗(例如 get harry : age ?)

是的,请参阅 HGETHMGETHGETALL

存储后,您是否可以直接更改子键的值(例如 莎莉:体重 = 100)

是的,请参阅HSET

【讨论】:

  • 谢谢 - 所以它必须存储在多个操作中?例如我不能一口气存储数据结构?显然,这只是一个相当琐碎的示例,想要存储更复杂的“对象”,也许我不明白这是否是正确的方法?
  • 整个redis基于其高级数据结构中的简单操作。您可以尝试查看ohm,它可能会为您抽象一些东西。
  • 你也可以在Lua写自己的脚本;应用程序可以发送一个 Lua 脚本,就像它是一个 EVAL 查询一样,它将在 Redis 服务器上执行,让您的 Lua 脚本运行多个 Redis 命令,而无需通过网络进行多次往返。
【解决方案2】:

让我们获取一个我们必须存储在 redis 中的复杂数据, 比如这个:

  $data = { 
            "user:1"  : {
                       name : "sally",
                       password : "123"
                       logs : "25th october" "30th october" "12 sept",
                       friends : "34" , "24", "10"
                   } 
            "user:2"  :{
                       name : ""
                       password : "4567"
                       logs :
                       friends: ""
                   }
          }

我们面临的问题是朋友和日志是列表。 因此,我们可以在 redis 中表示这些数据的方法是使用哈希并列出类似这样的内容:

选项 1. 以 user:1 和 user:2 为键的哈希映射

      hmset user:1 name "sally" password "12344"
      hmset user:2 name "pally" password "232342"
      create separate list of logs as 
              logs:1 { here 1 is the user id }
              lpush logs:1 "" "" "" 
              lpush logs:2 "" "" ""
      and similarly for friends.

选项 2:将转储的 json 数据作为字符串编码的哈希映射

      hmset user:1 name "sally" password "12344" logs "String_dumped_data" friends "string of dumped data"

选项 3:这是#1的另一种表示

      something like user:1:friends -> as a list 
      and            user:2:friends -> as a list 

如果我错了,请纠正我。

【讨论】:

  • 是的,作为 Redis 的初学者,这些是我能想到的解决方案。但更进一步的考虑是查询。假设您需要获取所有将“24”作为“朋友”的用户的所有日志。在情况 1 中,您必须阅读所有朋友列表并收集用户 ID,然后获取所有日志。 (=强制往返)如果是 2,我不知道 redis 是否有能力查询转储的 json 数据。以及表现如何。要添加第三种情况,可以说“朋友”是一种更恒定的数据类型,例如“权利”这样的结构是否有意义?用户:21:朋友:23-43-12 - > 作为列表
  • 对于这种情况我们可以使用 EVAL 命令进行内部 lua 处理
【解决方案3】:

取决于你想做什么,但如果你的数据结构不是更深的嵌套并且你需要访问每个字段,我建议使用哈希:http://redis.io/commands#hash

这里是对 redis 数据类型的一个很好的概述,每个数据类型都有 pro 和 contra:http://redis.io/topics/data-types

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-06
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    相关资源
    最近更新 更多