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