+7

[Laravel Certification] Caching trong Laravel 9

Đây là tài liệu ôn để thi laravel certification với phiên bản laravel 9 mình làm mới mục đích ôn tập và lưu giữ lại những ngày tháng học hành "nghiêm túc" của mình. Chả có cách học nào tốt bằng việc chia sẻ kiến thức lại cho người khác cả phải không các bạn 😄 .

Lần này tôi làm về caching trong laravel.

I. Giới thiệu về cache trong laravel

Laravel là một framework rất mạnh để làm web là điều mà ai cũng phải công nhận , vì vậy "nó" cung cấp cho lập trình viên rất nhiều công cụ, tính năng hay ho trong đó không thể không kể đến cache. Vậy cache là gì ?

Cache là một bộ nhớ tạm thời được sử dụng để lưu trữ các dữ liệu hay tài nguyên được truy cập thường xuyên trong quá trình hoạt động của một ứng dụng phần mềm. Việc sử dụng cache giúp giảm thiểu thời gian truy cập dữ liệu từ hệ thống lưu trữ chính (như cơ sở dữ liệu hoặc bộ nhớ) bằng cách giữ các bản sao của dữ liệu đó trong bộ nhớ tạm thời. Khi ứng dụng cần truy cập dữ liệu, nó sẽ truy cập vào bộ nhớ cache trước đó để lấy dữ liệu nhanh hơn.

Cache được sử dụng rộng rãi trong các ứng dụng web và ứng dụng di động để cải thiện tốc độ và hiệu suất của ứng dụng. Các dữ liệu được lưu trữ trong cache có thể là các trang web, tài nguyên hình ảnh, tài liệu văn bản, kết quả truy vấn cơ sở dữ liệu, hoặc bất kỳ loại dữ liệu nào cần được truy cập thường xuyên. Việc sử dụng cache là một trong những chiến lược cải thiện hiệu suất của các ứng dụng phần mềm, đặc biệt là trong các hệ thống lớn và phức tạp.

II. Những mục cần nắm được khi học cache Laravel ?

1. Drivers/Configuration

Trong caching, drivers và configuration đóng vai trò quan trọng để quản lý cache và tối ưu hiệu suất của hệ thống. Dưới đây là một số thông tin chi tiết về hai khái niệm này:

1. Drivers:

  • Drivers là những thành phần của caching layer (tầng lưu trữ tạm thời) giúp kết nối tới các hệ thống lưu trữ dữ liệu như Redis, Memcached, hoặc các hệ thống lưu trữ dữ liệu khác.
  • Khi triển khai caching, người phát triển có thể lựa chọn driver phù hợp với hệ thống của mình để tăng hiệu suất và độ tin cậy của caching layer.
  • Một số driver phổ biến trong caching layer bao gồm: Memcached driver, Redis driver, Database cache driver, DynamoDB cache driverFile driver.

2. Configuration:

  • Configuration định nghĩa cách thức hoạt động của caching layer.
  • Thông qua các cấu hình, người phát triển có thể tùy chỉnh các tham số để tăng hiệu suất và tối ưu việc lưu trữ dữ liệu tạm thời.
  • Các tham số cấu hình có thể bao gồm kích thước bộ nhớ cache, thời gian sống của các mục trong cache, các chính sách xóa cache, cơ chế khóa và giải phóng bộ nhớ tạm thời, và nhiều hơn nữa.

