2012-10-23 21 views
0

模拟以下场景的最佳方式是什么?用户有多个投资组合,每个投资组合有多个股票Redis建模

我想出了以下内容:

库存将在哈希如下

STK:1 {名称:A,证券代码:VAL,部门:VAL ..}
STK: 2 {名称:B,代码:VAL,扇区:VAL ..}

用户可以是如下的哈希:(是它更好地seperately存储组合为用户为一组?)

用户: 1 {k1:val1,k2:val2,投资组合:“价值|增长|短期”}
用户:2 {K1:VAL3,K2:VAL4,组合: “值|防御|便士”}

在股票投资组合可以是套
用户:1:值(1,3)
用户:2:值(2,3,4)
用户:1:短期(1,5)
用户:2:便士(4)

为了添加/移除组合为用户,它需要'HGET user:n portfolio'后跟一个HSET

这是一个很好的方式来模拟用户数和portf奥利斯成长?

回答

2

有没有最好的方法来建模:这一切都取决于您的访问路径。

例如,如果您从用户角度系统地访问数据,您的提议将会运行良好。如果你想知道哪些用户在他们的投资组合中有某种股票,它将会非常糟糕。所以我的建议是列出所有预期的访问路径并检查它们是否被数据结构覆盖。

假设您只需要用户视角,我宁愿实现投资组合作为一个单独的集合,而不是将序列化的列表存储在用户哈希中:他们将更容易维护。因为您可以使用流水线(或脚本)在单个往返中运行多个命令,所以没有实际的开销。

4

如果用户可以有多个投资组合类型,那么最好将他们分成他们自己的集合。

sadd user:1:portfolios value growth "short term" 

这使得从为所述一组主叫srem user:1:portfolios value简单用户移除组合(当然除去“用户:ID:TYPE”集)。

当您要查找的股票基于投资组合类型,你可以这样做使用sunionstoresort命令(在Ruby中的例子)用户:

keys = redis.smembers('user:1:portfolios').map do |type| 
    "user:1:#{type}" 
end 

redis.multi do |r| 
    r.sunionstore "user:1:stocks:_tmp", *keys 
    r.sort "user:1:stocks:_tmp", get: ["stk:*->name", "stk:*->ticket"] 
    r.del "user:1:stocks:_tmp" 
end 

stk:*->name只会返回name的哈希值。如果要获取散列中的所有条目,请使用'KEY-> HASHKEY'语法指定它们中的每一个条目。

http://redis.io/commands/sort