0

現在、Python で記述された (SQLAlchemy を使用している) Web アプリケーションを使用しています。認証を処理するために、アプリは最初にセッション内のユーザー ID をチェックし、それが存在する場合は、そのユーザー レコード全体をデータベースから引き出し、残りの要求のために保存します。別のクエリも実行され、格納されているユーザーのアクセス許可が確認されます。

私は Web アプリケーション開発の世界にかなり慣れていませんが、私の理解では、すべてのリクエストでこのようなことをデータベースにヒットさせるのは効率的ではありません。それとも、これは通常のことと見なされますか?

これまでに私が考えた唯一のことは、このデータを 1 回プルアップし、関連するものを保存することです (ほとんどのデータは、すべての要求で必要になるわけではありません)。ただし、これにより、このユーザー レコードが途中で削除された場合にどうなるかという問題が発生します。これを管理する最善の方法についてのアイデアはありますか?

4

4 に答える 4

3

単純なWeb アプリケーションでのユーザー ログインと基本的なアクセス許可トークンについては、Cookie ベースのセッションに確実に保存します。リクエストごとにいくつかの SELECT を実行することは大したことではありませんが、キャッシュされたデータから Web リクエストの一部またはすべてを DB ヒットなしで実行できる場合は、それだけ多くのスケーラビリティが追加されます。多くの負荷を受けることを計画しているアプリ。

データベースで変更されるユーザー トークンの問題は、2 つの方法で処理されます。1 つは、それを無視することです。多くのユース ケースでは、ユーザーがログアウトして再度ログインし、別の場所で付与された新しいアクセス許可を取得することはそれほど大きな問題ではありません (例として unix を見てください)。もう 1 つは、ユーザー行のすべての変更が、Cookie ベースのセッション内で状態をリセットするメソッドによってフィルター処理されることですが、これは、ユーザー自身がブラウザー インターフェイスを介して変更を開始した場合にのみ有効です。

上記のいずれのユース ケースにも当てはまらない OTOH の場合は、すべてのリクエストに組み込まれているデータベース アクセスを少し維持する必要があります。

于 2009-05-20T20:53:57.243 に答える
2

基本的に、パフォーマンスの最適化としてデータをキャッシュすることについて話しています。いつものように、時期尚早の最適化は悪い考えです。ボトルネックがどこにあるかを事前に知ることは困難です。アプリケーションドメインが初めての場合はさらにそうです。最適化は複雑さを増し、間違ったことを最適化すると、労力が無駄になるだけでなく、必要な最適化が難しくなります。

通常、ユーザーデータの要求は、非常に簡単なクエリです。簡単なベンチマークを作成して、どのようなオーバーヘッドが発生するかを確認できます。時間予算のかなりの割合ではない場合は、そのままにしておきます。

それでもアプリケーションサーバーにデータをキャッシュしたい場合は、キャッシュ無効化スキームを考え出す必要があります。

可能なスキームは、データベースからの変更をチェックすることです。キャッシュするデータがあまりない場合、これは単にデータをリロードするよりも実際にはそれほど効率的ではありません。

もう1つのオプションは、キャッシュされたデータをタイムアウトすることです。これは、変更の即時の可視性が重要でない場合に適したオプションです。

もう1つのオプションは、変更時にキャッシュをアクティブに無効にすることです。これは、アプリケーションを介してのみデータベースを変更するかどうか、および単一のアプリケーションサーバーを使用するかクラスター化されたソリューションを使用するかによって異なります。

于 2009-05-19T11:25:43.407 に答える
1

これはデータベースであるため、必要なデータを取得するためにデータベースを「ヒット」することはよくあることです。結合またはストアド プロシージャを構築すると、単一のクエリを減らすことができます。

于 2009-05-19T08:17:02.897 に答える