2012-02-28 37 views
3

我使用Redis作为nosql数据库(并真正享受它),但有些情况下它不是更方便(我知道不是每个数据模型都可以与nosql一起使用,但仍然是...)。
我想知道是否有合适的方法在Redis中执行以下操作,或者我确实需要改为使用RDMS。用nosql重复信息?

比方说,我有2个OBJETS:

- User 
- Asset 

的资产可以是一个“平”,一个“建筑”或“家”。

我使用名为“资产”一Redis的列表收集的资产,如:

assets = [asset:1, asset:2, ....] 

每个资产的哈希,如:

asset:1 = {type: flat, value: 150000$} 

我怎样才能得到所有的资产清单类型“平”的?

最简单的方法是迭代资产列表并检查每个资产的类型,这是线性的,因此看起来相当不错。

有没有更好的解决方案?

有一个新的列表可能是有用的:“单位”将包含类型为“flat”的资产的引用,但是这个新闻列表会导致开销,因为我们需要确保它是同步的。

flats = [asset:1, asset:5, ...] 

但是,这导致数据复制......这是不好的......这仍然是与nosql的方式?

其他建议?

回答

4

我通常会建立一个包含索引的第二个键。因此,当您编写新资产时,您会将其写入您的资产集和您的一组特定资产类型。这是开销,但这与您在其他数据库中遇到的开销相同,只是在前面。索引总是需要额外的写入,Redis只是很明显地发现了这种情况。

而且,我也只是存储ID在你的“资产”组,而不是资产:1,只储存1

+0

感谢找你吧,就是用NoSQL的,我们看到的开销清楚。关于最后一点,如果我也要为用户使用一个列表,你是否也只使用索引:users = [2,4,9],assets = [1,5]?我没有使用这种方法,但我只是担心用户和资产的关键问题没有很好地分开。 – Luc 2012-02-28 16:00:55

+0

如果我们建立与RDMS相同的索引机制,那么nosql有什么优势呢?我会说,就像Redis在RAM中一样,优势在于可扩展性和性能,但它如此明显? – Luc 2012-02-28 16:09:25

+0

@Luc嗯,密钥的名称可以范围的ID。它是“user”类型的值“1”,因此您知道构建关键用户:1 您的观点对于关系数据库是有效的。有控制论。你有更细粒度的控制。我认为大多数人不得不使用redis来模拟他们的数据,即使他们没有使用它们,所以他们可以看到每个请求实际上会发生什么。 Oracle会隐藏它,redis让你看看它。 – menacingly 2012-02-28 16:15:12