3. Giới thiệu 4 loại cache driver mà laravel cung cấp

  • File caching: Laravel hỗ trợ file caching thông qua driver "file". Khi sử dụng driver này, các cache item sẽ được lưu trữ trong các tệp tin trên đĩa, và bạn có thể cấu hình thư mục lưu trữ cache

    Để sử dụng file caching, trước tiên bạn cần cấu hình driver cache trong file config/cache.php bằng cách đặt giá trị 'file' cho key 'default': 'default' => 'file',

  • Memcached: Là một hệ thống lưu trữ cache trên bộ nhớ đệm phân tán và được sử dụng rộng rãi để tăng tốc độ truy cập dữ liệu trong ứng dụng web. Laravel cung cấp hỗ trợ cho Memcached thông qua driver memcached.

    Để sử dụng Memcached trong Laravel, bạn cần cài đặt Memcached trên máy chủ của mình hoặc sử dụng các dịch vụ cung cấp Memcached như Amazon ElastiCache hoặc Google Cloud Memorystore.

    Sau khi đã cài đặt Memcached, bạn có thể cấu hình driver cache trong file config/cache.php bằng cách đặt giá trị memcached cho key default và định cấu hình server Memcached:

       'default' => 'memcached',
        'memcached' => [
            'driver' => 'memcached',
            'persistent_id' => env('MEMCACHED_PERSISTENT_ID'),
            'sasl' => [
                env('MEMCACHED_USERNAME'),
                env('MEMCACHED_PASSWORD'),
            ],
            'options' => [
                // Định cấu hình các tùy chọn Memcached
                Memcached::OPT_CONNECT_TIMEOUT => 2000,
            ],
            'servers' => [
                [
                    'host' => env('MEMCACHED_HOST', '127.0.0.1'),
                    'port' => env('MEMCACHED_PORT', 11211),
                    'weight' => 100,
                ],
            ],
        ],
  • Redis: Là một hệ thống lưu trữ cache và cơ sở dữ liệu phân tán được sử dụng rộng rãi để tăng tốc độ truy cập dữ liệu trong ứng dụng web. Laravel cung cấp hỗ trợ cho Redis thông qua driver "redis".

    Để sử dụng Redis trong Laravel, bạn cần cài đặt Redis trên máy chủ của mình hoặc sử dụng các dịch vụ cung cấp Redis như Amazon ElastiCache hoặc Google Cloud Memorystore

    Sau khi đã cài đặt Redis, bạn có thể cấu hình driver cache trong file config/cache.php bằng cách đặt giá trị 'redis' cho key 'default' và định cấu hình server Redis:

'default' => 'redis',
'redis' => [
    'client' => 'phpredis',
    'options' => [
        'cluster' => 'redis',
        'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
    ],
    'default' => [
        'url' => env('REDIS_URL'),
        'host' => env('REDIS_HOST', '127.0.0.1'),
        'password' => env('REDIS_PASSWORD', null),
        'port' => env('REDIS_PORT', 6379),
        'database' => env('REDIS_DB', 0),
    ],
],
  • Database caching: Là một cơ chế lưu trữ cache dựa trên cơ sở dữ liệu, trong đó các bản sao của các yêu cầu truy vấn được lưu trữ trong cơ sở dữ liệu để sử dụng lại cho các yêu cầu truy vấn tương tự. Laravel cung cấp hỗ trợ cho database caching thông qua driver "database".

    Để sử dụng database caching trong Laravel, bạn cần tạo một bảng để lưu trữ các bản sao cache. Bảng này cần có các trường: "key", "value", "expiration" và "tags" (tuỳ chọn). Bạn có thể tạo bảng này bằng câu lệnh migration trong Laravel hoặc tạo thủ công.

    Sau khi đã tạo bảng cache, bạn cần cấu hình driver cache trong file config/cache.php bằng cách đặt giá trị database cho key default và định cấu hình kết nối cơ sở dữ liệu:

        'default' => 'database',

        'connections' => [
            'database' => [
                'driver' => 'database',
                'table' => 'cache',
                'connection' => null,
            ],
        ],
  • Giới thiệu thêm về DynamoDB cache driver

    DynamoDB là một dịch vụ cơ sở dữ liệu NoSQL của Amazon Web Services (AWS) được sử dụng để lưu trữ dữ liệu có cấu trúc hoặc không cấu trúc. DynamoDB được thiết kế để cung cấp tính sẵn sàng và khả năng mở rộng cao, vì vậy nó là một lựa chọn phổ biến cho việc lưu trữ dữ liệu trên đám mây.

    Trong Laravel, có thể sử dụng DynamoDB cache driver để lưu trữ cache trên DynamoDB. Để sử dụng driver này, trước tiên cần cài đặt AWS SDK for PHP. Sau đó, ta cần cấu hình driver trong file config/cache.php của Laravel như sau:

'dynamo' => [
   'driver' => 'dynamodb',
   'key' => 'your-aws-key',
   'secret' => 'your-aws-secret',
   'region' => 'your-aws-region',
   'table' => 'your-dynamodb-table',
 ],
use Illuminate\Support\Facades\Cache;

