我的网络应用程序在Heroku上使用Django。
该应用有两个组成部分:横幅投放API和报告API。
应用程序提供的横幅广告包含对应用报告API的ajax调用。每次展示都会进行一次此次通话。这样做的目的是记录每个横幅每天获得的展示次数。
报告API简略来源:
def report_v1(request):
'''
/report/v1/?cid=
- cid= the ID of the banner
'''
creative = get_creative(creative_id = request.GET.get('cid'))
if not creative:
return HttpResponseNotFound("404 creative with that ID not found")
day = timezone.now()
fact, created = CreativeFact.objects.get_or_create(
day = day,
app = app,
creative = creative,
defaults = {
'impression_count': 0,
}
)
fact.impression_count += 1
response = HttpResponse("200 OK")
response["Access-Control-Allow-Origin"] = "*"
return response
我的问题:有没有办法避免在每次展示时写入数据库?我目前正在通过这种方式跟踪成千上万的展示次数,预计很快会跟踪数百万次,而且我认为效率低下。
答案 0 :(得分:1)
您可以缓存计数,然后以100为增量或任何最佳值将它们写入模型:
在report_v1的顶部:
if getattr(report_v1, 'cache', None) is None:
report_v1.cache = {}
然后,在验证cid有效后(在404响应行之后):
if cid in report_v1.cache:
report_v1.cache[cid] += 1
else:
report_v1.cache[cid] = 1
然后,您只想以特定的间隔增加模型上的值:
if not report_v1.cache[cid] % 100:
#increment impression_count
#wipe cache
这种方法的缺点是缓存在内存中,因此如果应用程序崩溃,它就会丢失。