데이터베이스에의 질의나 외부 API의 호출은 CPU나 네트워크의 비용이 높아 처리에 수 초가 걸리는 경우가 있습니다.
같은 데이터를 몇 번이고 취득하는 경우, 결과를 캐시에 보존해 둠으로써 다음 번 이후의 요청을 고속으로 처리할 수 있습니다.Laravel은 Memcached, Redis, DynamoDB, 데이터베이스 등, 다양한 캐시 백엔드에 대응한 통합 API를 제공하고 있습니다.
기본적으로는 database 드라이버가 설정되어 있습니다. Redis나 Memcached로 전환함으로써 더욱 고속의 캐시를 실현할 수 있습니다.
put() 메서드로 데이터를 캐시에 저장합니다. 세 번째 인수에 유효 기간(초)을 지정합니다.
// 10초간 저장Cache::put('key', 'value', 10);// Carbon 인스턴스로 유효 기간을 지정Cache::put('key', 'value', now()->plus(minutes: 10));// 유효 기간 없음(영구 저장)Cache::put('key', 'value');
캐시가 존재하지 않는 경우에만 저장하는 add() 메서드도 있습니다.
// 존재하지 않는 경우에만 추가(원자 조작)Cache::add('key', 'value', $seconds);
// 값이 존재하지 않는 경우는 초기화Cache::add('key', 0, now()->addHours(4));// 인크리먼트 / 디크리먼트Cache::increment('key');Cache::increment('key', $amount);Cache::decrement('key');Cache::decrement('key', $amount);
// 'people' 과 'authors' 태그를 가지는 모든 캐시를 삭제(John도 Anne도 삭제)Cache::tags(['people', 'authors'])->flush();// 'authors' 태그만 삭제(Anne 만 삭제. John 은 남음)Cache::tags('authors')->flush();
사용자별이나 기사별 등, 그룹 단위로 캐시를 무효화하고 싶은 경우에 태그가 도움이 됩니다.
예: Cache::tags(['user', "user:{$userId}"])->flush()로 그 사용자에 관한 모든 캐시를 클리어할 수 있습니다.
락을 취득할 수 있을 때까지 최대 지정 초 수 대기합니다. 타임아웃되면 LockTimeoutException이 던져집니다.
use Illuminate\Contracts\Cache\LockTimeoutException;$lock = Cache::lock('foo', 10);try { $lock->block(5); // 최대 5초 대기 // 락 취득 후의 처리} catch (LockTimeoutException $e) { // 락 취득 실패} finally { $lock->release();}
클로저를 사용하면 단순하게 쓸 수 있습니다.
Cache::lock('foo', 10)->block(5, function () { // 최대 5초 대기해서 락을 취득하고, 완료 후에 자동 해방});
Cache::withoutOverlapping('foo', function () { // 동시에 1개만 실행됨});// 대기 시간과 락 보유 시간을 커스터마이즈Cache::withoutOverlapping('foo', function () { // ...}, lockFor: 120, waitFor: 5);
Cache::funnel('foo') ->limit(3) // 최대 3개의 병렬 실행을 허가 ->releaseAfter(60) // 60초 후에 자동 해방 ->block(10) // 최대 10초 대기 ->then(function () { // 동시 실행 슬롯을 확보할 수 있었던 경우의 처리 }, function () { // 슬롯을 확보할 수 없었던 경우의 처리 });
현재 보유하고 있는 락의 유효 기간을 연장하려면 refresh 메서드를 사용합니다. 초 수를 지정하지 않는 경우는 락 취득 시의 원래 유효 기간이 사용됩니다. 장시간 처리에서 짧은 락을 정기적으로 연장하고 싶은 경우에 편리하며, 처음부터 매우 긴 유효 기간을 설정할 필요가 없어집니다.
$lock = Cache::lock('generate-reports', 60);if ($lock->get()) { foreach ($reports as $report) { $report->generate(); // 락을 추가로 60초 연장 $lock->refresh(); } $lock->release();}
cache() 헬퍼 함수를 사용하면 Cache 파사드와 같은 조작을 보다 단순하게 쓸 수 있습니다.
// 값을 취득$value = cache('key');// 값을 저장(유효 기간 포함)cache(['key' => 'value'], $seconds);cache(['key' => 'value'], now()->addMinutes(10));// 인수 없이 파사드와 같은 인스턴스를 취득cache()->remember('users', $seconds, function () { return DB::table('users')->get();});
use Illuminate\Support\Facades\Cache;use Illuminate\Support\Facades\DB;public function index(): array{ $users = Cache::remember('all-users', 3600, function () { return DB::table('users')->orderBy('name')->get(); }); return compact('users');}
2
데이터가 업데이트되면 캐시를 삭제
public function store(Request $request): RedirectResponse{ User::create($request->validated()); // 캐시를 삭제해 다음 접근 시에 재취득 Cache::forget('all-users'); return redirect()->route('users.index');}