我该如何在Redis中存储这个对象?

4
parent = {
    child0: {
        data1:'foo',
        data2: 'bar'
    },
    child1: {
        data1:'foo',
        data2: 'bar'
    },
    child2: {
        data1:'foo',
        data2: 'bar'   
    }
}

起初我想设置一个`parent:child`键,因为我需要单独获取其兄弟节点的数据。但在某些情况下,我需要返回父级内的所有数据。
我应该将整个对象放入一个`parent`键中吗?
如果很多get和set只针对其中一个子元素,这样做会有什么缺点吗?
有没有一种方法可以使用`parent:child`模式调用所有父级数据?
谢谢!
2个回答

2
尝试使用哈希表 - 这将使您可以使用HGET获取一个子元素,使用HGETALL获取所有子元素。
虽然将整个对象作为JSON存储在单个键中也是有效的,但如果您的使用情况适合,则可以使您的代码简洁。如果数字不太大,即使您只需要显示一个子对象,始终检索整个对象可能是有意义的。
避免将复杂对象存储在单个键中的主要原因是写冲突 - 如果两个连接可以同时修改一个对象的不同子项,则哈希表会更少出现问题。

啊,是的,所有子对象将同时被编辑。我应该尽可能避免在单个键上进行此操作? - fancy
是的 - Redis 的速度足够快,冲突不太可能发生,但它们会在最不方便的时候发生,并引起难以找到的错误。使用哈希或多个键,每个项目都是独立的,因此冲突是不可能的。 - Tom Clarkson
啊,好的,那么如果我使用哈希特性,这将减轻在同时更改两个不同子项时出现冲突的情况吗? - fancy
由于Redis使用单独的原子命令处理它们,因此您只需要处理两个用户修改同一子项的可能性,这种情况要少得多。 - Tom Clarkson

0

您可能考虑利用哈希数据类型。使用父级作为哈希的键,并使用(HGET key field)获取特定子项或(HKEYS key)获取所有子项。

如果有人发布哈希命令HSET和HGET的基准测试结果,那将是很有趣的事情。列表操作的基准测试结果(LPUSH 88109.25 / sec)较慢((SET 114293.71 / sec)大约慢了23%)。据推测,HSET的速度比列表操作慢,但其时间复杂度为O(1)。

因此,我认为您可以通过查看代码中全家族请求与单个子请求的比率来进行速度优化决策。


谢谢你的建议。如果子进程本质上将同时被设置,那该怎么办?HGET/HSET能够处理这些差异吗? - fancy
虽然我最初认为你在谈论事务,但我认为HMSET命令是你同时设置多个哈希值(子项)时正在寻找的内容。 - Charles Short

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