2014-11-23 10 views
1

Я в процессе планирования перемещения веб-приложения C# ASP.Net на Azure (в настоящее время размещается на одном выделенном сервере), и я смотрю варианты кеширования. В настоящее время, поскольку у нас есть только один экземпляр приложения, запущенного за один раз, у нас есть кеш памяти «in process», чтобы освободить SQL DB от некоторых идентичных запросов.Стиль Azure Cache/DataCache Регионы в Redis

Процесс в настоящий момент состоит в том, чтобы очистить определенные части кеша, когда менеджеры/службы вносят изменения в эти части базы данных, например. у нас есть таблица пользователей, и у нас будут такие ключи, как «Пользователь. {0}», возвращающий одну пользовательскую запись/объект и «Users.ForeignKey. {0}», возвращающий всех пользователей, связанных с внешним ключом. Если мы обновим одну запись пользователя, мы удалим ключ «User.1» (если userid = 1) и упростим все коллекции списков, поскольку они могли быть изменены. Мы делаем это, удаляя ключи по шаблону, это означает, что удалены только затронутые ключи, а все остальные сохраняются.

Мы планируем этот переход к Azure некоторое время, и когда мы впервые посмотрели на все, что было недоступно, служба Azure Redis Cache недоступна, по крайней мере, поддерживается, поэтому мы рассмотрели сервис Azure Cache, основанный на AppFabric. Используя это, мы решили, что мы будем использовать области DataCache для разделения разных типов объектов, а затем просто очищаем затронутый регион, а не совсем точно, как наш текущий метод, но ОК. Теперь, поскольку Redis пришел на сцену, мы смотрели на это и предпочли бы использовать его, если это возможно. Тем не менее, похоже, что для достижения того же мы должны иметь отдельные тайники Redis для каждого раздела «Регион», который, как я понимаю, будет означать, что мы заплатим за множество небольших экземпляров службы Redis Cache от Azure, которые будет стоить довольно много, учитывая, что в кеш нам понадобится 10 + отдельно скрываемых разделов.

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

Извините за такой длинный вопрос/объяснение, но мне было трудно объяснить, чего я пытаюсь достичь без фона/контекста.

Спасибо, Гарет

Update:

Я нашел несколько Баш команд, которые могут сделать работу удаления ключей по шаблону, в том числе с помощью команды «клавиши» here и Lua команда сценария EVAL here.

Я планирую использовать клиент StackExchange.Redis для взаимодействия, знает ли кто-нибудь, как использовать эти типы команд или альтернативы этим (удалять ключи по шаблону) при использовании StackExchange.Redis?

Спасибо за чтение, Гареты

ответ

8

Вы можете использовать этот метод, рычаги Асинхронный/ждут возможности и redis pipelining удалить ключи от шаблона с помощью stack exchange redis client

private static Task DeleteKeysByPatternAsync(string pattern) 
{ 
    IDatabase cache1 = Connection.GetDatabase(); 
    var redisServer1 = Connection.GetServer(Connection.GetEndPoints().First()); 
    var deleteTasks = new List<Task>(); 
    var counter = 0; 
    foreach (var key in redisServer1.Keys(pattern: pattern, database: 0, pageSize: 5000)) 
    { 
     deleteTasks.Add(cache1.KeyDeleteAsync(key)); 
     counter++; 
     if (counter % 1000 == 0) 
      Console.WriteLine($"Delete key tasks created: {counter}"); 
    } 
    return Task.WhenAll(deleteTasks); 
} 

Тогда вы можете использовать его как это:

DeleteKeysByPatternAsync("*user:*").Wait(); //If you are calling from main method for example where you cant use await. 

или

await DeleteKeysByPatternAsync("*user:*"); //If you run from async method 

Вы можете настроить страницуРазмер или получить как метод м.

0

За то, что я понимаю ваш вопрос, вам нужно сгруппировать ваши данные в соответствии с некоторыми критериями (пользователь в вашем случае), так что всякий раз, когда изменяется запись, связанная с этими критериями, все данные, связанные с этой записью, также недействительны в кеше, используя один кешированный api-вызов.

Вы можете достичь этого в Azure, используя NCache for Azure, распределенное кэширующее решение для azure на Alachisoft, которое имеет богатый набор функций и множество топологий кеширования.

NCache допускает несколько способов выполнения операций такого типа. Одним из подходящих для вашего случая использования является функция группировки данных, которая позволит вам группировать данные в группах/подгруппах при добавлении. Данные могут быть впоследствии извлечены/удалены на основе групп/подгрупп.

NCache также позволяет добавлять теги с добавленными элементами. Эти теги могут затем использоваться для удаления/извлечения всех данных, содержащих один или несколько указанных тегов. Функция запроса (Delete query), предоставляемая в NCache, также может использоваться для удаления данных, удовлетворяющих определенным критериям.

+0

Хорошо, спасибо за ваш ответ, я посмотрю на него. –