Cache::remember() и null: кеш, который не кеширует
Cache::remember() считает промахом любой null из кеша. Если колбэк вернул null, например first() ничего не нашёл, следующий вызов снова пойдёт в базу. И так на каждый запрос. $user = Cache::remember("user:$email", 600, fn () => User::where('email', $email)->first()); Для несуществующих email такой кеш ничего не даёт, а это часто как раз боты и перебор. Внутри всё просто: remember() делает get(), и если там null, вызывает колбэк заново (Illuminate\Cache\Repository, Laravel 12.x). Если «не найдено» тоже нужно кешировать, возвращайте вместо null что-то другое, например false, и проверяйте это уже после кеша.