Quay lại
Các Loại Cache Trong Laravel

Trong bài viết này, chúng ta đã tìm hiểu về Cache trong Laravel và các loại Cache thường được sử dụng trong Laravel. Việc sử dụng Cache là một cách hiệu quả để tăng tốc độ xử lý của ứng dụng, giảm thiểu số lượng truy vấn đến cơ sở dữ liệu và cải thiện trải nghiệm người dùng.

Laravel hỗ trợ nhiều loại Cache, bao gồm File Cache, Database Cache, Redis Cache, Memcached Cache và Array Cache, Cloud cache (AWS ElastiCache hoặc Google Cloud Memorystore.) Mỗi loại Cache có những đặc điểm riêng, phù hợp với các trường hợp sử dụng khác nhau.

Với bài này chúng ta sẽ cùng nhau đi tìm hiểu về từng loại cache và cũng như ưu và nhược điểm của chúng:

Cache File

Cách thức hoạt động: Cache file lưu trữ dữ liệu cache trong các tệp tin trên hệ thống tệp của máy chủ. Laravel lưu trữ các tệp cache trong thư mục storage/framework/cache.

Ưu điểm:

  • Dễ triển khai và không yêu cầu cài đặt thêm phần mềm hoặc cấu hình phức tạp.
  • Tốt cho các ứng dụng nhỏ hoặc môi trường phát triển.

Nhược điểm:

  • Tốc độ truy cập dữ liệu có thể chậm hơn so với các loại cache khác nếu có số lượng lớn tệp cache.
  • Khả năng mở rộng kém cho các ứng dụng lớn do phụ thuộc vào hệ thống tệp.

Ví dụ: Cấu hình cache file trong tệp config/cache.php:

'stores' => [
    'file' => [
        'driver' => 'file',
        'path' => storage_path('framework/cache'),
    ],
],

Sử dụng cache file trong mã:

use Illuminate\Support\Facades\Cache;

Cache::put('key', 'value', $minutes = 10);
$value = Cache::get('key');

Cache Database

Tạo bảng cache bằng migration:

php artisan cache:table
php artisan migrate​
Cách Thức Hoạt Động
  1. Lưu Trữ Cache (Cache Write) Khi bạn lưu trữ một mục vào cache, Laravel sẽ thực hiện một truy vấn INSERT hoặc UPDATE để lưu trữ dữ liệu đó trong bảng cache.

    Ví dụ:

    Cache::put('key', 'value', $minutes = 10);​

    Truy vấn SQL tương ứng sẽ là:

    INSERT INTO cache (key, value, expiration) VALUES ('key', 'value', 'expiration_time')
    ON DUPLICATE KEY UPDATE value='value', expiration='expiration_time';​
  2. Truy Xuất Cache (Cache Read) Khi bạn truy xuất một mục từ cache, Laravel sẽ thực hiện một truy vấn SELECT để lấy dữ liệu từ bảng cache.

    Ví dụ:

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

    Truy vấn SQL tương ứng sẽ là:

    SELECT * FROM cache WHERE key = 'key' AND (expiration IS NULL OR expiration > CURRENT_TIMESTAMP)​
  3. Xóa Cache (Cache Delete) Khi bạn xóa một mục khỏi cache, Laravel sẽ thực hiện một truy vấn DELETE để loại bỏ dữ liệu đó khỏi bảng cache.

    Ví dụ:

    Cache::forget('key');​

    Truy vấn SQL tương ứng sẽ là:

    DELETE FROM cache WHERE key = 'key';

Cách thức hoạt động: Cache database lưu trữ dữ liệu cache trong bảng của cơ sở dữ liệu. Laravel sử dụng một bảng đặc biệt để lưu trữ các bản ghi cache.

Ưu điểm:

  • Dễ triển khai trong các hệ thống đã sử dụng cơ sở dữ liệu.
  • Có thể quản lý dữ liệu cache bằng các công cụ quản lý cơ sở dữ liệu.

