嗨,我正在建立一个简单的电影网站,我正在使用谷歌数据存储作为我的后端。
我需要设计每天,每周,每月,所有时间的顶级电影下载量。
现在我只跟踪下载的数量,例如:数据库就像电影的一行,num_of_downloads作为一列,每当用户下载电影时,我就会递增这个字段。
Movie Id | Title | Description | num_of_downloads现在最好的方式是显示每天,每周,每月,所有时间的电影下载量。
我正在考虑实现一个带有电影密钥和日期字段的新表,以跟踪每天的下载量,我可以用它来计算问题的其余部分。
Movie ID, Date, Downloads
M1 01/01/2017 1000
M2 01/01/2017 100
M1 02/01/2017 2000我不确定这是不是设计appengine数据存储的最好方法,也不确定这周写查询来获得前十的下载量,这个月是困难的,因为它不像sql查询那么简单。
发布于 2017-06-11 00:59:00
如果您希望总数100%正确,那么在数据存储中这不是一个容易解决的问题。涉及手动更新这样的计数器。
对于您的情况,更好的方法是将下载数据导出或流式传输到bigquery或google analytics,同时为这些请求提供服务。然后,单个每日cron可以计算统计数据并将其缓存到数据存储或memcached等位置。
分析是免费的,但统计数据并不准确。Bigquery有成本,但对于你的情况来说,它们很低,因为它主要是存储(便宜)和每天3次查询(便宜)
发布于 2017-06-11 01:49:15
数据存储区非常有限,不适合用于统计。我同意Zig的观点,你应该使用替代服务来解决这个问题。
我建议您简单地使用Cloud SQL,并为每个下载的电影保留一条记录,并将您获得的所有信息添加到该记录中。由于这与下载电影的数量有关,因此数量将是有限的。只要你使用正确的索引和缓存,我很难想象这会导致任何延迟,定价或配额问题。
如果您想向我们的用户显示更多指标,或者您希望将其用于内部目的,在sql中提供所有可用信息稍后都会很方便。
发布于 2017-06-11 22:21:04
我将对其他两个答案提出不同意见,并建议一个可能的应用程序引擎解决方案。
创建一个实体,用于累计每天的统计数据:
class MovieStats(ndb.Model):
day = ndb.DateTimeProperty()
movies = ndb.KeyProperty(repeated=True)然后为每个电影下载更新当天的MovieStats实体。当然,您需要使用事务来执行此操作,并且以避免争用的方式执行此操作。一种解决方案是分片计数器,但我真的很喜欢Nick Johnson在两篇博客文章中描述的解决方案:
我不想在这里重复这些帖子,但基本思想是,对于每个电影下载,您将一个任务添加到拉取队列中,以更新该电影的计数器。然后,每分钟(或其他时间间隔)处理一次pull队列中的所有任务,并更新事务中的MovieStats实体。
为了处理拉取队列任务,您可以使用每分钟启动一次的cron作业,或者使用上面描述的“按需”CRON作业。每次将任务添加到拉取队列时,都会创建一个工作任务(常规推送队列)来处理拉取队列中的任务。对于工作任务,添加与时间间隔相对应的任务名称,以确保在该时间间隔中只有一个工作任务。它允许您获得1分钟CRON作业的好处,但它只在需要时运行,因此您不会在不需要时运行CRON作业。
https://stackoverflow.com/questions/44475053
复制相似问题