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 maxmemory limit
  • 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.