跟踪用户活动的最具可扩展性的方法是什么?

时间:2010-12-21 16:21:23

标签: mysql coldfusion language-agnostic

我想跟踪某些用户活动并使用时间限制限制此活动。这方面的一个例子可能是SO强制执行的每日投票数。以下哪种方法在可扩展性和易用性方面提供了更好的解决方案?

  • 在数据库中存储活动信息
  • 在应用程序范围内存储活动信息
  • 使用完全不同的方法来跟踪此信息

方法1:

  • 优势:数据完整性,这在我的用例中并不重要。
  • 缺点:需要数据库交互,存储冗余数据,需要预定事件才能重置被跟踪的值

方法2

  • 优势:不需要数据库交互,看起来更容易
  • 缺点:由于需要跟踪大量用户群,或者使用数百个密钥查找和操作struct数据是多么容易,我不确定对应用程序内存的影响

如果重要的话,我正在使用ColdFusion和MySQL。

1 个答案:

答案 0 :(得分:1)

假设您只关心每个人的这些数据,并且不会得到这个数据的聚合,我建议你选择支持TTL的key / val商店。 Redis听起来很符合你的要求。

  • 虽然它在内存中运行,但它会定期对磁盘进行快照(这意味着速度很快,如果出现故障,你会得到最多的东西)。

  • 轻松互动,与“方法2”一样,但无需担心管理大型内存结构。

示例设置

使用每日SO点数情景,我们将有一天的时间范围,我们的值将是一个简单的值,在某些用户活动中递增。

我们的密钥将是用户ID和当前时间范围(在本例中为日期)的组合。在我们设置了密钥后,我们设置了一个ttl,这意味着在今天结束后,密钥最终将会过期并自行清理。

redis> incr user123-2011-10-09
(integer) 1  # no value found for key, defaulting to 1
             # if this key already had a value it would be incremented.

redis> expire user123-2011-10-09 86400
(integer) 1  # expiration of 1 day was successful

redis> get user123-2011-10-09
"1"          # current value of user key

有关这些命令的更多信息(incr,get,expire和ttl对您最感兴趣)可以在redis commands reference上找到(完成交互式shell以尝试这些操作)。

修改

这种方法显然可以应用于任意数量的k / v存储,我在这里使用Redis作为一个具体的例子,因为我认为它非常符合要求。