Как удалить устаревшие элементы из кэша? - PullRequest
3 голосов
/ 26 сентября 2008

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

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

Какая хорошая методология для удаления таких элементов из кэша?

Должен ли я иметь фоновый поток, бесконечно перечисляющий каждый элемент в кэше, чтобы проверить, не истек ли он?

Ответы [ 5 ]

5 голосов
/ 27 сентября 2008

Лучший код - это без кода. Вместо этого используйте кеш ASP.NET. Вы можете ссылаться на него как System.Web.HttpRuntime.Cache в любом приложении, а не только в веб-приложениях.

1 голос
/ 26 сентября 2008

По моему опыту, поддержка специального механизма кэширования стала более сложной задачей, чем она того стоила. Есть несколько библиотек, которые уже решили эти проблемы. Я бы предложил использовать один из них. Популярной в .Net является Enterprise Library, хотя у меня ограниченный опыт ее кеширования.

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

1 голос
/ 26 сентября 2008

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

Ответ Харальда Шейрича лучше, хотя, если вы не возражаете, что объекты вечно торчат, когда кеш не обновляется.

1 голос
/ 26 сентября 2008

Вы можете удалить старые элементы из кэша при первом доступе через 1 минуту после последней очистки элементов.

private DateTime nextFlush;
public object getItem(object key)
{
  DateTime now = DateTime.Now
  if (now > nextFlush)
  {
    Flush();
    nextFlush = now.AddMinutes(1)
  }
  return fetchItem(key);
}
1 голос
/ 26 сентября 2008

Вы можете реализовать стратегию LRU (наименьшее количество недавно использованных), сортировать свои элементы по времени доступа, когда новый элемент вставляется в кэш и кэш заполнен, вы выселили последний элемент в этом списке. См. Алгоритмы кэширования в Википедии.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...