В ASP.Net AppFabric Cache отсутствуют методы Flush / Clear и Count / GetCount? - PullRequest
7 голосов
/ 14 января 2011

Я пытаюсь преобразовать решение с использованием EntLib в использование кэширования AppFabric.С помощью нескольких методов расширения это довольно безболезненный процесс.

Методы расширения, которые я использую:

public static bool Contains(this DataCache dataCache, string key)
{
    return dataCache.Get(key) != null;
}

public static object GetData(this DataCache dataCache, string key)
{
    return dataCache.Get(key);
}

Но есть две функции EntLib, которые мне трудно преобразовать.А именно «Count» (подсчет количества ключей в кеше) и «Flush» (удаление всех данных из кеша).И то и другое можно было бы решить, если бы я мог перебирать ключи в кеше.

Существует метод с именем ClearRegion(string region), но для этого мне нужно было указать имя региона во всех используемых мной методах Get / Put / Add,потребуется ручная работа, склонная к ошибкам.

Есть ли способ получить список ключей в кеше?Могу ли я использовать имя региона по умолчанию?Как очистить кэш, если я не использовал имя региона?

Ответы [ 2 ]

10 голосов
/ 14 января 2011

См. мой предыдущий ответ для моего предположения о том, как кэш работает внутри, когда вы не указываете регион, и как вы можете получить количество объектов, которые не 'т в названном регионе.

Мы можем построить метод Flush, используя ту же технику:

public void Flush (this DataCache cache)
{
    foreach (string regionName in cache.GetSystemRegions()) 
    {     
        cache.ClearRegion(regionName) 
    } 
}

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

0 голосов
/ 28 августа 2014

Если у кого-то будут проблемы в будущем (как у меня) - вот полный код для очистки кэша.

private static DataCacheFactory _factory;
        private const String serverName = "<machineName>";
        private const String cacheName = "<cacheName>";

        static void Main(string[] args)
        {
            Dictionary<String, Int32> cacheHostsAndPorts = new Dictionary<String, Int32> { { serverName, 22233 } };
            Initialize(cacheHostsAndPorts);
            DataCache cache = _factory.GetCache(cacheName);
            FlushCache(cache); 
            Console.WriteLine("Done");
            Console.ReadLine();
        }

        private static void FlushCache(DataCache cache)
        {
            foreach (string regionName in cache.GetSystemRegions())
            {
                cache.ClearRegion(regionName);
            }
        }

        public static void Initialize(Dictionary<String, Int32> cacheHostsAndPorts)
        {
            var factoryConfig = new DataCacheFactoryConfiguration
            {
                Servers = cacheHostsAndPorts.Select(cacheEndpoint => new DataCacheServerEndpoint(cacheEndpoint.Key, cacheEndpoint.Value))
            };

            _factory = new DataCacheFactory(factoryConfig);
        }
...