Подтвердить что ты не робот

Управление недействительностью кэша

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

В любом случае вы можете ссылаться на отношения из таблицы в базе данных и каким-то образом ее применять?

Не обращай на меня внимания, поскольку я никогда раньше не делал кеширования.

4b9b3361

Ответ 1

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

Для этого у вас есть два решения:

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

Первое довольно редко, но довольно легко справиться: просто обновляйте свой кеш на регулярной основе.

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

  • Добавьте новый объект в свой кеш сразу после его добавления в свою базу данных.
  • Обновите объект в кеше сразу после его успешного обновления в своей базе данных.
  • Удалите объект из своего кеша сразу после его успешного удаления в своей базе данных.

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

Ответ 2

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

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

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

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

Это очень простой пример, конечно. Более простой способ сделать это - написать свой код, чтобы всегда поддерживать объект так, как он был бы в кеше.

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

Ответ 3

Если вы используете SQL Server 2005 или более позднюю версию и .NET, вам может понадобиться изучить класс SQLDependency. То, что этот класс делает, это использовать SQL Server Service Broker, чтобы уведомить вас, когда определенные изменения произошли в ваших данных. Вы можете использовать это как триггер для аннулирования кеша. Опять же, это применимо только в том случае, если вы используете эти технологии.

Ответ 4

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

Если obj B является внешним ключом obj A и некоторыми свойствами изменений A, вам также необходимо обновить кеш B. Кроме того,

При использовании структуры на основе дерева, если определено изменение в "ветке", обновите кеш всех "листов". Или, если обновляется "root", обновляется кеш всех "ветвей" + "уходит" полностью вниз. Подумайте об иерархии.

Ответ 6

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

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

(Единственная действительно необходимая общая вещь - это функциональность для обработки пропусков в кеше.
И еще одна вещь, заслуживающая внимания - это идентификация с клиентами: если у вас несколько клиентов, одного кеша может быть недостаточно... Но для обеих проблем были добавлены только конкретные решения, а не общие!)

Я знаю, чтобы описать такую ​​базовую функциональность, может показаться глупым. Можно сказать, что "мы должны были использовать обычный кэш в первую очередь". Но вы знаете, на самом деле иногда некоторые вещи просто выходят из-под вашего контроля, и вам просто нужно сделать все возможное.

Итак, подведем итог: нам не нужно общего решения. Наши алгоритмы управляют кешем. Это делает кеш небольшим (как в коде, так и в памяти во время выполнения). Это наш подход.

Ответ 7

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

Я не уверен четко понять эту часть, но я думаю, что вы должны определить разные "regions" (например, в терминологии Hibernate), каждый со своим контентом и правилами.

В любом случае вы можете ссылаться на отношения из таблицы в базе данных и каким-то образом ее применять?

Уровень persistence - лучшее место для этого, на мой взгляд, поскольку он знает, что происходит с постоянными и потенциально кэшированными объектами. Например, Hibernate поддерживает (второй уровень) кэширование и позволяет определить имя области кэша второго уровня, стратегию кэширования (read- только чтение, запись, нестрочное чтение-запись, транзакционное) для каждого объекта. Hibernate фактически определяет интерфейс и позволяет подключать кэш-реализацию в зависимости от ваших потребностей (тип кеша, поддерживаемые стратегии, поддержка кластера).

Нести со мной, поскольку я никогда не делал кеширования раньше.

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