Làm thế nào bộ đệm được thực hiện trong Laravel?

Bộ nhớ đệm là một phần thiết yếu của quy trình phát triển phần mềm nếu bạn quan tâm đến khả năng mở rộng và hiệu suất của ứng dụng của mình

Laravel Caching là gì?

Laravel cung cấp triển khai bộ nhớ đệm mạnh mẽ và dễ sử dụng, đồng thời hỗ trợ nhiều phụ trợ bộ nhớ đệm. Thông qua hỗ trợ này, bạn có thể chuyển đổi giữa các chương trình phụ trợ bộ nhớ đệm phù hợp với nhu cầu của mình

Kiến trúc bộ đệm

Một lần truy cập bộ đệm xảy ra khi dữ liệu có sẵn trong bộ nhớ đệm và kết quả là ứng dụng không truy vấn cơ sở dữ liệu. Mặt khác, lỗi bộ đệm xảy ra khi dữ liệu không có trong bộ nhớ đệm và kết quả là ứng dụng phải truy vấn cơ sở dữ liệu

Laravel giúp sử dụng mô hình cùng kiến ​​trúc bằng cách sử dụng hệ thống bộ đệm sẵn có của nó

Lợi ích của bộ nhớ đệm

Một trong những lợi ích của bộ nhớ đệm là nó có thể giảm khối lượng công việc trên các máy chủ ứng dụng của bạn. Ví dụ: bạn có thể lưu trữ các truy vấn cơ sở dữ liệu, phản hồi API và nội dung tệp do đó giảm chi phí máy chủ

Một lợi ích khác là bạn có thể lưu các phản hồi API của bên thứ ba vào bộ nhớ cache, do đó giảm khả năng đạt đến giới hạn điều tiết hoặc giới hạn yêu cầu hàng tháng. Ví dụ: nếu ứng dụng của bạn đang tương tác với API của bên thứ ba, chẳng hạn như API OpenWeatherMap, thay vì gọi API OpenWeatherMap mỗi lần, chúng tôi có thể lưu trữ phản hồi trong bộ đệm và cập nhật nó sau mỗi 1 giờ, do đó giảm số lượng yêu cầu

Đây là một số lợi ích của bộ nhớ đệm

Đánh đổi của bộ nhớ đệm

Mặc dù bộ nhớ đệm có rất nhiều lợi ích, nhưng có một số nhược điểm chúng ta cần lưu ý. Hạn chế đầu tiên là có dữ liệu lỗi thời trong bộ đệm. Hãy tưởng tượng chúng ta có một số bản ghi được lưu trữ trong bộ đệm với thời gian tồn tại là 1 giờ. Trong trường hợp có bản cập nhật trong bản ghi, bộ đệm có thể không được cập nhật dẫn đến dữ liệu lỗi thời được sử dụng trái ngược với dữ liệu mới.

Một nhược điểm khác là khó gỡ lỗi. Có thể khá khó để phát hiện các điểm lỗi trong một ứng dụng vì các bản ghi được lưu trữ trong bộ đệm. Hãy tưởng tượng chúng ta có một truy vấn phức tạp tới cơ sở dữ liệu thực hiện rất nhiều phép tính. Bởi vì chúng tôi có sẵn bộ đệm, chúng tôi sẽ không biết về tính toán truy vấn phức tạp đơn giản vì kết quả có thể được lưu vào bộ đệm và ở cấp độ bề mặt, ứng dụng có vẻ ổn nhưng sâu bên dưới có rò rỉ bộ nhớ đã được chuyển đến sản xuất

Nói chung, có nhiều nhược điểm, nhưng lợi ích lớn hơn nhược điểm và một người sẽ được hưởng lợi rất nhiều từ việc triển khai bộ nhớ đệm trong ứng dụng của họ

Cấu hình và Thiết lập

Laravel đã được cấu hình sẵn để xử lý bộ nhớ đệm. Nó hỗ trợ các dịch vụ bộ nhớ đệm phổ biến như Memcached, Redis, DynamoDB và cơ sở dữ liệu quan hệ mặc định. Dữ liệu cũng có thể được lưu trữ trong một tập tin

