我有一个现有的Django应用,不执行任何数据库缓存。我正在努力实现memcached,以提高性能并减少昂贵的数据库命中次数。
到目前为止,我已经在服务器上安装并正在运行memcache,已安装pymclib,django-memcache-admin并按照此处所述修改了settings.py文件。我尚未修改任何实际的应用程序代码。但是当我查看django-memcache-admin仪表板时,仍然可以看到缓存正在生效。缓存也很明显,因为当我加载某些视图时,显示的数据已过时。IE:更新的数据未进入缓存。我需要有关如何解决此问题的建议。下面给出更详细的解释。
这是我的模型:
class myObjectA(models.Model):
field1 = models.CharField(max_length=255)
def modify(self):
newB = myObjectB(fk_myObjectA=self, field2="Blah Blah")
newB.save()
def getBChildren(self):
return myObjectB.objects.filter(fk_myObjectA=self)
class myObjectB(models.Model):
fk_myObjectA = models.ForeignKey(myObjectA, related_name="Blah_Blah")
field2 = models.CharField(max_length=255)
这是网址路径:
url(
r'^api/myObjectA_Modify/(?P<myObjectA_ID>\d+)/?$',
myObjectA_Modify.as_view()
),
这是通过添加新的myObjectB子记录来修改myObjectA实例的API视图:
class myObjectA_Modify(mixins.UpdateModelMixin, generics.GenericAPIView):
queryset = myObjectA.objects.all()
serializer_class = myObjectA_Serializer
def put(self, request, *args, **kwargs):
retrieved_myObjectA = get_object_or_404(
myObjectA,
pk=request.POST["myObjectA_ID"],
)
retrieved_myObjectA.modify()
return Response(
myObjectA_Serializer(retrieved_myObjectA.getBChildren()).data,
status=status.HTTP_200_OK,
)
对myObjectA_Modify的调用可以具有任何任意ID。我事先不知道将使用哪个ID。myObjectA可以具有不确定数量的myObjectB子级。此外,还有其他单独的API可返回所有myObjectAs和myObjectB的完整列表。
如何修改此应用程序代码以与Memcache配合使用?我的插入键应该是什么?我需要确保,如果任何模型都有新插入或更新的子记录,则缓存中的父记录是更新。当前,一旦某些内容进入缓存,它就不会更新,因此该网页显示了过时的信息。如果您可以向我展示上述代码段的实际代码更改,那将是最有帮助的。
一个相对简单的方法是将一个函数附加到post_save
模型的信号上,如果模型实例被更新,则使缓存无效。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句