В зависимости от количества серверов, которые у вас есть, и вашей текущей архитектуры кеша, возможно, стоит оценить добавление кеша на уровне сервера (или в процессе).По сути, вы используете это как резервный кеш, и это особенно полезно, когда попадание в основное хранилище (базу данных) является либо очень ресурсоемким, либо медленным.
Когда я использовал это, я использовал кеш в сторонешаблон для первичного кэша и схема сквозного чтения для вторичного устройства, в которой вторичный сервер блокируется и гарантирует, что база данных не будет перенасыщена одним и тем же запросом.При такой архитектуре первичная потеря кэша приводит к не более чем одному запросу на объект на сервер (или процесс) к базе данных.
Таким образом, основной рабочий процесс:
1) Попробуйте извлечь изосновной / общий кэш-пул
* If successful, return
* If unsuccessul, continue
2) Проверить в кеше в процессе значение
* If successful, return (optionally seeding primary cache)
* If unsuccessul, continue
3) Получить блокировку по ключу кеша (и перепроверить в кеше в процессе, весли он был добавлен другим потоком)
4) Извлечь объект из первичной персистентности (дБ)
5) Заполнить кэш в процессе и вернуть
Я сделал этоиспользуя инъекционные оболочки, все слои моего кэша реализуют соответствующий интерфейс IRepository
, а StructureMap внедряет правильный стек кэшей.Это обеспечивает гибкость, направленность и простоту обслуживания фактического поведения кэша, несмотря на то, что оно довольно сложное.