// Lưu trữ một giá trị vào cache
Cache::store('dynamo')->put('key', 'value', $expiration);

// Lấy giá trị từ cache
$value = Cache::store('dynamo')->get('key');

4. Phương pháp caching nào là tốt nhất

Không có một phương pháp caching nào là tốt nhất cho tất cả các trường hợp, bởi vì mỗi phương pháp caching có ưu điểm và hạn chế riêng của nó, và tùy thuộc vào nhu cầu của ứng dụng mà phương pháp caching phù hợp sẽ khác nhau.

Có một số yếu tố cần xem xét khi lựa chọn phương pháp caching, bao gồm:

  • Tần suất truy cập dữ liệu: Nếu dữ liệu được truy cập thường xuyên, sử dụng caching trong bộ nhớ (memory caching) như Redis hoặc Memcached có thể là tốt nhất.

  • Kích thước dữ liệu: Nếu kích thước dữ liệu là rất lớn, sử dụng phương pháp caching trong file (file caching) hoặc caching trong database có thể là lựa chọn tốt hơn.

  • Số lượng truy vấn đồng thời: Nếu có nhiều người dùng truy cập cùng một lúc, caching trong bộ nhớ (memory caching) có thể không phù hợp, và caching trong database có thể là tốt hơn.

  • Tính nhất quán dữ liệu: Nếu tính nhất quán dữ liệu là rất quan trọng, sử dụng phương pháp caching trong bộ nhớ (memory caching) hoặc Redis có thể là tốt nhất, vì chúng có thể hỗ trợ giao dịch và khóa để đảm bảo tính nhất quán của dữ liệu.

  • Khả năng mở rộng: Nếu ứng dụng của bạn cần mở rộng lên nhiều máy chủ, sử dụng Redis hoặc Memcached là tốt nhất, vì chúng hỗ trợ phân phối cache trên nhiều máy chủ.

=> Vì vậy, để lựa chọn phương pháp caching phù hợp nhất cho ứng dụng của bạn, bạn cần xem xét kỹ các yếu tố trên và tìm hiểu về các phương pháp caching khác nhau để có thể quyết định đúng.

Một vài ví dụ tiêu biểu về loại cache khác nhau

  1. Cache file: Một trang web tin tức có thể sử dụng cache file để lưu trữ nội dung của các bài viết và trang chủ. Khi người dùng truy cập vào trang chủ hoặc bài viết, nội dung sẽ được lưu trữ trong cache file để giảm thiểu thời gian tải trang và tăng tốc độ truy cập cho người dùng.

  2. Cache Redis: Một dịch vụ trò chơi trực tuyến có thể sử dụng cache Redis để lưu trữ thông tin về người chơi, điểm số và cấu hình trò chơi. Redis cung cấp tính năng lưu trữ dữ liệu trong bộ nhớ để giảm thiểu thời gian truy xuất dữ liệu từ cơ sở dữ liệu.

  3. Cache Memcached: Một ứng dụng thương mại điện tử có thể sử dụng cache Memcached để lưu trữ thông tin về sản phẩm và giỏ hàng của người dùng. Khi người dùng thêm sản phẩm vào giỏ hàng, thông tin sẽ được lưu trữ trong cache Memcached để giảm thiểu thời gian tải lại trang và tăng trải nghiệm mua sắm cho người dùng.

  4. Cache database: Một ứng dụng quản lý dự án có thể sử dụng cache database để lưu trữ thông tin về tình trạng dự án, các bước tiếp theo và các người tham gia dự án. Cache database giúp giảm thiểu thời gian truy xuất cơ sở dữ liệu và tăng tốc độ ứng dụng.

  5. Cache session: Một ứng dụng đăng nhập có thể sử dụng cache dựa trên phiên để lưu trữ thông tin đăng nhập của người dùng. Khi người dùng đăng nhập, thông tin đăng nhập sẽ được lưu trữ trong cache dựa trên phiên để giảm thiểu thời gian truy xuất cơ sở dữ liệu và tăng tốc độ ứng dụng.

2. Storing Items

Trong Laravel, để lưu trữ một item vào cache, chúng ta có thể sử dụng các method của Cache facade, như put, add, forever, hoặc remember.

Cú pháp chung cho các method này như sau:

use Illuminate\Support\Facades\Cache;

