Кэширование AppFabric внезапно истекает - PullRequest
2 голосов
/ 21 октября 2011

Я сейчас тестирую кеширование AppFabric, но у меня странная проблема с кешированием.Несмотря на то, что я говорю, что ему нужно кэшировать простой объект в течение 3 минут, он кэширует его только в течение приблизительно 3 секунд.

Настройки для моего кэша следующие:

PS C:> Получить-CacheConfig default CacheName: default TimeToLive: 100 минут CacheType: секционированные вторичные объекты: 0 IsExpurable: True EvictionType: LRU NotificationsEnabled: False

Я построил этот кэш, используя следующие 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

1 Ответ

1 голос
/ 04 ноября 2011

Когда в кеше Windows Server AppFabric недостаточно физической памяти узел, узел кеша может войти в состояние, называемое дросселированием. Кеш кластер не будет записывать данные в любой кеш, который находится в ограниченном состоянии хост кэша, пока доступная физическая память не увеличится Дросселированное состояние.

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

;)

...