如何在redis中存储此类嵌套对象?

时间:2017-01-21 20:04:44

标签: node.js redis

{
    "chats": {
        "Main": {
            "3": {
                "u": "George",
                "n": "G",
                "f": "1",
                "a": "http://example.com/a.png"
            },
            "4": {
                "u": "Lisa",
                "n": "L",
                "f": "1",
                "a": "http://example.com/b.png"
            }
        }
    }
}

我通常将它存储在node.js

中的对象中

我还需要能够将这些数据发送给用户。我需要做的一个示例是将聊天中的所有用户发送给登录的新用户。

所以这只是:users = obj.chats.Main

但我无法弄清楚如何将它存储在redis中,更不用说我如何获取数据并将其解析回一个对象以发送给用户。

随着越来越多的用户登录,此对象会变得相当大,所以让我们假设一次有10万名用户登录,每次聊天时可能有20位用户。

我需要一套装置才能使这项工作成功,但我认为redis不可能

1 个答案:

答案 0 :(得分:1)

一种简单的方法是将每个聊天设置为Redis用户集,其中每个用户都是包含其数据的JSON字符串。每次聊天都可能有"chat:Main"之类的密钥。然后你会有另一个包含所有聊天键的Set(例如一个名为"chats"的Set,其中包含"chat:Main"等成员。)

现在,如果用户可以出现很多聊天,或者您希望能够轻松更改用户的单个字段(例如,将Lisa的f更改为2),则可以代表每个用户改为使用Redis Hash。在这种情况下,上面提到的集合将包含用户哈希的键,而不是数据本身的JSON字符串。这会使架构复杂化,但根据您的数据和访问模式,它可能会减少内存使用或提高效率。

要获取具有该设计的聊天室信息,您将获取"chat:Main"集的成员,然后在每个成员上循环执行HGETALL。通过使用流水线操作,您可以在两个Redis往返中执行此操作(一个用于获取聊天组的成员,另一个用于执行所有HGETALLs)。或者你可以写一个Lua脚本,并在Redis服务器的一次旅行中做所有事情。