Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当我有多个外键的Django对象时,如何命名/排列memcached键?_Python_Django_Caching_Memcached_Python Memcached - Fatal编程技术网

Python 当我有多个外键的Django对象时,如何命名/排列memcached键?

Python 当我有多个外键的Django对象时,如何命名/排列memcached键?,python,django,caching,memcached,python-memcached,Python,Django,Caching,Memcached,Python Memcached,我有一个现有的Django应用程序,它不做任何数据库缓存。我正在努力实现memcached,以提高性能并减少昂贵的数据库点击量 我将使用的策略如下:每次使用XXX.objects.get()或XXX.objects.filter()查询数据库时,我都会首先检查缓存,以查看同一查询的结果是否已在memcached中。如果是的话,我就用这个。如果不是,我将查询数据库,并使用一个专门命名为的键将其填充到memcached中。每当我更新此查询的任何结果时,我都会使用Django的post_save()信

我有一个现有的Django应用程序,它不做任何数据库缓存。我正在努力实现memcached,以提高性能并减少昂贵的数据库点击量

我将使用的策略如下:每次使用XXX.objects.get()或XXX.objects.filter()查询数据库时,我都会首先检查缓存,以查看同一查询的结果是否已在memcached中。如果是的话,我就用这个。如果不是,我将查询数据库,并使用一个专门命名为的键将其填充到memcached中。每当我更新此查询的任何结果时,我都会使用Django的post_save()信号使该缓存键无效。听起来很简单,对吧

好吧,我正在努力思考如何命名我的缓存键,以使其以有序的方式工作。问题是,我有Django模型对象,它们具有其他两个Django模型的外键

以下是我的模型:

memCache = pylibmc.Client(["127.0.0.1"])

class myObjectA(models.Model):  
    field1 = models.CharField(max_length=255)

    def getC_Children(self):
        if "SOME_NAME1_%s" % self.pk in memCache:
           return memCache["SOME_NAME1_%s" % self.pk]
        else:
           newCacheEntry = myObjectC.objects.filter(fk_myObjectA=self)
           memCache["SOME_NAME1_%s" % self.pk] = newCacheEntry
           return newCacheEntry




class myObjectB(models.Model):  
    field2 = models.CharField(max_length=255)

    def getC_Children(self):
        if "SOME_NAME2_%s" % self.pk in memCache:
           return memCache["SOME_NAME2_%s" % self.pk]
        else:
           newCacheEntry = myObjectC.objects.filter(fk_myObjectB=self)
           memCache["SOME_NAME2_%s" % self.pk] = newCacheEntry
           return newCacheEntry



class myObjectC(models.Model):  
    fk_myObjectA = models.ForeignKey(myObjectA, related_name="Blah_Blah") 
    fk_myObjectB = models.ForeignKey(myObjectB, related_name="Blah_Blah2") 
    field3 = models.CharField(max_length=255)
在myObjectC的post_save handler()中,我需要使缓存键(某些_NAME1_X和某些_NAME2_X)无效,因为它们现在已过期。对吗?我想这就是我需要做的


但是如果每个类的每个实例都有许多这样的键呢?毕竟,每个实例的每个XXX.objects.get()或XXX.objects.filter()调用都会有一个这样的键。我必须手动使它们全部失效吗?难道没有一种系统化的方法可以一次命名这些密钥并使其失效,而不必自己记住每个缓存条目吗?

缓存需要一种可靠且精心设计的策略,因为您可能会做比实际情况更糟糕的事情。在大多数项目中,实际上不需要高级缓存。为什么不缓存页面并在每次更新数据库时删除页面缓存?这将允许查询运行一次,但其余时间将检索缓存。如果您仍然坚持使用唯一键进行缓存,则可以通过唯一对象id及其名称创建它们的键组合。 如果您更新或创建新对象并删除缓存,则无论哪种方式都可以使用信号,但从您自己的示例中可以看出,页面缓存比遍历大量对象更容易处理。
除此之外,为什么不使用内置的Django cache.get、cache.set、cache.delete函数呢?通过这种方式,您可以保持项目的兼容性,并将代码与缓存引擎分离(也许明天redis会更适合您的需要)。

您真的需要缓存所有内容吗?你的项目有那么大吗?95%的项目将使用一个简单的模板缓存和一个用于复杂查询的小queryset缓存。我没有考虑过。我认为这就是方法。如果你想使用缓存,最简单的方法是使用内置缓存框架(你可以使用redis、memcached等):@petkostas,我确实按照这些说明实现了内置缓存。但是,正如我在这里描述的那样,它出现了故障:。网页正在显示过时的模型。