【问题标题】:Redis modellingRedis 建模
【发布时间】:2012-10-23 20:36:02
【问题描述】:

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

我想出了以下几点:

股票将在下面的哈希中

stk:1 {name:A, 股票代码:val, 扇区:val ..}
stk:2 {name:B, 股票代码:val, 扇区:val ..}

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

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

投资组合中的股票可以设置
用户:1:值(1,3)
用户:2:值 (2,3,4)
用户:1:短期 (1,5)
用户:2:penny (4)

为了为用户添加/删除投资组合,需要 'HGET user:n 投资组合' 后跟一个 HSET

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

【问题讨论】:

    标签: redis


    【解决方案1】:

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

    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

    【讨论】:

      【解决方案2】:

      没有最好的建模方法:这完全取决于您的访问路径。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-30
        • 2020-07-04
        • 1970-01-01
        • 2017-09-04
        • 2011-06-21
        • 2019-04-14
        相关资源
        最近更新 更多