Vì Laravel hỗ trợ nhiều dịch vụ bộ đệm, nó sử dụng để xác định dịch vụ bộ đệm nào đang được sử dụng. Một số trình điều khiển là cơ sở dữ liệu, redis, memcached, cơ sở dữ liệu, dynamodb, tệp và mảng. Tùy thuộc vào nhu cầu ngăn xếp của bạn, bạn có thể sử dụng bất kỳ trình điều khiển nào phù hợp với nhu cầu của mình. Đối với tôi, tôi sử dụng trình điều khiển tệp trong quá trình phát triển và trình điều khiển redis trong sản xuất

Sử dụng lệnh Laravel Cache

Laravel cung cấp Cache Facade cho phép chúng ta tương tác với hệ thống cache của mình. Chúng ta có thể sử dụng các phương thức có sẵn trong Facade để thêm bớt dữ liệu trong cache một cách dễ dàng

use Illuminate\Support\Facades\Cache;

Phương pháp bộ đệm

Bộ nhớ cache. nhớ[]

Phương pháp này giúp chúng tôi lấy dữ liệu từ bộ đệm nếu nó có trong bộ đệm hoặc lưu trữ nếu nó không có. Nó yêu cầu 3 tham số; . Khóa bộ đệm là một chuỗi duy nhất sẽ được sử dụng để truy xuất dữ liệu từ bộ đệm. TTL là lượng thời gian tính bằng giây dữ liệu sẽ được lưu trữ trong bộ đệm. Hàm Callback là hàm sẽ được gọi trong trường hợp cache trống

use Illuminate\Support\Facades\Cache;

Cache::remember['categories', now[]->addHour[], function [] {
    return Category::with['subcategories']->get[];
}];

Trong trường hợp này, chúng tôi có khóa bộ đệm của sản phẩm, TTL là 1 giờ [3600 giây] và chức năng gọi lại truy vấn cơ sở dữ liệu trong trường hợp lỗi bộ đệm. Lỗi bộ đệm xảy ra khi dữ liệu không có trong bộ nhớ đệm

Bộ nhớ cache. được[]

Phương pháp này lấy các mục từ bộ nhớ cache. Trong trường hợp lỗi Cache, nó trả về giá trị null

use Illuminate\Support\Facades\Cache;

$categories= Cache::get['categories'];
 
$categories= Cache::get['categories', 'default'];

Bộ nhớ cache. quên đi[]

Phương pháp này giúp xóa các mục khỏi bộ đệm. Điều này cực kỳ hữu ích khi chúng tôi muốn cập nhật các bản ghi bộ đệm với dữ liệu mới

use Illuminate\Support\Facades\Cache;

Cache::forget['categories'];

Bộ nhớ cache. có[]

Phương pháp này xác định nếu một mục tồn tại trong bộ đệm. Nó trả về true nếu nó tồn tại và false nếu không

use Illuminate\Support\Facades\Cache;

if[Cache::has['categories']]{
  //execute some code
}

Bộ nhớ cache. đặt[]

Phương pháp này được sử dụng để lưu trữ dữ liệu trong bộ nhớ cache

use Illuminate\Support\Facades\Cache;

Cache::put['key', 'value', $seconds = 15];

Cache::put['key', 'value'];

Đây là một số phương pháp Cache hữu ích mà bạn sẽ sử dụng trong quá trình phát triển hàng ngày của mình. Có những phương pháp khác mà bạn có thể tìm thấy chúng

Sử dụng Laravel Cache Commands trong Production

Bây giờ chúng ta đã biết các lệnh cơ bản, chúng ta có thể sử dụng chúng trong cơ sở mã sản xuất của mình. Khi một ứng dụng được triển khai vào sản xuất, có rất nhiều thứ chúng ta cần tính đến. Đầu tiên là tốc độ. Được biết, thiết kế truy vấn SQL xấu có thể gây rò rỉ bộ nhớ và dẫn đến ứng dụng chậm. Một cách chúng ta có thể tránh những vấn đề như vậy là giới thiệu một hệ thống bộ đệm

