Не могу найти информацию по этой теме, нашел лишь одну
статью:
Если есть запрос, который выполняется 10 секунд, ttl для его кэша 1 час.
Когда проходит это время, данные в кэше удаляются.
В первые 10 секунд после этого происходит ситуация, когда несколько пользователей одновременно вызывают этот запрос. Это может привести к катастрофическим последствиям, так как в течение 10 секунд может быть несколько сотен или тысяч таких вызовов.
Чтобы этого избежать, необходимо использовать специальную методику дублирования. Для каждого тяжелого запроса создается не один, а два ключа — ttl и ttl +10 sec.
В момент, когда в кэше удаляются данные, необходимо сначала записать в основной ключ значение из запасного, а только потом приступить к выполнению SQL запроса.
Проблема описана, но решение не ясно, т.к. смущает фраза "
В момент, когда в кэше удаляются данные, необходимо сначала...".
Первое. Кэш может быть удален самим memcached по истечению времени и вышеописанный алгоритм просто "некому" применять.
Второе. Я из клиентского кода не занимаюсь удалением данных кэша, это всё возложено на memcache, на expire значение элемента данных и не знаю, когда данные из кэша будут удалены. Предполагаю, что тут идёт речь о том, что под "удалением данных" инициируется некий CRUD данных, т.е. CRUD должен инициировать вышеописанный процесс.
Но делать этого не хочется на уровне CRUD-а, т.е. не хочется, что бы кэш менялся по данному событию, в идеале - просто по установленному expire значению.
Как сделать правильно?