また、Djangoでのキャッシュについて

djangoの場合、キャッシング用のライブラリがすでに多くあり、ハブで既に説明されていますが、残念ながら、INSTALLED_APPSに行を追加してもパフォーマンスの問題は解決できません。 クエリセットにパッチを当てるライブラリでは、キャッシュが頻繁に無効化されるか、まれにしか無効化されず、最も重要なことには、プログラマはこのプロセスをほとんど制御できません。 無効化は手動で記述できますが、ミスを犯しやすいコードが大量に必要になります。



このため、オブジェクトをキャッシュに追加するときに依存関係を指定でき、変更するとキャッシュが自動的に無効になる小さなプロジェクトを作成しました。



依存関係として、次を指定できます。



  1. クラスモデル。 bulk_create、updateを呼び出すモデルのオブジェクトを変更/削除すると、このモデルのクエリセットのキャッシュに無効なエントリが含まれます。
  2. インスタンスモデル。 このインスタンスを変更/削除すると、キャッシュエントリは無効になります。
  3. 関連するマネージャー。 外部キーを持つ子オブジェクトを指定されたオブジェクトに変更すると、キャッシュエントリは無効になります。


すべての投稿と特定の投稿のリストがある単純なブログの例でこれを考慮してください。



まず、clever_cacheをインストールします。



$ pip instal django-clever-cache
      
      





INSTALLED_APPSに「clever_cache」を追加し、キャッシュのバックエンドとして「clever_cache.backend.RedisCache」を指定します。



 INSTALLED_APPS += ['clever_cache'] CACHES = { "default": { "BACKEND": 'clever_cache.backend.RedisCache', "LOCATION": "redis://127.0.0.1:6379/1", "OPTIONS": { 'DB': 1, } } }
      
      





ブログアプリケーションのモデルは次のとおりです。



 class Post(models.Model): author = models.ForeignKey('auth.User') title = models.CharField(max_length=128) body = models.TextField() created_at = models.DateTimeField(auto_now_add=True) class Meta: verbose_name = 'post' verbose_name_plural = 'posts' ordering = ['-created_at'] class Comment(models.Model): author = models.ForeignKey('auth.User') post = models.ForeignKey(Post, related_name='comments') body = models.TextField() created_at = models.DateTimeField(auto_now_add=True) class Meta: verbose_name = 'comment' verbose_name_plural = 'comments' ordering = ['-created_at']
      
      





すべての投稿のリストを実装します。 リクエストでは、すべての投稿、投稿者、各投稿のコメント数を選択するため、投稿、コメント、またはユーザーを変更する場合はキャッシュを無効にする必要があります。



 class PostListView(ListView): context_object_name = 'post_list' def get_queryset(self): post_list_qs = cache.get('post_list_qs') if not post_list_qs: post_list_qs = Post.objects.all().select_related( 'author' ).annotate(comments_count=Count('comments')) cache.set( 'post_list_qs', post_list_qs, depends_on=[Post, Comment, User] #       Post, Comment  User ) return post_list_qs
      
      





別の投稿の閲覧を実現します。 ここでは、データベースから投稿を取得し、その投稿者と投稿に対するコメントを個別に取得します。 したがって、リストされたオブジェクトを変更する場合、キャッシュを無効にする必要があります。



 class PostDetailView(DetailView): model = Post def get_context_data(self, **ctx): post = self.get_post() comments = self.get_comments(post) ctx['post'] = post ctx['comments'] = comments return ctx def get_post(self, *args, **kwargs): pk = self.kwargs.get(self.pk_url_kwarg) cache_key = "post_detail_%s" % pk post = cache.get(cache_key) if not post: post = Post.objects.select_related('author').get(pk=pk) cache.set( cache_key, post, depends_on=[post, post.author] #          ) return post def get_comments(self, post): cache_key = "post_detail_%s_comments" % post.pk comments = cache.get(cache_key) if not comments: comments = post.comments.all() cache.set( cache_key, comments, depends_on=[post.comments] # post.comments -  RelatedManager, #     ,    ) return comments
      
      





このライブラリがキャッシュの無効化の問題からあなたを救い、変数名の選択に集中できることを願っています。



コード



githubで利用可能



All Articles