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

时间:2015-04-20 02:36:35

标签: python django postgresql heroku

我的网络应用程序在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

我的问题:有没有办法避免在每次展示时写入数据库?我目前正在通过这种方式跟踪成千上万的展示次数,预计很快会跟踪数百万次,而且我认为效率低下。

1 个答案:

答案 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

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