【问题标题】:Where should I store user statistics that need to be viewed frequently?我应该将需要经常查看的用户统计信息存储在哪里?
【发布时间】:2010-03-12 21:59:12
【问题描述】:

在我的 Web 应用程序中,我的用户有很多事件。一个这样的事件是“用户更新了 Facebook 状态”。一个用户可能有数百个这种类型的事件,并且有 10 种类型的事件。我需要以非常可扩展的方式显示基于事件的事件计数和其他用户统计信息。这是因为每个用户都可以看到他或她的统计数据。显然,我们无法在用户每次访问网站时都运行每个计算,因此缓存这些统计数据肯定是要走的路。

为“统计”创建一个单独的表是否有意义,该表将为我们缓存的每个统计数据提供一个用户 ID 和一个列?桌子本质上是在起作用,所以我想知道是否有更好或不同的方法来做到这一点。

【问题讨论】:

    标签: database-design caching statistics


    【解决方案1】:

    您可以只计算这些统计信息并将它们放入内存缓存中,根据需要读取/递增它们,因为这些数据不需要持久保存(冷缓存会导致服务器负载峰值,您可能会考虑限制速率登录/计算等)。然而,这种情况是非关系数据存储的理想候选者,例如Cassandra(“高度可扩展、最终一致、分布式、结构化的键值存储”)。 This internal Digg article 读起来很有趣:

    根本问题是地方性的 关系数据库的思维方式,其中 将计算负担置于 读而不是写。这是 大规模网络完全错误 应用程序,其中响应时间是 批判的。情况变得更糟 大多数应用程序的串行性质。 页面的每个组件都阻塞在 从数据存储中读取,以及 操作的完成 来到它面前。

    非关系型数据反向存储 这个模型完全,因为他们 没有复杂的读取操作 的 SQL。模型迫使你改变 您对写入的计算,而 将大多数读取减少到简单 操作——相当于 SELECT * FROM Table.

    【讨论】:

    • Cassandra 非常有趣,感谢您的链接。我正在研究
    • 这是什么意思 - “页面的每个组件都会阻止从数据存储中读取数据,以及完成之前的操作。”
    • 代码是按顺序处理的(即逐行),因此缓慢的操作会减慢它们下面的所有内容。 “blocks on reads”表示等待数据返回。
    • 明白了。对于我的情况,Cassandra 似乎有点过头了,因为重点似乎是防止复杂的连接和读取时间。就我而言,我真的只需要缓存每种类型事件的计数。例如,我有事件类型“用户更新 facebook 状态”。事件表中可能有 5000 万行,我需要通过 userid 和 event_type_id 查询一个 COUNT,所以我可以说“这个用户注册了这个事件 43 次”所以问题不是复杂的查询,而是昂贵的操作。你认为 Cassandra 还值得考虑吗?
    猜你喜欢
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 2018-12-21
    • 1970-01-01
    相关资源
    最近更新 更多