Nhược điểm:

  • Có thể bị chậm nếu cơ sở dữ liệu bị tải nặng.
  • Không nhanh bằng các phương pháp cache như Memcached hoặc Redis.

Ví dụ: Cấu hình cache database trong tệp config/cache.php:

'stores' => [
    'database' => [
        'driver' => 'database',
        'table' => 'cache',
        'connection' => null,
    ],
],​

Sử dụng cache database trong mã:

use Illuminate\Support\Facades\Cache;

Cache::put('key', 'value', $minutes = 10);
$value = Cache::get('key');

Memcached và Redis là hai hệ thống lưu trữ bộ nhớ đệm (cache) phổ biến được sử dụng để cải thiện hiệu suất ứng dụng web bằng cách giảm tải cơ sở dữ liệu và tăng tốc độ truy cập dữ liệu. Cả hai đều có thể được tích hợp vào Laravel để làm cache, nhưng chúng có những khác biệt quan trọng về tính năng và cách sử dụng. Dưới đây là sự so sánh chi tiết giữa Memcached và Redis trong bối cảnh sử dụng cache trong Laravel:

Memcached

Ưu điểm:

  1. Đơn giản và hiệu quả: Memcached được thiết kế để lưu trữ các đoạn dữ liệu đơn giản như các cặp key-value, rất nhanh và nhẹ.
  2. Hiệu suất cao: Memcached có hiệu suất rất cao trong việc xử lý các yêu cầu đọc/ghi dữ liệu nhờ vào kiến trúc đơn giản.
  3. Phân tán: Memcached dễ dàng triển khai trên nhiều máy chủ để tạo ra một hệ thống lưu trữ bộ nhớ đệm phân tán, giúp tăng khả năng chịu tải.
  4. Khả năng mở rộng:

    1. Phân tán tự nhiên: Memcached được thiết kế để dễ dàng triển khai trên nhiều máy chủ (nodes). Khi thêm một máy chủ mới, dữ liệu sẽ tự động được phân phối lại giữa các máy chủ. Điều này làm cho Memcached có khả năng mở rộng ngang rất tốt.
    2. Quản lý đơn giản: Việc quản lý một cụm Memcached là tương đối đơn giản. Khi cần thêm dung lượng bộ nhớ, chỉ cần thêm các máy chủ Memcached mới.
    3. Tự động phân phối dữ liệu: Memcached tự động phân phối các cặp key-value trên tất cả các máy chủ trong cụm, giúp tăng khả năng xử lý và lưu trữ.

Nhược điểm:

  1. Hạn chế về tính năng: Memcached chỉ hỗ trợ các cặp key-value đơn giản và không có các cấu trúc dữ liệu phức tạp như Redis.
  2. Không có tính bền vững(persistence): Dữ liệu trong Memcached chỉ tồn tại trong thời gian server chạy. Nếu server khởi động lại hoặc gặp sự cố, toàn bộ dữ liệu sẽ bị mất.
  3. Không hỗ trợ các tính năng nâng cao: Memcached không hỗ trợ các tính năng như pub/sub, transactions, hoặc persistence.
  4. Không có tính năng replication: Memcached không hỗ trợ sao chép dữ liệu (replication) giữa các máy chủ, điều này có thể là một vấn đề nếu một máy chủ bị lỗi.
  5. Không hỗ trợ clustering nâng cao: Memcached không cung cấp các tính năng clustering nâng cao như Redis.

Redis