// Lưu trữ một item vào cache trong một khoảng thời gian nhất định
Cache::put('key', 'value', $expiration);

// Lưu trữ một item vào cache trong một khoảng thời gian nhất định nếu chưa tồn tại
Cache::add('key', 'value', $expiration);

// Lưu trữ một item vào cache với thời gian sống vô hạn
Cache::forever('key', 'value');

// Lấy một item từ cache, nếu không tồn tại thì tạo mới và lưu trữ trong cache
$value = Cache::remember('key', $expiration, function () {
    return 'value';
});

Trong đó, $expiration là thời gian sống của item trong cache, tính bằng giây. Nếu không cung cấp $expiration, item sẽ được lưu trữ với thời gian sống mặc định được cấu hình trong file config/cache.php.

Khi lưu trữ một item trong cache, Laravel sử dụng driver cache hiện tại được cấu hình để lưu trữ item đó. Các driver cache có thể là file, database, redis, hoặc các driver cache tùy chỉnh khác.

Khi cần lấy một item từ cache, chúng ta chỉ cần sử dụng method get của Cache facade:

$value = Cache::get('key');

Nếu item không tồn tại trong cache, method get sẽ trả về null.

Để xóa một item khỏi cache, chúng ta có thể sử dụng method forget:

Cache::forget('key');

Nếu cần xóa toàn bộ các item trong cache, chúng ta có thể sử dụng method flush:

Cache::flush();

3. Retrieving Items

Để lấy một item từ cache trong Laravel, chúng ta có thể sử dụng method get của Cache facade:

$value = Cache::get('key');

Trong đó, key là khóa của item cần lấy.

Nếu item tồn tại trong cache, get sẽ trả về giá trị của item. Nếu không, get sẽ trả về null. Ngoài ra, chúng ta có thể sử dụng method get để lấy giá trị mặc định nếu item không tồn tại:

$value = Cache::get('key', 'default');

Trong đó, default là giá trị mặc định được trả về nếu item không tồn tại trong cache.

Nếu chúng ta muốn kiểm tra xem item có tồn tại trong cache hay không, chúng ta có thể sử dụng method has:

if (Cache::has('key')) {
    // Item exists in cache
} else {
    // Item does not exist in cache
}

Nếu cần lấy và xóa một item khỏi cache ngay sau đó, chúng ta có thể sử dụng method pull:

$value = Cache::pull('key');

Trong đó, pull sẽ lấy giá trị của item và xóa item khỏi cache. Nếu item không tồn tại trong cache, pull sẽ trả về null.

4. Cache Tags

Cache tags là một tính năng mạnh mẽ của Laravel Cache, cho phép gán các thẻ (tags) vào các items trong cache, và cho phép lấy và xóa tất cả các items cùng được gắn thẻ đó một cách dễ dàng.

Để gán các tags cho một item trong cache, chúng ta có thể sử dụng method tags trên Cache facade:

Cache::tags(['tag1', 'tag2'])->put('key', 'value', $minutes);

Trong đó, ['tag1', 'tag2'] là danh sách các tag được gán cho item.

Để lấy tất cả các items được gắn một tag, chúng ta có thể sử dụng method tags trên Cache facade:

$items = Cache::tags('tag1')->get('key');

Trong đó, tag1 là tag được sử dụng để lấy các items.

Chúng ta cũng có thể xóa tất cả các items được gắn một tag bằng cách sử dụng method tags trên Cache facade:

Cache::tags('tag1')->flush();

Trong đó, tag1 là tag được sử dụng để xóa các items.

Lưu ý rằng các tags có thể được sử dụng để gán cho một số lượng items trong cache, và các items này có thể có các tags khác nhau. Tuy nhiên, cần lưu ý rằng khi xóa các items theo tag, chỉ các items được gắn cùng tag đó mới bị xóa. Các items khác trong cache vẫn được giữ nguyên.

Ví dụ thực tế về việc gán tag cho cache

Giả sử chúng ta có một ứng dụng web bán hàng, trong đó chúng ta lưu trữ thông tin về sản phẩm và giá cả trong cơ sở dữ liệu. Khi người dùng truy cập vào trang sản phẩm, chúng ta cần lấy thông tin về sản phẩm và giá từ cơ sở dữ liệu. Tuy nhiên, việc truy vấn cơ sở dữ liệu có thể tốn nhiều thời gian, làm chậm tốc độ phản hồi của trang web.

