私は Django でセッションを見ていますが、デフォルトではデータベースに保存されています。ファイルシステムとキャッシュ セッションの利点は何ですか? また、いつ使用する必要がありますか?
5 に答える
ファイルシステムのバックエンドは、システムの他の部分にデータベースを使用しない場合にのみ検討する価値があります。データベースを使用している場合、ファイルシステムのバックエンドはそれを推奨するものは何もありません。
memcache バックエンドはデータベース バックエンドよりもはるかに高速ですが、セッションがパージされ、セッション データの一部が失われるリスクがあります。
あなたが非常にトラフィックの多い Web サイトであり、セッションの損失に対処できるように慎重にコーディングしている場合は、memcache を使用してください。データベースを使用していない場合は、ファイル システム キャッシュを使用しますが、ほとんどの場合、既定のデータベース バックエンドが最適で、最も安全で、最も単純なオプションです。
私は Django の専門家ではないので、この回答は一般的なセッション ストアに関するものです。私が間違っている場合は反対票を投じてください。
パフォーマンスとスケーラビリティ
セッション ストアの選択は、パフォーマンスとスケーラビリティに影響します。これは、非常に人気のあるアプリケーションを使用している場合にのみ大きな問題になるはずです。
データベースとファイルシステムの両方のセッション ストアは (通常) ディスクに支えられているため、多くのセッションを安価に実行できます (ディスクが安価であるため) が、データが読み取られるまでリクエストが待機することがよくあります (ディスクが低速であるため)。Memcached セッションは RAM を使用するため、同じ数の同時セッションをサポートするにはより多くのコストがかかりますが (RAM は高価であるため)、より高速になる可能性があります (RAM は高速であるため)。
ファイルシステム セッションは、アプリケーションが実行されているボックスに関連付けられているため、サイトが巨大になった場合、複数のアプリケーション サーバー間で負荷を分散することはできません。データベースおよび memcached セッションを使用すると、複数のアプリケーション サーバーが共有セッション ストアと通信できます。
シンプルさ
セッション ストアの選択も、サイトのデプロイの容易さに影響します。デフォルトから変更すると、いくらか複雑になります。Memcached と RDBMS にはそれぞれ独自の複雑さがありますが、いずれにせよアプリケーションはおそらく RDBMS を使用することになるでしょう。
非常に人気のあるアプリケーションを使用している場合を除き、シンプルさを重視する必要があります。
ボーナス
もう 1 つの方法は、セッション データを Cookieに保存することです (ID だけでなく、そのすべて)。これには、ユーザー数に応じてセッション ストアが自動的にスケーリングされるという利点がありますが、欠点もあります。あなた (またはあなたのフレームワーク) は、ユーザーがセッション データを偽造しないように注意する必要があります。また、リクエストごとに全体が送信されるため、各セッションを小さく保つ必要があります。
Django 1.1 以降、cached_db セッション バックエンドを使用できます。
これにより、セッションがキャッシュに保存され (memcached でのみ使用)、DB に書き戻されます。キャッシュから落ちた場合は、DB から読み込まれます。
これは、セッションの保存に単に memcached を使用するよりも遅くなりますが、セッションに永続性が追加されます。
セッションバックエンドを選択する際に考慮しなければならないことの1つは、「セッションデータが変更される頻度」です。トラフィックが中程度のサイトでも、リクエストごとにセッションデータが変更されると、データの保存と取得に多くのデータベーストリップが発生します。
以前の作業では、セッションバックエンドとしてmemcacheを排他的に使用しましたが、非常にうまく機能しました。私たちの管理チームは、2つの特別なmemcachedインスタンスを岩のように安定させることに多大な努力を払いましたが、初期設定を少し調整した後、セッションバックエンド操作の中断はありませんでした。
データベースにあなた以外の DBA がいる場合、データベースを利用したセッションの使用が許可されない場合があります (これはフロントエンドのみの問題です)。django が複数のデータベースからのデータを簡単にマージできるようになるまでは、セッションやユーザー メッセージ (django.contrib.auth のメッセージもデータベースに保存されます) などのフロントエンド固有のものを別のデータベースに保持できるようになるまで、保持する必要があります。これを念頭に置いてください。