データベースのキャッシュを行わない既存の 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 つあります。それらをすべて手動で無効にする必要がありますか? 各キャッシュ エントリを自分で覚えなくても、これらのキーに名前を付けて一度に無効にする体系的な方法はありませんか?