Nhảy tới nội dung

Cache

Framework cung cấp hệ thống caching linh hoạt với nhiều drivers khác nhau.

Cấu hình

// config/cache.php
return [
'default' => env('CACHE_DRIVER', 'file'),
'prefix' => env('CACHE_PREFIX', 'vietiso_'),

'stores' => [
'file' => [
'driver' => 'file',
'path' => storage_path('cache'),
'marshaller' => \Vietiso\Core\Cache\Marshallers\SerializeMarshaller::class,
],

'database' => [
'driver' => 'database',
'connection' => null, // null = default connection
'table' => 'cache',
'marshaller' => \Vietiso\Core\Cache\Marshallers\SerializeMarshaller::class,
],
],
];

Sử dụng cơ bản

Facade

use Vietiso\Core\Cache\Facade\Cache;

// Lưu giá trị
Cache::set('key', 'value', 3600); // TTL 1 giờ

// Lấy giá trị
$value = Cache::get('key');

// Lấy với giá trị mặc định
$value = Cache::get('key', 'default');

// Kiểm tra tồn tại
if (Cache::has('key')) {
// ...
}

// Xóa
Cache::delete('key');

// Xóa toàn bộ cache
Cache::clear();

Remember Pattern

Tự động cache kết quả của callback:

$users = Cache::remember('all_users', 3600, function () {
return User::get();
});

// Nếu 'all_users' tồn tại -> trả về từ cache
// Nếu không -> chạy callback, lưu cache, và trả về kết quả

Làm việc với nhiều keys

// Lấy nhiều keys
$values = Cache::getMultiple(['key1', 'key2', 'key3']);

// Lưu nhiều keys
Cache::setMultiple([
'key1' => 'value1',
'key2' => 'value2',
], 3600);

// Xóa nhiều keys
Cache::deleteMultiple(['key1', 'key2']);

Cache Drivers

File Driver

Lưu cache vào filesystem, phù hợp cho development.

'file' => [
'driver' => 'file',
'path' => storage_path('cache'),
'marshaller' => SerializeMarshaller::class,
],

Database Driver

Lưu cache vào database, tự động tạo bảng nếu chưa tồn tại.

'database' => [
'driver' => 'database',
'connection' => null,
'table' => 'cache',
'marshaller' => SerializeMarshaller::class,
],

Cấu trúc bảng cache (tự động tạo):

CREATE TABLE cache (
`key` VARCHAR(255) NOT NULL PRIMARY KEY,
`item` LONGBLOB NOT NULL,
`lifetime` INTEGER,
`time` INTEGER
) ENGINE=InnoDB;

Sử dụng nhiều Drivers

// Sử dụng driver mặc định
Cache::set('key', 'value');

// Sử dụng driver cụ thể
Cache::driver('database')->set('key', 'value');
Cache::driver('file')->set('key', 'value');

TTL (Time To Live)

TTL có thể là số giây hoặc DateInterval:

// Số giây
Cache::set('key', 'value', 3600);

// DateInterval
Cache::set('key', 'value', new DateInterval('PT1H')); // 1 giờ
Cache::set('key', 'value', new DateInterval('P1D')); // 1 ngày

Ví dụ thực tế

Cache Query Results

public function getActiveUsers()
{
return Cache::remember('active_users', 300, function () {
return User::where('status', 'active')
->with('profile')
->get();
});
}

Cache với Tags Pattern

// Cache user data
$user = Cache::remember("user:{$userId}", 3600, function () use ($userId) {
return User::find($userId);
});

// Xóa cache khi user update
public function updateUser(int $userId, array $data)
{
$user = User::find($userId);
$user->update($data);

Cache::delete("user:{$userId}");

return $user;
}

Cache API Response

#[Get('/products')]
public function index()
{
return Cache::remember('products:all', 600, function () {
return Product::with('category')->get();
});
}

Invalidate Cache

// Sau khi tạo/cập nhật/xóa product
Cache::delete('products:all');

// Hoặc xóa theo pattern (tự implement)
public function clearProductCache()
{
Cache::delete('products:all');
Cache::delete('products:featured');
Cache::delete('products:latest');
}