【问题标题】:Database queries vs quick response数据库查询与快速响应
【发布时间】:2012-02-16 15:35:17
【问题描述】:

我们正在为我们的论坛制作一个游戏化组件,该组件正在 Django 中开发。我们希望用户在实现特定目标后立即获得徽章。但是,我们担心会进行的数据库查询量。例如,如果帖子获得一定数量的浏览量,则获得一个徽章。如果每次查看帖子时都检查徽章的条件,那将是很多查询。我们唯一的其他选择是在特定时间间隔或其他事件中进行检查,例如用户查看他们的个人资料吗?由于延迟,从用户的角度来看,这不是最佳选择。

【问题讨论】:

  • SO 有延迟,从用户的角度来看是可以的。
  • 确实,我想知道是否有办法进一步了解 SO 的徽章系统?
  • 您是否考虑过使用信号更新计数器字段并在达到预期目标时分配徽章的可能性?
  • @nabucosound:是的,这就是我们一直在做的事情,我们使用数据库表来记录统计信息,包括查看次数,因此每次查看帖子时,都会调用数据库查询获取“views”的值(在这种情况下,对超过一定数量的视图的所有问题求和)。如果有很多人使用该网站,就会有很多数据库调用只是为了检查徽章的条件,这可能会占用太多资源。这就是我担心的问题

标签: database django optimization architecture


【解决方案1】:

有一种不同的方法可能适合您,使用网络服务器日志记录和后处理该日志以生成统计信息。我已经在 Apache 中将它用于一些需要浏览量点击计数的项目。其他网络服务器的类似配置也可以正常工作。

我使用 django.contrib.contenttypes 记下此示例中访问的对象的内容类型 ID 和对象 ID,但您当然可以记录任何您想要的内容。

因此,在您的 Apache 虚拟主机 conf 文件中,添加这样的 LogFormat 指令:

LogFormat "%{X-H-CID}o|%{X-H-OID}o" hitcounter

然后将其附加到 CustomLog:

CustomLog path/to/your/logfile.log hitcounter

这将使 Apache 能够将以下 HTTP 标头写入日志文件:X-H-CID 和 X-H-OID,它们代表被命中对象的 ContentType ID 和 Object ID。从一个视图中,您可以将标头添加到 HttpResponse:

ctxt = RequestContext(request) 
rendered = render_to_string(template, ctxt)
http_res = HttpResponse(rendered) 
http_res['X-H-CID'] = content_type_id
http_res['X-H-OID'] = object_id

将 content_type_id 和 object_id 替换为您的真实对象道具。

这个例子应该写这样一行:

16|4353

其中 16 是内容类型 ID,4353 是对象 ID。最后,您可以安排一个 django 自定义命令来处理该日志文件并执行所需的操作。

【讨论】:

  • 嗨nabucosound!感谢您的回答,我想知道在数据库中记录访问历史是否与将它们写入文件相同?我主要关心的是应该在什么时候执行计算以授予用户徽章,以便用户或多或少“准时”获得徽章,同时不会消耗太多服务器资源。
  • 如果您使用上述解决方案,您将必须设置一个 cron 作业来解析日志并相应地更新标记。越频繁(例如每分钟),您的用户收到徽章的同步就越多。
  • 我不知道您的预期流量,但我猜您可以运行数据库方法并监控您的性能。或者,也许您可​​以设置一个不同的数据库来维护这些徽章,并使用 Django 的多数据库功能和路由器将其链接到您的项目......
  • 感谢 nabucosound!答案对于观看次数来说有点过于具体,这只是一种特定类型的徽章。对于我的问题,日志记录方法似乎有点过头了。目前,我将尝试在每次触发信号(用户执行操作)时评估徽章条件。并在测试中查看流量是否过于繁重。
猜你喜欢
  • 2017-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-23
  • 2011-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多