Bộ đệm sẽ nằm giữa ứng dụng Laravel của chúng ta và cơ sở dữ liệu và sẽ trả về dữ liệu trong trường hợp bộ đệm bị tấn công hoặc truy xuất dữ liệu từ cơ sở dữ liệu và lưu trữ trong bộ nhớ trong trường hợp bộ đệm bị lỗi.

Trong Laravel, chúng ta có thể sử dụng phương thức ghi nhớ để xử lý việc này cho chúng ta. Nó sẽ trả về dữ liệu được lưu trong bộ nhớ cache nếu có và lưu trữ dữ liệu đó trong bộ nhớ bằng cách truy xuất dữ liệu từ cơ sở dữ liệu. Bằng cách này, chúng tôi có thể cải thiện tốc độ của ứng dụng bằng cách giảm số lượng truy vấn được thực hiện đối với cơ sở dữ liệu

Điều thứ hai chúng ta cần tính đến là hiệu quả. Nếu chúng tôi đang viết API REST trong Laravel, chúng tôi sẽ muốn phân trang các phản hồi của mình vì chúng tôi không muốn trả về hàng nghìn bản ghi trong một phản hồi

Nhưng làm cách nào để xử lý dữ liệu được phân trang trong Cache?

Nó thực sự khá dễ dàng. Chúng tôi có thể phân trang các kết quả được tìm nạp từ cơ sở dữ liệu. Tuy nhiên, để lưu chúng vào cache, chúng ta cần biết kết quả của trang nào được lưu để khi lấy dữ liệu có thể trả về kết quả cho đúng trang đó.

Để làm như vậy, chúng ta có thể nối khóa bộ đệm với số trang và do đó có kết quả cho các trang khác nhau được lưu trữ khác nhau trong bộ nhớ

use Illuminate\Support\Facades\Cache;

public function index[]
    {
        $currentPage = request[]->get['page', 1];
        return Cache::remember['categories' . $currentPage, now[]->addHour[], function [] {
                return Categories::with['subcategories']->paginate[10];
            }]
        ];
    }

Cập nhật bộ đệm

Một trong những thách thức trong bộ nhớ đệm là cập nhật bộ đệm. Đó là một thách thức vì khó biết khi nào nên cập nhật bộ đệm, đặc biệt là trong sản xuất. Vì chúng tôi sẽ không quản lý bộ đệm theo cách thủ công nên chúng tôi sẽ cần một cách để tự động cập nhật bộ đệm

May mắn thay, Laravel cung cấp một cách để chúng ta có thể cập nhật bộ đệm

Bây giờ chúng tôi có dữ liệu trong bộ đệm, chúng tôi muốn cập nhật ngay khi có dữ liệu mới. Đây là nơi chúng ta sẽ sử dụng phương thức quên. Điều này sẽ xóa dữ liệu cho một khóa bộ đệm cụ thể khỏi bộ nhớ. Trong quá trình phát triển, đây không phải là vấn đề vì chúng tôi chỉ có thể xóa bộ đệm khi có dữ liệu mới. Đây không phải là trường hợp trong sản xuất

Vậy làm cách nào để chúng tôi cập nhật bộ đệm theo quy mô?

Đây là nơi có ích. Người quan sát lắng nghe các sự kiện trên một mô hình nhất định và thực thi mã dựa trên các sự kiện được kích hoạt. Ví dụ: nếu một bản ghi mới được thêm vào cơ sở dữ liệu, chúng tôi muốn bộ đệm được cập nhật để có dữ liệu mới

Chúng tôi có thể loại bỏ dữ liệu trước đó trong bộ nhớ cache và cập nhật dữ liệu đó ở yêu cầu nhận tiếp theo

Để tạo một người quan sát, chúng ta có thể sử dụng make. người quan sát Lệnh thủ công

php artisan make:observer CategoriesObserver --model=Category

Sau đó, chúng ta cần đăng ký Người quan sát trong phương thức khởi động AppServiceProvider trong App\Providers\AppServiceProvider. tập tin php

________số 8

Bây giờ chúng ta có thể thêm Cache. logic quên [] trong bộ quan sát

Chủ Đề