我有一个现有的Django应用程序没有做任何数据库缓存。我正在努力实现memcached以提高性能并减少昂贵的数据库命中量。
到目前为止,我已安装并在我的服务器上运行memcache,安装了pymclib,django-memcache-admin并修改了我的settings.py文件,正如我所描述的here。我还没有修改任何实际的应用程序代码。但是当我查看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?我的插入键应该是什么?我需要确保如果任何模型具有新插入或更新的子记录,则缓存中的父记录是更新。目前,一旦进入缓存,它就不会更新,因此网页会显示过时的信息。如果您可以向我显示上述代码段的实际代码更改,那将是最有帮助的。