0

データベースのキャッシュを行わない既存の Django アプリがあります。私は memcached を実装して、パフォーマンスを向上させ、コストのかかるデータベース ヒットの量を減らすことに取り組んでいます。

私が使用する戦略は次のとおりです。XXX.objects.get() または XXX.objects.filter() を使用して DB にクエリを実行するたびに、最初にキャッシュをチェックして、この同じクエリの結果が既に存在するかどうかを確認します。 memcached で。もしそうなら、私はそれを使うだけです。そうでない場合は、DB にクエリを実行し、特定の名前のキーを使用して memcached に入れます。このクエリの結果を更新するたびに、Django の post_save() シグナルを使用してそのキャッシュ キーを無効にします。かなり単純に聞こえますよね?

さて、これが整然と機能するように、キャッシュキーにどのように名前を付けるかについて苦労しています。問題は、他の 2 つの 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() で、キャッシュ キー SOME_NAME1_X と SOME_NAME2_X が古くなったため無効にする必要があります。右?それが私がする必要があることだと思います。

しかし、各クラスのインスタンスごとにそのようなキーが多数ある場合はどうなるでしょうか? 結局、インスタンスごとに XXX.objects.get() または XXX.objects.filter() 呼び出しごとに、そのようなキーが 1 つあります。それらをすべて手動で無効にする必要がありますか? 各キャッシュ エントリを自分で覚えなくても、これらのキーに名前を付けて一度に無効にする体系的な方法はありませんか?

4

1 に答える 1