2

ASP.NET MVC 4 インターネット アプリケーション プロジェクトを作成しました。このプロジェクトでは、SimpleMembership を使用します。アカウントを登録するには、9 つ​​のクエリを実行します。これはプロジェクト付属の標準コードなので当たり前のようですが、アカウント登録だけでも9クエリは多いのではないでしょうか?

また、使用すると次のことに気付きました。

if (Roles.IsUserInRole("..."))

4つのクエリを実行します...

これは正常であり、パフォーマンスの問題になる可能性がありますか?

4

2 に答える 2

1

それは正常です。ただし、サイトが大きくなると、パフォーマンスの問題になる可能性があります。

アクセス許可は、ユーザーの存続期間中に変更されるとしても、それほど変更されるものではありません。大多数のユーザーはデフォルトの権限セットを持ち、(比較的) 少数のユーザーだけが「管理者」や「モデレーター」などの役割を持ちます。サイトが大規模になると、特に同じデータを何度も何度もクエリしているため、アクセス許可についてデータベースにクエリを実行すると、非常にコストがかかります。ページをレンダリングするたびに、おそらくなんらかのパーミッションを確認します。ユーザーは「削除」ボタンを表示する権限を持っていますか? 彼はいくつかの管理メニューを見ることができますか? フォーラムまたはブログ投稿の場合、投稿者の IP アドレスを確認できますか? この種のことを行うには、各ページのレンダリングで複数回アクセス許可を確認する必要があり、DB クエリを介してそれを実行したくはありません。

適切な解決策は、アクセス許可をキャッシュすることです。これを考慮してください:
ユーザーがログインするとき、ユーザーが持っているすべての権限を照会し、それを Web サーバーのメモリにキャッシュします。複数の Web サーバーがある場合は、それらのキャッシュを同期するか、特定のサーバーがそのユーザーのアクセス許可をメモリに持っていない場合は、個々のサーバーでユーザーのアクセス許可を照会する必要があります。これは、ユーザーがそのサーバーにリクエストを行ったときにオンデマンドで発生します。
これで、DB にクエリを実行する必要がまったくなくなりました。すべての権限チェックはメモリ内で行われるため、はるかに高速に動作し、DB はそのままになります。ユーザーのアクセス許可を変更する場合、もちろんすべての Web サーバー キャッシュを同期する必要がありますが、これはめったに発生しないため、パフォーマンスへの影響はありません。

ある時点でキャッシュをクリアしたい場合があります。サーバーの RAM の量には制限があります。この段階で、少し前に最後にアクティブで、おそらくもうサイトを閲覧していないユーザーのキャッシュされたアクセス許可を削除できます。それらがまだそこにある場合でも、次のクエリで権限が再読み込みされます。

于 2013-08-11T14:57:57.580 に答える
0

はい、みんな普通です。実際、ユーザー登録はあまり発生せず、パフォーマンスに問題はありません。

ただし、Roles.IsUserInRole("...")他の同様のメソッドは何度も呼び出される可能性があるため、パフォーマンスの問題になります。

多くの同時ユーザーがいる Web サイトがある場合は、独自のカスタム ロール チェック クエリを実行することを検討する必要があります。

于 2013-08-11T11:24:01.040 に答える