2012-06-05 4 views
0

Так что прямо сейчас я пришел в проект, за который я беру на себя ответственность.Сервисный уровень, реализация тайм-кэша

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

Теперь, к моей проблеме, или, вернее, каков наилучший шаблон для реализации тайм-кера? Объекты, которые редко меняются или обновляются, например, страны и т. Д., Кэшируются и никогда не выпускаются, если пул не сбрасывается.

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

В настоящее время существует 12 словарей с элементами, которые кэшируются. Большинство из них редко обновляются. Эти словари находятся в одном классе, который не является одиночным, но реализуется как синглтон, поэтому он создается только один раз.

Как вы советуете мне решить эту интересную проблему и почему так?

ответ

1

Почему бы не настроить кластер кэш, состоящий из одного или нескольких серверов, используя один из следующих технологий кэширования:

Таким образом, вам не нужно беспокоиться о запуске двух служб, выполняющих то же самое.

Обе эти технологии поддерживают кеширование объекта в течение определенного времени.

т.д .:

public void Add(string key, object value, TimeSpan timeout) 
{ 
    //... 
} 

Или вы можете кэшировать их на неопределенный срок.

Редуцирование поддерживается. Однако имейте в виду мелкий шрифт.

AppFabric Redundancy

Назад в 2010 году я написал несколько сообщений о AppFabric и NCache.

Оба обеспечивают легкий и аналогичный API для работы с.

0

ASP.Net уже имеет довольно красивую систему кэширования. Есть ли причина, по которой вы не можете ее использовать?

Он поддерживает синхронизацию тайм-аута кэша, промывку внешними событиями, его можно настроить на использование памяти, базы данных, отдельного сервера кеша, распределенного кеша и т. Д. Не должно быть никаких оснований для Вас, чтобы сделать свой собственный :-)

+0

Я унаследованный этот проект, так что я не знаю, почему они сделали так, как они это делали. Я хотел бы получить информацию о том, какие варианты у меня есть у других опытных пользователей и почему. Системы, которые я построил ранее, не нуждались в большом кэшировании. При загрузке одной страницы выполняется один или два вызова, и это приводит к тому же количеству запросов к базе данных. Здесь одна загрузка страницы иногда приводит к нескольким вызовам с большим количеством запросов к базам данных, что делает много вызовов db, и мне сказали, почему они сделали эту форму кэширования, которая теперь реализована. – Johan

+0

Ну, потребность в кешировании зависит от того, сколько трафика вы ожидаете. Если это решение с низким трафиком, кэширование просто усложняет ситуацию, на мой взгляд. –

+1

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

1

MemCached - другой. MemCached предназначен для распределенных архитектур, таких как описываемые вами. Я использую адаптер, написанный Paul Glavic. Он написал сообщение here, в котором демонстрируется, как его использовать.

Переходник Glavs позволит вам в будущем отказаться от реализации кеширования от кэширования Aspnet до MemCached или AppFabric.

Адаптер также обеспечивает хороший API в виде ICacheProvider:

var data1 = cacheProvider.Get<SomeData>("cache-key", DateTime.Now.AddHours(1),() => 
{ 
    // With the cache disabled, this data access code is executed every attempt to 
    // get this data via the CacheProvider. 
    var someData = new SomeData() { SomeText = "cache example1", SomeNumber = 1 }; 
    return someData; 
}); 
+0

Мне это нравится! ура – Mantisimo

Смежные вопросы