Кэш и долго выполняющуюся процедуры

Много лет не могу постичь этой темы. Самый обычный сценарий: смотрим в кэш, если там пусто, то запускаем процедуру получения данных, которые затем и положим в кэш. Так вот, если запросов много, то эта долгая и тяжёлая процедура начнёт выполнятся столько раз, сколько будет запросов за этими данными, до тех пор, пока в кэш не запишется что-то. Ну например подсчёт строк на огромной БД. Хотелось бы, чтобы всё таки был один запрос select count(*) from table, а не... ну то, что я описал. Так же непонятно, что возвращать клиенту, пока процедура выполняется. Два кэша нужно? Один долгий, другой обычный? Кто как решает эту проблему? Может и паттерн уже придумали какой? Или либу или обёртку в рамках какого-нибудь фреймворка?
 

weregod

unserializer
На коленке:
1. данные есть в кэше -вернули;
2. данных нет в кэше: если взведён флаг "работаем", начинаем его регулярно проверять, пока он не сбросится и данные не попадут в кэш, развращаем данные из кэша;
3. данных нет в кэше: если флаг "работаем" не взведён, взводим и получаем нужные данные, кладём в кэш, сбрасываем флаг, развращаем данные.
Логику в случае обвала и неполучения данных в п. 3 сам додумывай.
 
Не очень благополучный вариант. Регулярно проверять - означает ждать т.е. будет пул каких-то процессов в ожидании, соответственно будут ждать и клиенты. Хотелось бы что-нибудь поизящнее )
 

WMix

герр M:)ller
Партнер клуба
вариантов не много, не использовать cache, в смысле писать четкий процесс для подготовки данных для чтения без тормозов.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Можно по разному извращаться, ставить семафор, что кеш заполняется и не запускать второй тяжелый процесс чтения, можно отдавать "старые" данные, если это не сильно критично и зависит от ситуации, можно прогревать кеш и еще много-много вариантов
 

WMix

герр M:)ller
Партнер клуба
весь прикол в том, что ему не странички нужны он хочет select count(*) в кэш положить, и это я бы делать не стал бы.
я внимательно смотрел бы проблему
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
весь прикол в том, что ему не странички нужны он хочет select count(*) в кэш положить, и это я бы делать не стал бы.
я внимательно смотрел бы проблему
Да вроде как он просто для примера count привел)
 
Сверху