Redis建模

时间:2012-10-23 20:36:03

标签: redis

对以下场景进行建模的最佳方法是什么?用户有多个投资组合,每个投资组合都有多个股票。

我想出了以下内容:

股票将在下面的哈希

stk:1 {name:A,ticker:val,sector:val ..}
stk:2 {name:B,ticker:val,sector:val ..}

用户可以是以下哈希:(最好是将用户的投资组合单独存储为一组吗?)

用户:1 {k1:val1,k2:val2,portfolio:“value | growth | short term”} user:2 {k1:val3,k2:val4,portfolio:“value | defensive | penny”}

投资组合中的股票可以是套数 user:1:value(1,3)
user:2:value(2,3,4)
用户:1:短期(1,5)
user:2:penny(4)

为了为用户添加/删除投资组合,需要“HGET用户:n个投资组合”,然后是HSET

随着用户和投资组合数量的增长,这是一种很好的建模方式吗?

2 个答案:

答案 0 :(得分:4)

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

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

这使得从用户移除投资组合就像在集合上调用srem user:1:portfolios value一样简单(当然还要删除“user: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

答案 1 :(得分:2)

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

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

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