Postgres非常擅长与其他流量同时进行这类计算,所以不要太担心负载(只要您在请求-响应周期之外运行这种批处理作业)。在
你可以考虑做的一件事是将这类工作分成可缓存的小单元。i、 e.每个月的平均值实际上是过去4周的平均值,每年的平均值是过去12个月的平均值,而且这一切都是以每本书为基础来完成的,所以为什么不按要求做一小部分工作呢。在from django.core.cache import cache
from datetime import timedelta
def cached(key, expire)
def wrapped(f):
def func(*args, **kwargs):
result = cache.get(key%args%kwargs)
if result is None:
result = f(*args, **kwargs)
cache.set(key%args%kwargs, result, expire)
return result
return func
return wrapped
@cached("book:%s:avg:week:%s", 3600*24) #cache for a day, rolling results!
def book_read_week_average(book_id, week_start):
week_end = week_start + timedelta(days=7)
return Reader.objects.filter(book_id=book_id, date_gte=week_start, date_lt=week_end) \
.aggregate(Avg(&#