昨日、キャッシングについて少し考えてみました。
具体的には、データのキャッシュです。
ASP.NET 4.0 を使用し、VB でコーディングしています。MySQL データベースを使用しているため、SQL Server のみの sqlDependency を使用できません。
私にとって重要なことは、すべてのデータ変更が反映され、ユーザーに古いデータが表示されないようにすることです。そのため、特定のテーブルでデータベースの変更を監視する方法を考え出す必要がありました。
私が思いついたのはこれです...
1: 最近書き込まれたテーブル名と書き込み時のタイムスタンプを含むキー/値ディクショナリをキャッシュに作成するルーチン。
tableName | timeStamp (Unix)
table2Name | timeStamp
2: データを書き込むときに呼び出される一般的に利用可能な関数。つまり、すべての INSERT、UPDATE、または DELETE コマンドは、この関数に 2 つの引数を渡すことによって作成されsql
ますtableChanges
。
この関数では、sql
は単純に UPDATE/INSERT コードでtableChanges
あり、このコマンドの影響を受けるテーブル名のコンマ区切りリストです。
ポイント 1 の表が作成されるのは、任意の修正中です。
3:getData
引数を取る一般的に利用可能な関数:
cacheName As String - the cache key name
slidingTime As Double - sliding expiry period (converted to minutes within the function)
dependancy As Object - standard cache dependancy object
newSql As String - the query required to get this data
Optional tableDependencies As String = "" - a comma separated list of tables which this data is dependant on
4: 上記と同様の引数に基づいて、データ オブジェクトをキャッシュに書き込む関数。
ここで、関数 #3 は、渡されたキーがキャッシュに含まれているかどうかを最初にチェックし、含まれていない場合は、単純にデータベースに移動して新しいデータを取得します。
このキーが含まれている場合、次の 2 つのことを行います。まず、このアイテムが追加されたときのタイム スタンプを取得します。これは常にcacheKey_added
(キャッシュ アイテムを追加するプロセスで作成されます)、次にこのタイム スタンプを取得すると、グラブします。コンマで区切られた 、テーブル名のリストに変換し、最初の関数で作成されtableDependencies
たキャッシュされたデータから、対応するテーブルの更新時間を (テーブル名をキーとして使用して) チェックするすべてをループします。Dictionary
テーブルの更新時刻のいずれかがキャッシュ時刻より新しい場合は、データベースに移動して新しいデータをフェッチします。そうでない場合は、キャッシュされたデータを返します。
同様にDictionary
、キャッシュにテーブルが保持されていない場合は、キャッシュされたデータが返されます。これは、データベースに変更が加えられたときにのみこのキャッシュ オブジェクトが作成されるため、変更が行われていないと想定されるためです。
データは常にスライディング キャッシュ時間 (通常は非常に短い) で保持されます。もちろん、キャッシュをまったく必要としないデータは、このプロセスなしで直接取得できます。
上記のコードは実際の質問に必ずしも関連していないため、投稿していませんが、背景は重要です。
だから、私の実際の質問は次のとおりです。
データベース内のテーブルがいつ変更されたかを判断するために上記がうまく機能することを考えると (phpMyAdmin で何も変更されていないことを前提としていますが、それにアクセスできるのは 1 人だけなので、私の場合はこれで問題ありません...どうすれば同じ原則を適用できますか?ユーザー コントロールまたはページをキャッシュするには?
VaryByParam="PARA"
そのため、過去にand を使用してユーザーコントロールをキャッシュ VaryByCustom="CUSTOM_VALUE"
しました。それは道理にかなってVaryByCustom
います...しかし、これを行うためにパラメータ(テーブル名とページの最終キャッシュ時間)をカスタム関数に確実に渡すにはどうすればよいでしょうか...または、私はナンセンスを言っていますか?!
さらに、すべてのキャッシュ項目に追加の_added
キーを保存することなく、キャッシュの書き込み時間を取得する方法はありますか?