Teknik Caching Laravel 11: Optimalkan Aplikasi dengan Cache

Profile
Abd Asis

24 September 2024

Teknik Caching Laravel 11: Optimalkan Aplikasi dengan Cache

Halo teman-teman, sebelumnya aku pernah sharing untuk mengoptimalkan aplikasi dengan Laravel Octane, buat kamu yang ingin membacanya bisa baca di Mengelola Traffic Tinggi dengan Laravel Octane kali ini aku mau sharing lagi tentang caching system khususnya di Framework Laravel.

Caching adalah teknik penyimpanan data sementara untuk mempercepat akses ke informasi yang sering digunakan. Bayangkan Kamu sering mengunjungi sebuah website, alih-alih selalu memuat semua informasi dari server, sebagian data disimpan secara lokal di cache supaya nanti akses ke website itu lebih cepat. disini aku tidak akan membahas cara kerjanya jika kamu ingin membacanya secara lengkap disini. ada beberapa teknik yang bisa kita gunakan, kita bahas satu-satu sebagai berikut

1. Cache Tags: Mengelola Cache yang Tertaut dengan Lebih Mudah

Dengan menggunakan cache tags, Kamu bisa menandai cache yang terkait dan membersihkannya secara bersamaan. Teknik ini sangat berguna untuk data yang terhubung dengan pengguna atau entitas tertentu, seperti profil pengguna atau data produk.

Contoh: Tagging dan Menghapus Cache Berdasarkan Pengguna

use Illuminate\Support\Facades\Cache; class UserController extends Controller { public function getUserData($userId) { return Cache::tags(['users', "user-{$userId}"]) ->remember("user_data_{$userId}", 3600, function () use ($userId) { return User::with('posts', 'comments')->find($userId); }); } public function updateUser(Request $request, $userId) { // Update data pengguna User::find($userId)->update($request->validated()); // Hapus semua cache terkait dengan pengguna ini Cache::tags(["user-{$userId}"])->flush(); return response()->json(['message' => 'User updated successfully']); } }

Pada contoh ini, cache terkait pengguna diberi tag khusus. Ketika data pengguna diperbarui, kita dapat dengan mudah menghapus semua cache yang berhubungan dengan pengguna tersebut.

2. Cache Locks: Menghindari Race Conditions dalam Proses Pembaruan Cache

Cache locks digunakan untuk mencegah beberapa permintaan yang bersamaan memperbarui item cache yang sama. Teknik ini sangat efektif dalam skenario dengan banyak permintaan yang bersamaan, seperti rate limiter.

Contoh: Implementasi Rate Limiter

use Illuminate\Support\Facades\Cache; class RateLimiter { public function attempt($key, $maxAttempts, $decaySeconds) { return Cache::lock("rate_limiter_{$key}", 10)->block(5, function () use ($key, $maxAttempts, $decaySeconds) { $attempts = (int) Cache::get($key, 0); if ($attempts >= $maxAttempts) { return false; } Cache::put($key, $attempts + 1, $decaySeconds); return true; }); } }

Dalam contoh ini, cache lock digunakan untuk memastikan hanya satu proses yang bisa memperbarui jumlah percobaan rate limit secara bersamaan, mencegah terjadinya race conditions.

3. Lazy Collections dengan Caching: Menangani Data Besar dengan Efisien

Menggunakan lazy collections bersama dengan caching memungkinkan aplikasi menangani dataset besar tanpa membebani memori. Dengan caching, data yang sering diakses dapat disimpan untuk diambil lebih cepat.

Contoh: Caching Hasil Paginasi

use Illuminate\Support\LazyCollection; use Illuminate\Support\Facades\Cache; class ProductController extends Controller { public function index($page = 1) { $perPage = 20; $offset = ($page - 1) * $perPage; return Cache::remember("products_page_{$page}", 3600, function () use ($perPage, $offset) { return LazyCollection::make(function () { $cursor = Product::cursor(); foreach ($cursor as $product) { yield $product; } }) ->slice($offset, $perPage) ->all(); }); } }

Pada contoh ini, lazy collections digunakan untuk melakukan paginasi data produk yang besar, dan setiap halaman hasil paginasi disimpan dalam cache selama satu jam untuk mempercepat akses berikutnya.

4. Event-Driven Cache Invalidation: Sinkronisasi Cache dengan Perubahan Database

Dengan event-driven cache invalidation, Kamu dapat menghapus cache yang usang secara otomatis saat terjadi perubahan pada data di database. Teknik ini memanfaatkan model events di Laravel untuk menjaga cache tetap up-to-date.

Contoh: Auto-Invalidasi Cache Produk

use App\Models\Product; use Illuminate\Support\Facades\Cache; class ProductObserver { public function saved(Product $product) { Cache::forget("product_{$product->id}"); Cache::tags(['products'])->flush(); } public function deleted(Product $product) { Cache::forget("product_{$product->id}"); Cache::tags(['products'])->flush(); } } // Di AppServiceProvider public function boot() { Product::observe(ProductObserver::class); }

Dengan ProductObserver, cache produk akan secara otomatis dihapus setiap kali ada produk yang diperbarui atau dihapus. Ini memastikan cache tetap sinkron dengan database.


Kesimpulan

Memanfaatkan teknik-teknik caching di Laravel 11 seperti cache tags, cache locks, lazy collections dengan caching, dan event-driven cache invalidation akan meningkatkan performa aplikasi Kamu, mengurangi latensi, dan memastikan konsistensi data. Implementasikan teknik ini untuk mengoptimalkan kecepatan dan efisiensi aplikasi Laravel Kamu.

What do you think?

Reactions