2011-10-21 146 views
2

我目前正在測試AppFabric緩存,但我的緩存有一個奇怪的問題。儘管我說他需要緩存一個簡單的對象3分鐘,但他只緩存了大約3秒鐘。AppFabric緩存突然到期

我緩存的設置如下:

PS C:> GET-CacheConfig默認 CacheName:默認 傳輸TimeToLive:100分鐘 CacheType:分區 仲:0 IsExpirable:真 EvictionType:LRU NotificationsEnabled:假

我使用下面的命令行開關3內置此緩存:

Use-CacheCluster 
Start-CacheCluster 
Grant-CacheAllowedClientAccount <myAccount> 

後來我嘗試運行下面的程序(Program.cs中):

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine("Press any key to continue, Q to quit"); 
     while (Console.ReadKey() != new ConsoleKeyInfo('q', ConsoleKey.Q, false, false, false)) 
     { 
      DoStuff(); 
     } 
    } 

    static void DoStuff() 
    { 
     Person p = null; 
     DataCacheItem cacheItem = CacheUtility.CurrentCache.GetCacheItem("jebas"); 
     if (cacheItem != null) 
     { 
      Console.WriteLine("V - Got my stuff from cache"); 
      p = (Person)cacheItem.Value; 
     } 

     if (p == null) 
     { 
      Console.WriteLine("! - I just did an expensive call"); 
      p = GetPerson(); 
      CacheUtility.CurrentCache.Add("jebas", p, new TimeSpan(0, 30, 0)); 
     } 
    } 

    private static Person GetPerson() 
    { 
     return new Person() { FirstName = "Jeroen", LastName = "Van Bastelaere", Id = Guid.NewGuid() }; 
    } 
} 

CacheUtility類:

sealed class CacheUtility 
{ 
    private static DataCacheFactory _factory; 
    private static DataCache _cache; 
    private static readonly object _lock = new object(); 

    CacheUtility() { } 

    public static DataCache CurrentCache 
    { 
     get 
     { 
      lock (_lock) 
      { 
       if (_cache == null) 
       { 
        List<DataCacheServerEndpoint> servers = new List<DataCacheServerEndpoint>(); 
        servers.Add(new DataCacheServerEndpoint("demo2010a", 22233)); 
        DataCacheFactoryConfiguration config = new DataCacheFactoryConfiguration() 
        { 
         Servers = servers 
        }; 
        _factory = new DataCacheFactory(config); 
        _cache = _factory.GetDefaultCache(); 
       } 
       return _cache; 
      } 
     } 
    } 
} 

使用這個程序,我只要運行它,然後按一個隨機密鑰量時間:大多數時候它說「我從緩存中獲得它」,但是每3秒鐘一次,它會花費昂貴的通話時間。 當我以Get-CacheStatistics默認檢查時,他錯過了,他有這個緩存:

PS C:> GET-CacheStatistics默認

大小:0 ItemCount中:0 RegionCount:1 RequestCount:1543 MissCount:75

當它在緩存中它給了我這樣的:

尺寸:566 ItemCount中:1 RegionCount:1 RequestCount:1553 MissCount:77

使用perfmon我能夠知道我的對象被驅逐,因爲當我運行我的程序(並且它突然不再在緩存中)時,計數器Total Evicted Objects上升。

我不知道爲什麼它被雖然驅逐,這是我的時刻緩存的唯一對象和服務器已經有足夠的內存左(4GB +)

任何人可以幫助我讓我的對象緩存了30分鐘,我要求它緩存而不是3秒?

幫助非常感謝。 :-)

由於提前,

的Jeroen

+0

Apparantly資源節流進入了的地方,我有大約6 W3WP過程,1個SQL和一個owstimer過程,被佔用了大量的存儲器(90%的總物理內存),當總空閒內存低於物理內存的15%時,它開始節流。 殺害過程爲我解決了這個問題(或者實際上:iisreset :-)) –

+0

雖然它實際上是我不能標記它解決了。 –

回答

1

當物理內存變低在Windows Server AppFabric的緩存 主機上,高速緩存主機可以進入一個叫做節流狀態。高速緩存 羣集不會將數據寫入駐留在受限制的 高速緩存主機上的任何高速緩存,直到可用物理內存增加以解決 受限狀態。

http://msdn.microsoft.com/en-us/library/ff921030.aspx