我可以批量递增值以减少数据库写入吗?
Can I batch incrementing values in order to reduce database writes?
我的网络应用程序在 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
我的问题:有什么方法可以避免在每次展示时都写入数据库吗?我目前正在以这种方式跟踪数十万次展示,并希望很快跟踪数百万次,但我认为这是低效的。
您可以缓存计数,然后以 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
这种方法的缺点是缓存在内存中,因此如果应用程序崩溃,它就会丢失。
我的网络应用程序在 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
我的问题:有什么方法可以避免在每次展示时都写入数据库吗?我目前正在以这种方式跟踪数十万次展示,并希望很快跟踪数百万次,但我认为这是低效的。
您可以缓存计数,然后以 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
这种方法的缺点是缓存在内存中,因此如果应用程序崩溃,它就会丢失。