0

私のdjangoアプリケーションには、.AにBlogEntry属するaがあります。CategoryBlogEntryCategory

class BlogEntry(models.Model):
    creationdate=models.DateField(default=date.today)    
    description=models.TextField()
    author=models.ForeignKey(User,null=True)
    categories=models.ManyToManyField(Category)

class Category(models.Model):
    name=models.CharField(unique=True,max_length=50)
    description=models.TextField(blank=True)

ユーザーはを編集することができ、BlogEntryそうすることで、それがあったものを削除するCategoryことができます。

blogEntry1以前に属していたと仮定しjava,scalaます。ユーザーが削除するように編集した場合scala、エントリには1つのカテゴリのみが含まれます。java

私のlist_viewでは、以下のようにキャッシュを使用しています

from django.core.cache import cache
def list_entries_on_day(request,year,month,day):
    ...
    key = 'entries_day'+'-'+year+'-'+month+'-'+day
    if key not in cache:
        entries = BlogEntry.objects.filter(...args..)
        cache.set(key,entries)
    entries_on_day =cache.get(key)
    ...

今日のために2つのエントリを作成し、これらがキャッシュに入れられたとします。これらBlogEntyの1つを編集して、カテゴリを削除すると、次のようになります。

blogEntry1  has categories :java,scala
blogEntry2 has categories :dotnet,vbasic

最初に、今日のエントリのクエリを作成し、結果をキャッシュに入れます

キャッシュは[blogEntry1,blogEntry2]キーに対して持っています'entries_day-2012-11-11'

今、私はそれが今カテゴリーとしてblogEntry1持っているように編集しますjava

、保存されたエントリをキャッシュから削除する必要がありますか?(キャッシュにはBlogEntry変更前のオブジェクトが含まれているため)

4

1 に答える 1

1

model.saveのシグナルハンドラーを登録することにより、キャッシュを無効にすることができます

また、キャッシュの有効期限(デフォルトでは1時間)までユーザーに古いコンテンツが表示されるという事実を利用して、ログインしたユーザーにキャッシュされたコンテンツが表示されないようにすることもできます。そうしないと、編集が失われたことになります。

うーん、私の答えは少し曖昧ですが、言いたかったのです。いいえ、編集のたびにキャッシュを厳密に無効にする必要はありません。パフォーマンスとコンテンツの鮮度のどちらかを選択します。

もう1つの問題:キャッシュの使用に適したイディオムは次のとおりです。

entries_on_day = cache.get(key)
if entries_on_day  is None:
    entries_on_day  = BlogEntry.objects.filter(...args..)
    cache.set(key,entries_on_day)

1つのキャッシュクエリを保存します

于 2012-11-11T10:49:50.327 に答える