[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: }
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/430/viewspace-2817876/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 優雅的快取解決方案--設定過期時間快取
- redis設定過期時間Redis
- localStorage設定過期時間
- Redis和DelayQueue設計具有過期時間的快取Redis快取
- JavaScript 設定cookie 過期時間JavaScriptCookie
- 設定phpsession過期時間PHPSession
- redis 設定過期時間,以資料夾形式展示key顯示快取資料Redis快取
- localstorage實現帶過期時間的快取功能快取
- JavaScript 設定Cookie過期時間無效JavaScriptCookie
- C#如何設定session過期時間C#Session
- 滑鼠滑輪上下滾動設定方法_怎樣設定滑鼠上下滾動
- C# 給PDF文件設定過期時間C#
- 如何給localStorage設定一個過期時間?
- win10怎樣固定時間關機_win10怎樣設定電腦關機時間設定Win10
- win10 點選自動設定時間時間快1小時怎麼解決Win10
- JavaScript獲取cookie過期時間JavaScriptCookie
- 面試官:RabbitMQ過期時間設定、死信佇列、延時佇列怎麼設計?面試MQ佇列
- SAP過帳期間設定
- Asp.Net Core中利用過濾器控制Nginx的快取時間ASP.NET過濾器Nginx快取
- tomcat 設定session過期時間(四種方式)TomcatSession
- 如果將relay_log_recovery設定為0會發生什麼?
- Cookie 作用,互動過程解析,設定,獲取,刪除,生效時間的設定Cookie
- 通過offsets.retention.minutes設定kafkaoffset的過期時間Kafka
- Passport 設定token 過期時間盡然不生效!這是為什麼?Passport
- 將頁面設定為不能夠被快取程式碼快取
- Cognos會話快取設定(展現實時資料)會話快取
- 在IDEAL下執行測試Memcached快取資料功能的時候,快取時間過期之坑Idea快取
- 在asp.net web api中利用過濾器設定輸出快取ASP.NETWebAPI過濾器快取
- 假設:如果意識也是客觀存在會怎樣?
- 幽默:如果微服務改名為業務元件會怎樣?- ntcoding微服務元件
- 蘋果Mac OS X怎樣設定滑鼠滾輪滑動的方向/反向蘋果Mac
- 關於 session 未到設定的過期時間就過期的問題(分享坑點)Session
- 如果兩個程式都這樣做會怎樣?
- redis 過期時間Redis
- Linux密碼過期時間設定 /etc/login.defsLinux密碼
- 如果沒有 Android,世界會怎樣?Android
- 如何將ASP.NET MVC所有引數均自動設定為預設ASP.NETMVC
- WebView 設定快取WebView快取