Одна из больших проблем кеширования, на мой взгляд, когда две асинхронные функции одновременно обращаются к кэшу за одним и тем же значением, которого в кеше нет. В итоге они оба начинают это значение вычислять без кеша, а потом в конце класть в кеш.
Есть ли на nodejs какие-нибудь готовые модули, которые такую ситуацию разруливают?
Мне нужно примерно такое поведение:
Алиса: get x (id=5, callback=callback1) --> кеш запоминает, что id=5 неудачно запрашивалось и скоро будет записано, вызывает callback1(false)
Алиса начинает вычислять этот x(id=5)
Боб: get x (id=5, callback=callback2) --> кеш знает, что Алиса скоро вычислит x(id=5) и ничего не возвращает Бобу
Карл: get x(id=5, callback=callback3) --> аналогичное поведение, как на предыдущем шаге
Алиса: set x(id=5, result=123) --> кеш запоминает результат для id=5, и возвращает результат в колбэки, которые скопились в очереди (callback2, callback3).
Боб: получает callback2(result=123)
Карл: получает callback3(result=123)
И также возможность протухать ожидание, если запроса на запись в кэш не было уже достаточно долго (первому колбэку из очереди возвращать false, следующим - дальше ждать).