2011-09-14 47 views
4
parent = { 
    child0: { 
     data1:'foo', 
     data2: 'bar' 
    }, 
    child1: { 
     data1:'foo', 
     data2: 'bar' 
    }, 
    child2: { 
     data1:'foo', 
     data2: 'bar' 
    } 
} 

起初我想我会设置一个parent:child键,因为我需要单独的兄弟姐妹的数据。但在某些情况下,我需要返回父代中的所有数据。我应该如何将此对象存储在Redis中?

我应该把整个物体放在parent的钥匙上吗?

如果有很多获取和设置可能只适用于它的一个孩子,是否有缺点?

有没有办法用parent:child模式调用所有父数据?

谢谢!

回答

2

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

将整个对象作为JSON存储在单个键中也是有效的,并且如果您的使用情况非常合适,则会使代码变得简单。如果数字不是太大,即使只需要显示一个子对象,也可以始终检索整个对象。

避免将复杂对象存储在单个键中的主要原因是写入冲突 - 如果两个连接可以同时修改一个对象的不同子项,那么散列将更不麻烦。

+0

啊,是的,所有的孩子对象都会被同时编辑。我应该尽可能地避免这一个单一的关键? – fancy

+0

yes - redis速度足够快,以至于冲突不太可能发生,但是它们会在最方便的时候发生并且很难找到错误。使用散列或多个键每个项目是独立的,所以冲突是不可能的。 –

+0

好吧,如果我使用哈希功能,可以在两个不同的孩子同时更改时缓解冲突。 – fancy

0

您可能会考虑利用散列数据类型。使用父项作为散列的关键字,并为所有子项使用(HGET键字段)或(HKEYS键)。

如果有人会发布散列命令HSET和HGET的基准测试会很有趣。列表操作的基准(LPUSH 88109.25/sec)比(SET 114293.71/sec)慢了(〜23%)。尽管列出了O(1),但推测HSET仍然较慢。

因此,我认为你可以通过查看代码中完整家庭请求与个别子请求的比率来加快优化决策。

+0

感谢您的建议。如果儿童进程本质上会同时被设定,会怎么样? HGET/HSET可以管理这些差异吗? – fancy

+0

虽然我第一次以为你在谈论事务,但我认为HMSET命令是你在同时设置多个哈希值(子)时所要查找的。 –

相关问题