Ưu điểm:

  1. Đa dạng cấu trúc dữ liệu: Redis hỗ trợ nhiều loại cấu trúc dữ liệu như strings, hashes, lists, sets, và sorted sets, giúp linh hoạt trong việc lưu trữ và truy vấn dữ liệu.
  2. Persistence:  Redis hỗ trợ lưu trữ dữ liệu bền bỉ bằng cách định kỳ ghi dữ liệu từ RAM xuống ổ đĩa. Redis cung cấp hai phương thức lưu trữ bền bỉ giúp dữ liệu tồn tại ngay cả khi server bị khởi động lại.
    1. Snapshotting (RDB): Tạo các bản snapshot của dữ liệu và lưu trữ trên ổ đĩa sau một khoảng thời gian định kỳ.
    2. Append-only file (AOF): Ghi lại mỗi lệnh ghi vào file nhật ký, giúp khôi phục lại trạng thái của Redis từ thời điểm file nhật ký được tạo.
  3. Tính năng nâng cao: Redis hỗ trợ các tính năng nâng cao như pub/sub, transactions, và scripting với Lua, cho phép thực hiện các tác vụ phức tạp hơn.
  4. Atomic operations: Redis hỗ trợ các thao tác nguyên tử trên các cấu trúc dữ liệu, đảm bảo tính nhất quán của dữ liệu.
  5. Khả năng mở rộng:

    1. Replication và Clustering: Redis hỗ trợ sao chép dữ liệu (replication) và clustering, giúp dữ liệu được sao chép giữa các máy chủ để đảm bảo tính sẵn sàng cao và an toàn dữ liệu.
    2. Cluster Mode: Redis cung cấp chế độ cluster, cho phép phân tán dữ liệu trên nhiều máy chủ và hỗ trợ sharding tự động. Điều này giúp Redis có khả năng mở rộng theo chiều ngang (horizontal) rất tốt.
    3. Sentinel: Redis Sentinel cung cấp cơ chế giám sát, thông báo lỗi và chuyển đổi dự phòng (failover) tự động, giúp đảm bảo tính sẵn sàng cao.

Nhược điểm:

  1. Tài nguyên tiêu thụ: Redis có thể tiêu thụ nhiều tài nguyên hơn so với Memcached do các tính năng và cấu trúc dữ liệu phức tạp.
  2. Phức tạp hơn: Cấu hình và quản lý Redis có thể phức tạp hơn so với Memcached.
  3. Phức tạp hơn: Việc thiết lập và quản lý một cụm Redis phức tạp hơn so với Memcached do các tính năng nâng cao như replication và clustering.
  4. Tiêu tốn tài nguyên: Redis có thể tiêu tốn nhiều tài nguyên hơn khi sử dụng các tính năng nâng cao như persistence và clustering.

Khi nào sử dụng Memcached trong Laravel

  • Khi ứng dụng của bạn cần một hệ thống cache đơn giản và hiệu suất cao để lưu trữ các cặp key-value.
  • Khi không cần các cấu trúc dữ liệu phức tạp hoặc các tính năng nâng cao.
  • Khi dễ dàng triển khai một hệ thống cache phân tán là một ưu tiên.

Khi nào sử dụng Redis trong Laravel

  • Khi ứng dụng của bạn yêu cầu các cấu trúc dữ liệu phức tạp hoặc cần thao tác trên các cấu trúc dữ liệu này.
  • Khi cần tính năng lưu trữ dữ liệu bền vững (persistence).
  • Khi cần các tính năng nâng cao như pub/sub, transactions, hoặc scripting.
  • Khi bạn cần các thao tác nguyên tử để đảm bảo tính nhất quán của dữ liệu.

Ví dụ cấu hình Memcached và Redis trong Laravel

Memcached:

composer require memcached/memcached
// Cấu hình trong config/cache.php
'stores' => [
    'memcached' => [
        'driver' => 'memcached',
        'persistent_id' => env('MEMCACHED_PERSISTENT_ID'),
        'sasl' => [
            env('MEMCACHED_USERNAME'),
            env('MEMCACHED_PASSWORD'),
        ],
        'options' => [
            // Các tùy chọn khác
        ],
        'servers' => [
            [
                'host' => env('MEMCACHED_HOST', '127.0.0.1'),
                'port' => env('MEMCACHED_PORT', 11211),
                'weight' => 100,
            ],
        ],
    ],
],​

