Redis adalah in-memory data store yang bekerja dengan kecepatan luar biasa — mampu menangani lebih dari 1 juta operasi per detik. Di ekosistem Laravel, Redis bukan hanya opsi cache; ia bisa menjadi backbone untuk cache, session, queue, dan real-time features. Artikel ini membahas implementasi praktis Redis di Laravel beserta pola-pola yang tepat penggunaannya.
Setup Redis di Laravel
composer require predis/predis
# Atau gunakan phpredis extension (lebih cepat):
# pecl install redis
# .env
CACHE_STORE=redis
SESSION_DRIVER=redis
QUEUE_CONNECTION=redis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
Pola Cache: Cache-Aside (Lazy Loading)
Ini adalah pola paling umum dan fleksibel. Data dimuat dari database hanya jika belum ada di cache:
class PostRepository
{
public function findPublished(int $page = 1): LengthAwarePaginator
{
$cacheKey = "posts.published.page.{$page}";
return Cache::remember($cacheKey, now()->addMinutes(30), function () use ($page) {
return Post::with(['author', 'categories'])
->published()
->latest('published_at')
->paginate(15);
});
}
public function find(int $id): ?Post
{
return Cache::remember("post.{$id}", now()->addHour(), function () use ($id) {
return Post::with(['author', 'categories', 'tags'])->find($id);
});
}
public function invalidate(Post $post): void
{
Cache::forget("post.{$post->id}");
// Invalidate daftar halaman (pendekatan sederhana: hapus semua page)
Cache::tags(['posts'])->flush(); // Jika menggunakan cache tags
}
}
Cache Tags untuk Invalidasi Terstruktur
Cache tags memungkinkan invalidasi cache berdasarkan grup, bukan key satu per satu:
// Simpan dengan tag
Cache::tags(['posts', 'homepage'])->put('featured_posts', $posts, now()->addHour());
// Invalidasi semua cache bertag 'posts'
Cache::tags(['posts'])->flush();
// Cocok digunakan di Observer
class PostObserver
{
public function saved(Post $post): void
{
Cache::tags(['posts'])->flush();
Cache::forget("post.{$post->id}");
}
}
Catatan: Cache tags hanya tersedia untuk driver yang mendukungnya (Redis, Memcached). Tidak tersedia untuk driver file/database.
Cache untuk Query Berat
// Dashboard stats yang mahal
$stats = Cache::remember('dashboard.stats', now()->addMinutes(10), function () {
return [
'total_posts' => Post::published()->count(),
'total_users' => User::count(),
'total_views' => PageView::sum('count'),
'monthly_growth' => $this->calculateMonthlyGrowth(),
];
});
// Leaderboard dengan sorted set Redis
$topAuthors = Cache::remember('leaderboard.authors', now()->addHour(), function () {
return User::withCount(['posts' => fn ($q) => $q->published()])
->orderByDesc('posts_count')
->take(10)
->get();
});
Session dengan Redis
Menggunakan Redis untuk session memberikan keuntungan signifikan di setup multi-server karena session disimpan terpusat, bukan di filesystem masing-masing server:
# .env
SESSION_DRIVER=redis
# config/session.php — kustomisasi prefix untuk multi-app di Redis yang sama
'cookie' => env('SESSION_COOKIE', Str::slug(env('APP_NAME', 'laravel'), '_').'_session'),
Rate Limiting dengan Redis
// Implementasi rate limiter custom
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
});
// Untuk endpoint sensitif (login, OTP)
RateLimiter::for('login', function (Request $request) {
return [
Limit::perMinute(5)->by($request->ip()),
Limit::perDay(20)->by($request->ip()),
];
});
Monitoring dengan RedisInsight
RedisInsight adalah GUI gratis dari Redis Ltd untuk memantau dan debug Redis. Hal yang perlu dimonitor:
- Memory Usage — Pastikan tidak mendekati
maxmemorylimit - Cache Hit Rate — Target minimal 80%. Di bawah itu, review strategi cache key
- Keyspace — Pantau distribusi key untuk mendeteksi cache stampede
- Slow Log — Identifikasi operasi Redis yang lambat
Konfigurasi Eviction Policy
# redis.conf — untuk cache store, gunakan allkeys-lru
maxmemory 256mb
maxmemory-policy allkeys-lru
# Untuk session/queue yang tidak boleh dievict sembarangan:
# Pisahkan database Redis atau gunakan noeviction
Redis yang dikonfigurasi dengan baik bisa mengurangi database load 70-90% untuk read-heavy applications. Kuncinya adalah cache key yang konsisten, strategi invalidasi yang tepat, dan monitoring berkelanjutan untuk memastikan cache hit rate tetap tinggi.