AppFabric缓存突然到期

问题描述:

我目前正在测试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

虽然它实际上是我不能标记它解决了。 –

当物理内存变低在Windows Server AppFabric的缓存 主机上,高速缓存主机可以进入一个叫做节流状态。高速缓存 群集不会将数据写入驻留在受限制的 高速缓存主机上的任何高速缓存,直到可用物理内存增加以解决 受限状态。

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