Bạn có thể sử dụng các phương thức tương tự như sử dụng file cache để lưu trữ và truy xuất cache, sử dụng facade Cache và các method được cung cấp như remember(), get(), put(), forever(),...

use Illuminate\Support\Facades\Cache;
 
// Lưu trữ dữ liệu vào cache trong 5 phút
Cache::put('key', 'value', 5);
 
// Lấy dữ liệu từ cache
$value = Cache::get('key');
 
// Lấy dữ liệu từ cache, nếu không tồn tại thì tính toán lại và lưu trữ vào cache trong 10 phút
$value = Cache::remember('key', 10, function () {
    return 'value';
});
 
// Lưu trữ dữ liệu vào cache vĩnh viễn
Cache::forever('key', 'value');

Redis:

composer require predis/predis
// Cấu hình trong config/database.php
'redis' => [
    'client' => env('REDIS_CLIENT', 'phpredis'),
    'options' => [
        'cluster' => env('REDIS_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'),
    ],
    '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'),
    ],
],​

Bạn có thể sử dụng các phương thức tương tự như sử dụng file cache để lưu trữ và truy xuất cache, sử dụng facade Cache và các method được cung cấp như remember(), get(), put(), forever(),...

use Illuminate\Support\Facades\Cache;
 
// Lưu trữ dữ liệu vào cache trong 5 phút
Cache::put('key', 'value', 5);
 
// Lấy dữ liệu từ cache
$value = Cache::get('key');
 
// Lấy dữ liệu từ cache, nếu không tồn tại thì tính toán lại và lưu trữ vào cache trong 10 phút
$value = Cache::remember('key', 10, function () {
    return 'value';
});
 
// Lưu trữ dữ liệu vào cache vĩnh viễn
Cache::forever('key', 'value');

Array Cache

Cách thức hoạt động: Array cache lưu trữ dữ liệu cache trong bộ nhớ của PHP array. Cache này chỉ tồn tại trong vòng đời của một request và sẽ bị xóa khi request kết thúc.

Ưu điểm:

  • Rất nhanh do truy cập dữ liệu trực tiếp từ bộ nhớ.
  • Hữu ích cho các bài kiểm tra hoặc khi cần cache tạm thời trong vòng đời của request.

Nhược điểm:

  • Không lưu trữ dữ liệu qua các request.
  • Chỉ hữu ích trong các trường hợp rất cụ thể.

Ví dụ: Cấu hình array cache trong tệp config/cache.php:

'stores' => [
    'array' => [
        'driver' => 'array',
    ],
],​

Sử dụng array cache trong mã:

use Illuminate\Support\Facades\Cache;

Cache::store('array')->put('key', 'value', $minutes = 10);
$value = Cache::store('array')->get('key');

Kết luận

  • Cache File: Tốt cho các ứng dụng nhỏ, dễ triển khai nhưng không hiệu quả với số lượng lớn tệp.
  • Cache Database: Dễ quản lý và triển khai trong các hệ thống đã sử dụng cơ sở dữ liệu, nhưng có thể bị chậm nếu cơ sở dữ liệu bị tải nặng.
  • Array Cache: Rất nhanh cho các request tạm thời, nhưng không lưu trữ qua các request.

Cả Memcached và Redis đều là những lựa chọn tuyệt vời để cải thiện hiệu suất ứng dụng web bằng cách sử dụng cache. Lựa chọn giữa hai phụ thuộc vào nhu cầu cụ thể của ứng dụng và các tính năng mà bạn cần. Memcached là một lựa chọn tốt cho các yêu cầu cache đơn giản và hiệu suất cao, trong khi Redis cung cấp nhiều tính năng và khả năng lưu trữ dữ liệu phức tạp hơn.

Bình luận (0)

Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough

Bài viết liên quan

Learning English Everyday