Laravel 캐시: 애플리케이션 성능 향상

안녕 얘들아
오늘은 캐싱 측면에서 애플리케이션 성능 향상에 대해 이야기하려고 합니다.

캐싱은 기본 데이터 원본 앞에 데이터 복사본을 저장하는 전략입니다.
캐싱의 이점에는 더 빠른 응답 시간과 데이터를 신속하게 제공하는 기능이 포함되어 있어 애플리케이션 및 사용자 경험의 성능을 향상시킬 수 있습니다.

애플리케이션에 캐시가 정말로 필요합니까? 개인적으로 저는 그렇습니다. 필요합니다.

응용 프로그램을 블록으로 분해하면 다음 그림을 얻을 수 있습니다.


  • DB 블록은 MySQL, PostgreSQL, MariaDB 등과 같은 당사의 애플리케이션 기본 데이터베이스 엔진입니다.
  • 다른 DataSource 블록은 ElasticSearch 등과 같은 외부 검색 엔진과 같은 선택적 데이터 소스입니다. 응용 프로그램에 있을 수도 있고 없을 수도 있습니다.
  • 파일 저장소 - 리소스 또는 정적 파일을 위한 파일 저장소가 항상 있습니다.
  • 뷰 블록은 Laravel Blade 또는 Smarty와 같은 템플릿 엔진이거나 자체 애플리케이션 서버 또는 프리렌더러가 있는 React, Angular 또는 VueJS 뷰일 수 있습니다. 일부 API 클라이언트일 수도 있으며 이 경우 "보기"는 들어오는 API 호출에 대한 응답이라고 말할 수 있습니다.

  • 이 기사에서는 주로 데이터베이스의 캐싱 결과에 대해 이야기합니다.

    한 가지 주요 사항: Cache를 사용하기로 결정하기 전에 SQL 쿼리를 최적화했는지 확인하십시오. SQL 쿼리를 최적화하지 않은 상태로 두고 캐싱으로 인해 이 문제를 해결하려고 시도하는 것은 이치에 맞지 않습니다.

    복잡한 where 절, 조인 등을 사용하여 매우 큰 테이블에 쿼리를 수행하는 경우 결과를 검색하는 데 시간이 걸릴 수 있습니다. 그리고 이것은 캐시하기에 좋은 장소입니다.

    public function getProductsBlock(int $limit = 5)
    {
        return Products::query()
            ->indexed()
            ->whereHas("images", function(Builder $query) {
                $query->active();
            })
            ->with("images")
            ->with("comments")
            ->with("ratings")
            ->with("attributes")
            ->orderBy('id', 'desc')
            ->limit($limit)
            ->get();
    }
    


    예를 들어, 하위 쿼리, 4개의 관계, 하나의 orderBy 및 심지어 "limit"가 포함된 복잡한 쿼리가 충분히 있습니다.
    예를 들어 작동하지 않는 더미 쿼리입니다.
    캐시로 어떻게 덮을 수 있는지 봅시다.

    public function getProductsBlock(int $limit = 5)
    {
        $cacheKey = "products_block_" . "_" . $limit;
        $ttl = 600; // 10 minutes.
    
        return Cache::remember($cacheKey, $ttl, function() use ($limit) {
            return Products::query()
                ->indexed()
                ->whereHas("images", function(Builder $query) {
                    $query->active();
                })
                ->with("images")
                ->with("comments")
                ->with("ratings")
                ->with("attributes")
                ->orderBy('id', 'desc')
                ->limit($limit)
                ->get();
        });
    }
    
    


    이제 데이터를 캐시에 저장하고 번개처럼 빠르게 검색할 수 있으며 데이터베이스를 방해하지 않습니다.

    하지만 데이터가 변경된 경우에는 어떻게 됩니까?getProductsBlock()를 호출하면 캐시에서 데이터를 반환하며 현재 최신 상태가 아닙니다.

    이를 처리하는 방법과 캐시 기능에 대한 올바른 TTL(Time To Live)을 선택하는 방법은 이 비디오에서 설명했습니다.



    제 채널을 좋아하고 구독해 주시면 새로운 동영상을 만드는 데 동기를 부여해 드립니다. 궁금하신 점은 유튜브 댓글로 물어봐주세요.

    좋은 웹페이지 즐겨찾기