我可以批量递增值以减少数据库写入吗?

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

这种方法的缺点是缓存在内存中,因此如果应用程序崩溃,它就会丢失。