Управление кэшем с помощью множества похожих запросов к базе данных - PullRequest
1 голос
/ 12 октября 2011

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

Как и во многих серверных приложениях, у нас есть концепция уровня данных. Этот уровень данных имеет много разных методов, которые возвращают объекты модели домена. Например, у нас есть объект доступа к данным сотрудника с такими методами:

  • findEmployeesForAccount (long accountId)
  • findEmployeesWorkingInDepartment (идентификатор длинной учетной записи, идентификатор длинной позиции)
  • findEmployeesBySearch (длинный accountId, поиск строки)

Каждый метод запрашивает базу данных и возвращает список объектов домена Employee.

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

Я вижу пару возможных решений:

1) Мы создаем кеш для каждого вызова метода. Например. для findEmployeesForAccount мы добавили бы запись с ключевым account-employee-accountId. Для findEmployeesWorkingInDepartment мы могли бы добавить запись с ключом департамент-сотрудники-accountId-департамент-идентификатор и так далее. Проблема, с которой я сталкиваюсь, заключается в том, что, когда мы добавляем нового сотрудника в систему, мы должны убедиться, что добавляем его в каждый список, где это уместно, что сложно поддерживать и подвержено ошибкам.

2) Мы создаем более общий запрос для findEmployeesForAccount (с большим количеством объединений и / или запросов, потому что потребуется больше информации). Для других методов мы используем findEmployeesForAccount и удаляем записи из списка, которые не соответствуют указанным критериям.

Я новичок в кэшировании, поэтому мне интересно, какие стратегии люди используют для обработки подобных ситуаций? Любые советы и / или ресурсы по этому типу материала будет принята с благодарностью.

1 Ответ

0 голосов
/ 24 октября 2011

Я боролся с тем же вопросом сам уже несколько недель ... так что в лучшем случае считайте это полуответом.Один из советов, который мне пригодился, - это использовать Pattern Decorator для реализации слоя кеша.Например, вот статья, подробно описывающая это на C #:

http://stevesmithblog.com/blog/building-a-cachedrepository-via-strategy-pattern/

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

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