复杂数据结构 Redis

70

假设我有一个哈希值的哈希值,例如:

$data = {
    'harry' : {
         'age' : 25,
         'weight' : 75,
    },
    'sally' : {
        'age' : 25,
        'weight' : 75,
    }
}
  1. 通常情况下,如何存储这样的数据结构(或者您不会存储它)?
  2. 是否可以直接获取一个值(例如获取harry:age)?
  3. 一旦存储,是否可以直接更改子键的值(例如sally:weight = 100)?

1
还有,我们如何在Redis中对这些数据进行排序?比如我想获取前10个最重的人的名字。 - Bharat Pahalwani
3个回答

43

通常的方式是如何存储这样的数据结构(或者你不会这么做吗?)

例如,哈利和莎莉将分别存储在单独的哈希表中,其中字段表示它们的属性,如年龄和体重。然后,集合结构将保存您在Redis中存储的所有成员(哈利、莎莉等)。

您能直接获取一个值吗(例如获取哈利的年龄)?

可以,参见HGETHMGETHGETALL

一旦存储,您能直接更改子键的值吗(例如sally的体重=100)?

可以,参见HSET


2
谢谢 - 那么它必须存储在多个操作中?例如,我不能一次性存储数据结构吗?显然,这只是一个相当琐碎的例子,我想要存储更复杂的“对象”,也许我还没有理解这是否是正确的方法? - Xrender
1
整个 Redis 基于其先进数据结构之间的简单操作。您可以尝试查看 ohm,它可能会为您抽象出一些东西。 - yojimbo87
2
你也可以使用Lua编写自己的脚本(http://redis.io/commands/eval);应用程序可以将Lua脚本发送到Redis服务器,就像它是一个EVAL查询一样,然后在Redis服务器上执行,让你的Lua脚本运行多个Redis命令而不需要多次通过网络进行往返。 - awhie29urh2

23

让我们考虑一个复杂的数据,我们需要将其存储在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. 使用哈希映射,以用户1和用户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数据内查询的功能。以及性能如何。对于第3种情况,假设“好友”是类似“权限”的常量数据类型,是否可以使用以下结构? user:21:friends:23-43-12 - > 作为列表 - Anestis Kivranoglou
对于这种情况,我们可以使用EVAL命令进行内部Lua处理。 - Alex Shwarc

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接