Кэширование данных в памяти сервера?

Доброе утро, очень интересен данный вопрос. Идея такова, что имеем паттерн репозиторий и оборачиваем его кэшем, к примеру можно будет реализовать это с помощью MemoryCache. Но с этим возникают ряд других вопросов:
  1. Главный из них: Как синхронизовать кэшированнные данные при изменениях(CRUD) записей БД? Дергать кэш, доставать старые данные и добавлять туда новые? Или полностью делать очистку кэша измененных данных?
  2. Могут возникнуть проблемы с доступом к кэшу из разных потоков? Пишут что MemoryCache потоко безопасен, спору нет, но если ты просто читаешь данные из кэша. А вот если у тебя один поток читает, а другой пишет в кэш, без блокировок тут уже не обойтись.
  3. Может быть не стоит делать велосипед?
  4. Есть какие-то готовые и проверенные решения данного вопроса?

  • Вопрос задан
  • 431 просмотр
Решения вопроса 1
NYMEZIDE
@NYMEZIDE
резюме - ivanfilatov.ru
1. в MemoryCache есть понятие Expiration(Времяжизни куска данных). Т.е. вы задаете условно сколько по времени хранить данный объект в кеше. Зависит от ваших задач. Допустим 5 минут.
Задаете 5 минут, для объекта кладете его в MemoryCache методом Add.
При получении делаете Get - если объект не истек по времени, вернется объект, если истек - получите null - проверяете на null - получаете данные по старинке, снова задаете Expiration - и снова делаете Add.
Если вам надо принудительно очистить - делаете Remove.
Также есть метод AddOrGetExisting - он как бы объединяет логику и упрощает код.

2. Чтобы писать из разных потоков нужно писать самому реализацию. Вот пример - MemCache.cs

4. Реализации оберток над MemoryCache есть, не могу что-либо порекомендовать. Но в гугле/github'е находятся. Изучайте.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы