【问题标题】:How should I store this object in Redis?我应该如何将这个对象存储在 Redis 中?
【发布时间】:2011-11-17 10:27:51
【问题描述】:
parent = {
    child0: {
        data1:'foo',
        data2: 'bar'
    },
    child1: {
        data1:'foo',
        data2: 'bar'
    },
    child2: {
        data1:'foo',
        data2: 'bar'   
    }
}

起初我想我会设置一个parent:child 键,因为我需要单独的兄弟数据。但在某些情况下,我需要返回父级中的所有数据。

我应该把整个对象放在parent 键中吗?

如果很多 get 和 set 可能只针对其中一个孩子,这是否有不利之处?

有没有办法使用parent:child 架构调用所有父数据?

谢谢!

【问题讨论】:

    标签: javascript json node.js redis


    【解决方案1】:

    尝试一个哈希 - 让你 HGET 只得到一个孩子,HGETALL 得到所有孩子。

    不过,将整个对象作为 JSON 存储在一个键中也是有效的,如果您的用法合适,可以让您的代码保持简单。如果数字不是太大,即使只需要显示一个子对象,也总是检索​​整个对象可能是有意义的。

    避免将复杂对象存储在单个键中的主要原因是写入冲突 - 如果两个连接可以同时修改一个对象的不同子级,则哈希将少得多麻烦。

    【讨论】:

    • 啊,是的,所有子对象都将同时被编辑。我应该在单个键上尽可能避免这种情况?
    • 是的 - redis 足够快,冲突不太可能发生,但它们会在最不方便的时候发生并导致难以发现的错误。使用散列或多个键,每个项目都是独立的,因此不可能发生冲突。
    • 啊,好吧,如果我使用哈希功能可以在同时更改两个不同的孩子时减轻冲突?
    • 对,因为 redis 使用单独的原子命令处理它们,所以您只需要处理两个用户修改同一个孩子的可能性,这种可能性要小得多。
    【解决方案2】:

    您可以考虑利用散列数据类型。使用父级作为哈希的键,对特定子级使用(HGET 键字段)或对所有子级使用(HKEYS 键)。

    如果有人会发布哈希命令 HSET 和 HGET 的基准,那将会很有趣。列表操作的基准(LPUSH 88109.25 /sec)虽然慢(~23%)(SET 114293.71 /sec)。尽管列出了 O(1),但大概 HSET 仍然较慢。

    因此,我认为您可以通过查看代码中全家人请求与单个孩子请求的比率来加快优化决策。

    【讨论】:

    • 感谢您的建议。如果子进程本质上会同时被设置怎么办。 HGET/HSET 能否管理这些差异?
    • 虽然我最初以为您在谈论事务,但我认为 HMSET 命令是您在同时设置多个哈希值(子项)时要寻找的。​​span>
    猜你喜欢
    • 1970-01-01
    • 2016-12-11
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    • 2015-09-16
    • 2012-08-16
    相关资源
    最近更新 更多