function foo()
{
// проверяем, что процесса перегенерации кэша ещё нет (предполагается что если нужно перегенерировать кеш - то записи в memchached уже нет)
if (!checkExistProcess('key')&&!isnull($memcache->get('key'))) {
// отмечаем, что процесс перегенерации кэша пошёл
$memcache->set('key', null, 10 ); // время жизни этого ключа должно быть маленьким, но не меньше худшего времени генерации (если будет фейл, чтобы ожидающие процессы не ждали вечно)
$data = getdatafromDb();
// сохраним кеш это так же отметит окончание генерации
$memcache->set('key', $data, 60 * 60);
} else {
// процесс есть, ждём, пока завершится (тут так же можно продумать условие окончания ожидания перегенерации кеша, но времени жизни пометки более чем достаточно)
while(checkExistProcess('key')&&isnull($memcache->get('key') )){
time_nanosleep(0, 100000000);
};
$data = $memcache->get('key');
}
return $data;
}
sqlite это полноценная sql база данных с индексами и со скоростью работы в десятки тысяч запросов в секунду, там есть сложности с многопоточным доступом
почти наверняка особых переделок в коде делать не придется, макмимум нужно будет переделать работу с ключами (сиквенсы в postgres есть, а в sqlite отсутствуют, там нужно брать lastInsertId)