スライドの有効期限を1秒に設定するとどうなりますか
5148 ワード
[ASP.NET]如果设定1秒的话,你会变成什么样?
今日はASPを採用しました.NET Cachingのコンポーネントは、Unit Testを記述する過程で興味深い問題を発見し、次に簡単な例でこの問題を説明します.HttpRuntimeの静的属性Cacheによって現在のキャッシュを表すCacheオブジェクトを取得し、そのInsertメソッドを呼び出して現在の時間にキャッシュを実装するコンソールアプリケーションでは、次のプログラムを記述した.なお、「スライド時間」の期限切れポリシーを採用し、このスライド時間を1秒に設定します. 1: class Program
2: {
3: static void Main(string[] args)
4: {
5: string key = Guid.NewGuid().ToString();
6: HttpRuntime.Cache.Insert(key, DateTime.Now, null, Cache.NoAbsoluteExpiration, new TimeSpan(0, 0, 1) );
7: for (int i = 0; i < 5; i++)
8: {
9: Console.WriteLine(HttpRuntime.Cache.Get(key)??"N/A");
10: Thread.Sleep(500);
11: }
12: }
13: }
次に、forサイクルでキャッシュの時間を抽出し、コンソールに表示します.反復するたびに0.5秒のスリープ時間がかかります.キャッシュがスライド時間の有効期限切れポリシーに基づいて、キャッシュは0.5秒ごとに読み込まれるため、この間キャッシュは有効期限切れになりません.しかし、以下に示す実行結果は、追加したキャッシュが1秒後に期限切れになったことを示しています. 1: 4/1/2014 2:51:12 PM
2: 4/1/2014 2:51:12 PM
3: N/A
4: N/A
5: N/A
ASPかどうかNETキャッシュメカニズムが間違っている問題は何ですか?実はそうではありません.本当の理由は、スライドの有効期限の範囲を小さく設定しすぎたからです.これを確認するために、この時間を2秒に設定します. 1: class Program
2: {
3: static void Main(string[] args)
4: {
5: string key = Guid.NewGuid().ToString();
6: HttpRuntime.Cache.Insert(key, DateTime.Now, null, Cache.NoAbsoluteExpiration, new TimeSpan(0, 0, 2) );
7: for (int i = 0; i < 5; i++)
8: {
9: Console.WriteLine(HttpRuntime.Cache.Get(key)??"N/A");
10: Thread.Sleep(1000);
11: }
12: }
13: }
プログラムを再実行すると、次のような出力結果が表示され、追加されたキャッシュが期限切れではないことがわかります. 1: 4/1/2014 2:59:15 PM
2: 4/1/2014 2:59:15 PM
3: 4/1/2014 2:59:15 PM
4: 4/1/2014 2:59:15 PM
5: 4/1/2014 2:59:15 PM
関連するソースコードを表示すると、CacheのInsertメソッドまたはAddメソッドを呼び出すときにslidingExpirationパラメータを指定すると、キャッシュ・アイテムの抽出操作のたびにキャッシュ・アイテムの有効期限(現在の時間+slidingExpiration)が変更されます.ただし、有効期限の変更は、このslidingExpirationパラメータで指定された時間が設定された最小時間よりも大きくなければならないことを前提としています.この時間は、内部タイプCacheExpiresが以下のように定義された静的読取り専用属性TimeSpan MIN_に対応しています.UPDATE_DELTAは、その時間スパンが1秒であることがわかります.したがって、slidingExpirationパラメータを1秒未満に指定すると、実際には「スライドの有効期限」の役割を果たしません.もちろん、実際のプロジェクトではスライド時間をこんなに短く設定することはありません. 1: internal sealed class CacheExpires
2: {
3: //
4: internal static readonly TimeSpan MIN_UPDATE_DELTA = new TimeSpan(0, 0, 1);
5: }
作成者:
Artech
出典:
http://artech.cnblogs.com/
1: class Program
2: {
3: static void Main(string[] args)
4: {
5: string key = Guid.NewGuid().ToString();
6: HttpRuntime.Cache.Insert(key, DateTime.Now, null, Cache.NoAbsoluteExpiration, new TimeSpan(0, 0, 1) );
7: for (int i = 0; i < 5; i++)
8: {
9: Console.WriteLine(HttpRuntime.Cache.Get(key)??"N/A");
10: Thread.Sleep(500);
11: }
12: }
13: }
1: 4/1/2014 2:51:12 PM
2: 4/1/2014 2:51:12 PM
3: N/A
4: N/A
5: N/A
1: class Program
2: {
3: static void Main(string[] args)
4: {
5: string key = Guid.NewGuid().ToString();
6: HttpRuntime.Cache.Insert(key, DateTime.Now, null, Cache.NoAbsoluteExpiration, new TimeSpan(0, 0, 2) );
7: for (int i = 0; i < 5; i++)
8: {
9: Console.WriteLine(HttpRuntime.Cache.Get(key)??"N/A");
10: Thread.Sleep(1000);
11: }
12: }
13: }
1: 4/1/2014 2:59:15 PM
2: 4/1/2014 2:59:15 PM
3: 4/1/2014 2:59:15 PM
4: 4/1/2014 2:59:15 PM
5: 4/1/2014 2:59:15 PM
1: internal sealed class CacheExpires
2: {
3: //
4: internal static readonly TimeSpan MIN_UPDATE_DELTA = new TimeSpan(0, 0, 1);
5: }