Zappa Django:它不是重新查询数据库,而是使用过时的内存缓存。这种行为可以改变吗?
Zappa Django: instead of re-querying the database, it uses an outdated in-memory cache. Can this behavior be changed?
在我的项目中,我只使用 Django 作为前端。所有后端逻辑都是由状态机协调的几个 AWS Lambda Python 函数。数据库是 S3 存储桶中的 SQLite。我使用 django_s3_storage
和 django_s3_sqlite
。我的后端函数更改了模型实例的数量及其在 SQLite 数据库中的详细信息。我希望 Django 前端尽快反映这些更改。但是,它不会发生。我只看到过时的内存缓存。
我已经尝试了几种方法。
我的初步看法:
class AllPortfolioRowsView(ListView):
model = PortfolioRow
template_name = "portfolio_all_rows.html"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
# do something else
context['object_list'] = PortfolioRow.objects.all().order_by('row_type')
return context
我已阅读在 get 函数中执行操作的建议。在这种情况下,按理来说,每次调用该函数都必须执行对数据库的查询。
变体 #2:
class AllPortfolioRowsView(View):
def get(self, request):
template = loader.get_template('portfolio_all_rows.html')
object_list = PortfolioRow.objects.all().order_by('row_type')
# do something else
context = {
'object_list': object_list,
# other stuff
}
return HttpResponse(template.render(context, request))
它有效但没有帮助。
然后我尝试按照 Django 文档的建议强制查询数据库。
变体 #3:
class AllPortfolioRowsView(View):
def get(self, request):
template = loader.get_template('portfolio_all_rows.html')
object_list = PortfolioRow.objects.all().order_by('row_type')
for elem in object_list: # iteration
counter = counter + 1
print(counter, ' - ', elem)
_ = list(object_list) # create list to force re-evaluation
# do something else
context = {
'object_list': object_list,
# other stuff
}
return HttpResponse(template.render(context, request))
也没用。
仅在 zappa-settings.json
中禁用周期性 keep_warm
事件有帮助。之后,如果没有调用,服务器会在 10-15 分钟后释放,过时的缓存就会消失。下次调用时,系统不得不重新查询数据库并显示最近的数据。
有更好的解决方案吗?
您的 Django Lambda 容器实例将在加载时下载 SQLite 数据库,然后将文件缓存在本地,直到 AWS 关闭 Lambda 容器。这是由 django_s3_sqlite
包自动完成的。
由于您使用单独的后端系统对数据库进行写入,因此 Django Lambda 容器实例不知道更改,因此不会从 S3 重新下载 SQLite 数据库。你列出的功能都是基于Django的缓存,不会有任何效果。
如果您希望 Django 应用程序在更快的时间内反映数据库更改,您将需要迁移到集中式数据库,例如 RDS 上的 PostgreSQL 或 DynamoDB。
在我的项目中,我只使用 Django 作为前端。所有后端逻辑都是由状态机协调的几个 AWS Lambda Python 函数。数据库是 S3 存储桶中的 SQLite。我使用 django_s3_storage
和 django_s3_sqlite
。我的后端函数更改了模型实例的数量及其在 SQLite 数据库中的详细信息。我希望 Django 前端尽快反映这些更改。但是,它不会发生。我只看到过时的内存缓存。
我已经尝试了几种方法。
我的初步看法:
class AllPortfolioRowsView(ListView):
model = PortfolioRow
template_name = "portfolio_all_rows.html"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
# do something else
context['object_list'] = PortfolioRow.objects.all().order_by('row_type')
return context
我已阅读在 get 函数中执行操作的建议。在这种情况下,按理来说,每次调用该函数都必须执行对数据库的查询。
变体 #2:
class AllPortfolioRowsView(View):
def get(self, request):
template = loader.get_template('portfolio_all_rows.html')
object_list = PortfolioRow.objects.all().order_by('row_type')
# do something else
context = {
'object_list': object_list,
# other stuff
}
return HttpResponse(template.render(context, request))
它有效但没有帮助。
然后我尝试按照 Django 文档的建议强制查询数据库。
变体 #3:
class AllPortfolioRowsView(View):
def get(self, request):
template = loader.get_template('portfolio_all_rows.html')
object_list = PortfolioRow.objects.all().order_by('row_type')
for elem in object_list: # iteration
counter = counter + 1
print(counter, ' - ', elem)
_ = list(object_list) # create list to force re-evaluation
# do something else
context = {
'object_list': object_list,
# other stuff
}
return HttpResponse(template.render(context, request))
也没用。
仅在 zappa-settings.json
中禁用周期性 keep_warm
事件有帮助。之后,如果没有调用,服务器会在 10-15 分钟后释放,过时的缓存就会消失。下次调用时,系统不得不重新查询数据库并显示最近的数据。
有更好的解决方案吗?
您的 Django Lambda 容器实例将在加载时下载 SQLite 数据库,然后将文件缓存在本地,直到 AWS 关闭 Lambda 容器。这是由 django_s3_sqlite
包自动完成的。
由于您使用单独的后端系统对数据库进行写入,因此 Django Lambda 容器实例不知道更改,因此不会从 S3 重新下载 SQLite 数据库。你列出的功能都是基于Django的缓存,不会有任何效果。
如果您希望 Django 应用程序在更快的时间内反映数据库更改,您将需要迁移到集中式数据库,例如 RDS 上的 PostgreSQL 或 DynamoDB。