У меня есть стандартный сценарий, когда у вас есть несколько параллельных запросов, пытающихся получить доступ к одному и тому же ключу в кэше на основе Redis.
Когда срок действия этого ключа истек, запрашивающий процесс уведомляет какого-то внешнего работника о том, что его необходимо пересчитать (возможно, этот работник находится на другом сервере). Работник пересчитывает его и обновляет кеш.
Когда кеш горячий, все в порядке, потому что я могу продолжать обслуживать устаревшие данные из кеша, пока новое значение не будет пересчитано.
Проблема в том, что кеш холодный и в Redis еще нет данных для обслуживания. Запрашивающий процесс должен ждать, пока значение не будет сгенерировано внешним работником. Я не могу использовать разогрев кеша в этом случае, потому что только запрошенные ключи должны быть кешированы из-за ограниченного размера кеша.
Итак, вопрос в том, как я могу сделать PHP запросов на ожидание, пока вычисленное значение станет доступным в Redis? Или каково будет общее решение в этом случае?
Возможные решения, о которых я уже говорил:
Команда Redis blpop, вероятно, не будет работать, потому что пересчитываемое значение отсутствует в списке и выглядит как обходной путь. Может быть, можно реализовать какую-то блокировку на основе файлов? Однако веб-приложение и рабочий находятся на отдельных серверах, и NFS, например, не поддерживает блокировки файлов.
Единственное возможное рабочее решение, о котором я могу подумать, - это иметь бесконечное время l oop, которое отправляет эхо-запрос Redis каждые X миллисекунд. с некоторым временем ожидания Y max. Однако действительно ли это хорошее и практичное решение? Потому что я не фанат бесконечных циклов в предположительно недолговечных веб-запросах. Кроме того, сотни запросов потенциально могут выполнять бесконечные циклы и ждать, пока значение будет пересчитано.