Để giải quyết vấn đề này, chúng ta có thể sử dụng cache để lưu trữ thông tin về sản phẩm và giá, và sử dụng cache tags để quản lý các items trong cache. Trong trường hợp này, chúng ta có thể gắn các tag là product_{id}price_{id} vào các items trong cache, với id là mã sản phẩm.

Khi người dùng truy cập vào trang sản phẩm, chúng ta trước tiên kiểm tra xem thông tin về sản phẩm và giá có trong cache không, nếu có thì trả về thông tin đó từ cache. Nếu không, chúng ta truy vấn cơ sở dữ liệu để lấy thông tin về sản phẩm và giá, và lưu thông tin đó vào cache với các tag tương ứng.

Khi thông tin về sản phẩm hoặc giá của một sản phẩm được cập nhật trong cơ sở dữ liệu, chúng ta cần xóa các items trong cache có tag tương ứng để đảm bảo rằng thông tin được lấy từ cache luôn là thông tin mới nhất.

5. Creating Custom Drivers

Khi bạn sử dụng một loại hệ thống lưu trữ cache đặc biệt mà không được hỗ trợ bởi Laravel mặc định, hoặc khi bạn muốn tùy chỉnh hoặc cải tiến việc lưu trữ cache của mình theo cách riêng của mình, bạn có thể cần phải tạo một Custom Driver.

Ngoài ra, trong một số trường hợp, bạn có thể muốn tạo một Custom Driver để sử dụng các cơ chế cache khác nhau cho các phần khác nhau của ứng dụng của mình, tùy thuộc vào yêu cầu và hình thức lưu trữ.

Trong Laravel, bạn có thể tạo các driver cache tùy chỉnh của riêng mình bằng cách triển khai interface Illuminate\Contracts\Cache\Store. Điều này cho phép bạn sử dụng các cơ sở dữ liệu hoặc công nghệ lưu trữ khác để lưu trữ cache của bạn.

Để tạo một driver cache tùy chỉnh, bạn cần làm những việc sau:

  1. Tạo một class mới triển khai Illuminate\Contracts\Cache\Store. Đây sẽ là class driver cache của bạn.

  2. Triển khai các phương thức get, put, increment, decrement, forever, forget của interface Illuminate\Contracts\Cache\Store.

  3. Đăng ký driver của bạn trong config/cache.php và chỉ định tên driver, cùng với các cấu hình cần thiết để kết nối với công nghệ lưu trữ của bạn.

Sau đây là một ví dụ về cách tạo một driver cache tùy chỉnh sử dụng cơ chế lưu trữ Redis:

  1. Tạo một class RedisCacheStore triển khai interface Illuminate\Contracts\Cache\Store:
use Illuminate\Contracts\Cache\Store;
use Illuminate\Support\Facades\Redis;

class RedisCacheStore implements Store
{
    public function get($key)
    {
        $value = Redis::get($key);
        return $value ? unserialize($value) : null;
    }

    public function put($key, $value, $seconds)
    {
        $value = serialize($value);
        Redis::setex($key, $seconds, $value);
    }

    public function increment($key, $value = 1)
    {
        return Redis::incrby($key, $value);
    }

    public function decrement($key, $value = 1)
    {
        return Redis::decrby($key, $value);
    }

    public function forever($key, $value)
    {
        $value = serialize($value);
        Redis::set($key, $value);
    }

    public function forget($key)
    {
        Redis::del($key);
    }
}
  1. Đăng ký driver RedisCacheStore trong config/cache.php:
'redis_custom' => [
    'driver' => 'custom_redis',
    'connection' => 'cache',
],
  1. Chỉ định cấu hình kết nối trong config/database.php:
'cache' => [
    'url' => env('REDIS_URL'),
    'host' => env('REDIS_HOST', '127.0.0.1'),
    'password' => env('REDIS_PASSWORD', null),
    'port' => env('REDIS_PORT', '6379'),
    'database' => env('REDIS_CACHE_DB', '1'),
],

Sau khi hoàn thành các bước trên, bạn có thể sử dụng driver redis_custom để lưu trữ cache trong Redis.

Tài liệu tham khảo : https://laravel.com/docs/9.x/cache


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí