1

システムを実行していColdfusion8/MySQL 5.0.88ます。

一部のページでは、(ログインした)ユーザーに基づいてパラメーターを事前にクエリする必要があります。たとえば、サイトには商品検索があり、ユーザーを承認した販売者からの商品のみを検索できます(allow-list)。

現在、ユーザーが商品ページにアクセスすると、allow-list販売者を表示するためのを作成しています。ユーザーが商品検索をトリガーすると、search.cfcを呼び出します。これallow-listにより、検索を実行するためのが再度ビルドされます。別のページでは、ユーザーは販売者をロック/ロック解除できるため、リストは定期的に変更される可能性があります。

質問:
セッション に保存しallow-listて、どこでも利用できるようにし、データベースを常に再クエリする必要がないようにする必要がありますか?リストは非常に長くなる可能性があります(13桁のID、コンマ区切り)。いつ再構築し、現在のセッション値を取得しないか(更新後)を示すために、 Session.rebuild = true/falseパラメーターが必要です。また、クエリが同一であるが別々のページにある場合、クエリのキャッシュは意味がありますか?

いくつかの考えをありがとう。

4

2 に答える 2

2

セッションに保存されている値がそれらを保護するセキュリティでない限り、それは問題ありません。

クエリキャッシングは、サーバーに送信されるクエリに基づいています。サーバーが同一である場合は、データベースにアクセスする必要はありませんが、メモリから取得して、提案どおりに効果的に実行します。

于 2012-08-02T13:36:57.400 に答える
2

キャッシュを保存する場所の選択は、システムに期待することによって大きく異なります。

有用な期間より長くデータをキャッシュしたくない場合は、ユーザーがアクティブである間だけキャッシュされるため、セッションスコープにデータを配置することをお勧めします。さらに、売り手が買い手が最近何かを購入したかどうかを気にしない場合は、キャッシュを更新する必要はなく、期限が切れるのを待つだけです。

または、ColdFusionに組み込まれているクエリキャッシュを利用することもできます。ほとんどのユーザーがサイトでアクティブになると予想される時間枠を指定でき、わずかなコードでキャッシュを簡単に更新できます。考えられる欠点または利点は、サーバー上にキャッシュされたクエリの数が固定されていることです。これにより、キャッシュされたクエリの数を超えた場合にキャッシュがフラッシュされます。これにより、キャッシュされたままにしておきたいクエリを再フェッチする可能性を犠牲にして、ある程度のメモリ管理が提供されます。

クエリキャッシュを処理する1つの方法は次のとおりです。これにより、タイムスパンが経過するまでクエリがキャッシュされます。キャッシュされた結果は、最大キャッシュクエリがパージを超えた、またはクエリキャッシュ全体のコードベースのフラッシュの一部として削除されます。

<cffunction name="getData" access="public" output="false" returntype="string" hint="Returns a hash of the supplied string.">
    <cfargument name="Id" type="numeric" required="true">
    <cfargument name="ClearCache" type="boolean" default="false" required="false">

    <!--- Long cache the query since the values rarely change, but allow the cache to be cleared. --->
    <cfif Arguments.ClearCache EQ false>
        <cfset local.CachedWithin = CreateTimeSpan(0,0,10,0)>
    <cfelse>
        <cfset local.CachedWithin = CreateTimeSpan(0,0,0,-1)>
    </cfif>

    <!--- Run the query --->
    <cfquery name="local.qryGetData" datasource="#Variables.DSN#" cachedwithin="#local.CachedWithin#">
        ...
    </cfquery>

    <cfreturn local.qryGetData>
</cffunction>

次に、更新後に実行する関数を使用して、関連するキャッシュされたクエリをクリアできます。

<cffunction name="clearCache" access="public" output="false" returntype="void">
    <cfargument name="Id" type="numeric" required="true">

    <cfset Variables.getData(Id=Arguments.Id,  ClearCache=true)>
    <cfset Variables.getSomethingElse(Id=Arguments.Id, ClearCache=true)>

</cffunction>
于 2012-08-02T15:22:20.883 に答える