Кэшируйте с таймаутом, используя .Net 4 & Concurrent Collections - PullRequest
4 голосов
/ 29 июня 2010

Как бы вы реализовали класс кэша, который поддерживает тайм-ауты, используя новые параллельные коллекции .Net 4?

Класс кэша обычно содержит сотни тысяч записей.Срок действия очень большой части кэша может истечь одновременно.

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

Ответы [ 2 ]

6 голосов
/ 29 июня 2010

Зачем вам нужно реализовать собственный класс кэширования?Разве реализации по умолчанию недостаточно?В .NET 4.0 есть совершенно новая сборка , посвященная кешированию.Пример кэширования значения на 10 минут:

var cache = MemoryCache.Default;
cache.Add("key", new object(), DateTime.Now.AddMinutes(10));
2 голосов
/ 01 июля 2010

Сделайте шаг назад и подумайте, как работает размерный кэш.Политика LRU удалит последнюю использованную запись.Запись считается использованной, когда к ней обращаются (читают) или видоизменяют (пишут).Наиболее распространенный алгоритм состоит в том, чтобы двусвязный список проходил через хеш-таблицу так, чтобы при поиске в таблице запись в цепочке списков находилась за время O (1).В списке сохраняется порядок, в котором заголовок используется наименее недавно, а хвост - самым последним, поэтому доступная запись перемещается в хвост.В случае выселения, запись головы является жертвой, и она не связана и удалена из таблицы.

Теперь подумайте об истечении срока действия.Политики, найденные на практике, будут сбрасывать тайм-аут на основе последнего чтения (время ожидания) или последней записи (время жизни).Это может звучать похоже на алгоритм LRU, описанный выше, так как он поддерживает порядок на основе тех же шаблонов доступа.Разница лишь в том, что кеш определяет, что необходимо выселение: размер против времени.Таким образом, мы можем применить тот же алгоритм и просто изменить способ обнаружения переполнения!

Это означает, что вы можете реализовать алгоритм LRU и обобщить предикат оценки, чтобы разрешить переключение между емкостью, привязанной к временной привязке.Результатом является кешируемый кэш с эффективным использованием времени и пространства.

...