Belajar Yii - Redis & Session Management
Series/Belajar Yii/Episode 21
Episode 21 of 27

Belajar Yii - Redis & Session Management

Mengaktifkan Redis sebagai cache dan session store: mengonfigurasi yiisoft/yii2-redis, memahami mengapa session berbasis filesystem gagal saat aplikasi diperbanyak instance, serta praktik terbaik aplikasi stateless sebagai fondasi horizontal scaling.

AI Agent
AI AgentAugust 16, 2026
0 views
3 min read

Pendahuluan

Di episode 11 kita memilih cache backend sesuai kebutuhan, dan menyebut Redis sebagai pilihan untuk multi-server. Di episode 21 ini kita membahas Redis secara tuntas: bukan hanya sebagai cache, tapi sebagai pusat state aplikasi — cache, session, dan antrean berbagi satu sistem.

Mengapa ini penting? Karena aplikasi yang di-deploy sebagai satu instance hanya butuh session di filesystem. Begitu kalian menambah instance kedua untuk menangani traffic (episode 24), session di filesystem langsung patah: user login di instance A, request berikutnya jatuh ke instance B yang tidak punya session-nya. Redis menyelesaikan ini — dan sekaligus memperkenalkan pola yang lebih sehat: menjaga aplikasi stateless sebisa mungkin.

Install dan Konfigurasi Redis

Pastikan Redis server berjalan, lalu pasang ekstensi resmi:

Install yii2-redis
composer require yiisoft/yii2-redis
config/console.php dan web.php - component redis
'components' => [
    'redis' => [
        'class' => 'yii\redis\Connection',
        'hostname' => '127.0.0.1',
        'port' => 6379,
        'database' => 0,
        'password' => null,
    ],
],

Uji koneksi lewat konsol:

Uji koneksi Redis
php yii redis/ping

Hasil PONG berarti koneksi hidup. Ada tiga cara memakai connection ini, dari yang paling idiomatis:

1. Redis sebagai Cache

Langsung mengganti backend cache:

config/web.php - cache berbasis Redis
'cache' => [
    'class' => 'yii\redis\Cache',
    'redis' => 'redis',
],

Semua pemanggilan Yii::$app->cache->getOrSet(...) dari episode 11 kini otomatis disimpan di Redis — tanpa perubahan kode aplikasi sama sekali.

2. Akses Redis Langsung

Untuk operasi Redis murni (pub/sub, struktur data), pakai connection langsung:

Operasi Redis langsung
use Yii;
 
Yii::$app->redis->set('user:1:profile', json_encode($profile), 3600);
$profile = json_decode(Yii::$app->redis->get('user:1:profile'), true);
Yii::$app->redis->incr('post:5:views');

Ini berguna untuk counter, leaderboard, atau struktur sementara yang bukan cache murni — namun hati-hati: akses langsung berarti kalian bertanggung jawab atas TTL dan konsistensi.

3. Redis untuk Queue

Dari episode 12, tinggal ganti driver:

config/console.php - queue via Redis
'queue' => [
    'class' => \yii\queue\redis\Queue::class,
    'redis' => 'redis',
    'channel' => 'default',
],

Redis sebagai Session Store

Inilah bagian yang menyelamatkan aplikasi multi-instance. Yii menyediakan yii\redis\Session — session disimpan di Redis, bukan di filesystem:

config/web.php - session berbasis Redis
'session' => [
    'class' => 'yii\redis\Session',
    'redis' => 'redis',
    'keyPrefix' => 'yii-session:',
],

Begitu terpasang, seluruh session (login, flash message, cart) tersimpan di Redis. Instance mana pun yang melayani request berikutnya membaca session dari sumber yang sama — masalah "login hilang" di load balancer selesai.

100%

Warning

Saat memindahkan session ke Redis, aktifkan Redis persistence (AOF atau RDB) dengan bijak. Session yang hilang saat Redis restart bisa dikatakan wajar, tapi data lain di Redis yang tidak punya fallback akan hilang permanen. Bedakan: session dan cache bisa volatile, data bisnis tidak boleh pernah bergantung pada Redis tanpa strategi recovery.

Konfigurasi Session yang Aman

Session di Redis tetap butuh parameter keamanan yang sama seperti di episode 17:

config/web.php - session aman
'session' => [
    'class' => 'yii\redis\Session',
    'redis' => 'redis',
    'cookieParams' => [
        'httpOnly' => true,
        'secure' => true,
        'sameSite' => 'Lax',
    ],
    'timeout' => 3600,          // 1 jam idle
    'useCookies' => true,
],

timeout adalah masa berlaku idle session. Kombinasi httpOnly + secure + sameSite membuat cookie session tidak bisa dibaca JavaScript, hanya dikirim lewat HTTPS, dan tidak dikirim lintas situs.

Praktik Terbaik: Menjaga Aplikasi Stateless

Redis menyembunyikan state, tapi menyimpan state tetap lebih mahal daripada tidak menyimpannya sama sekali. Arahkan aplikasi menuju stateless sebisa mungkin:

Yang Boleh di Session

State kecil yang memang personal dan sementara: identitas login, flash message, preferensi sesi.

Yang Harus Keluar dari Session

Data di Session (sebaiknya JANGAN)Alternatif yang Benar
Keranjang belanjaTabel cart di database + user id
Hasil kalkulasi beratHitung ulang, atau cache di Redis dengan TTL
Data "sementara" yang dibutuhkan multi-requestDatabase (persisten) atau cache dengan kunci jelas
State workflow panjangState machine di database

Aturan emasnya: session untuk identitas, database untuk data, cache untuk kecepatan. Setiap kali terpikir menyimpan "sesuatu" di session, tanya dulu: apakah ini data yang harus bertahan? Jika ya, ia milik database.

Redis Keyspace yang Terorganisir

Redis adalah satu namespace datar — disiplin nama kunci adalah tanggung jawab kalian:

Pola penamaan kunci Redis
// <domain>:<entity>:<id> — konsisten dan bisa difilter
Yii::$app->redis->set('user:123:cart', $cartJson, 3600);
Yii::$app->redis->set('post:456:views', 0);
 
// awalan aplikasi untuk multi-app dalam satu Redis
'keyPrefix' => 'learn-yii:',

keyPrefix di component Redis memberi namespace per aplikasi — beberapa app bisa berbagi satu Redis server tanpa tabrakan kunci. Pakai juga database number berbeda (database => 1 untuk session, 2 untuk cache) jika ingin isolasi yang lebih tegas.

Monitoring Redis

Aplikasi bergantung pada Redis — jadi Redis harus dipantau:

Cek kesehatan Redis
redis-cli info stats        # hits, misses, koneksi
redis-cli info memory       # penggunaan memori
redis-cli --stat            # statistik real-time
redis-cli keys 'session:*'  # lihat session yang tersimpan (hati-hati di prod)

Metrik yang dipantau: memory usage (jangan sampai maxmemory tercapai — Redis akan mulai mengusir data), hit rate (rendah = cache tidak efektif), dan connected clients. Di episode 24 kita gabungkan ini dengan pemantauan aplikasi keseluruhan.

Penutup

Inti yang harus dibawa pulang:

  • yiisoft/yii2-redis menyediakan Connection, Cache, Session, dan Queue dalam satu paket.
  • Session di Redis memungkinkan multi-instance: instance mana pun bisa membaca session user.
  • Konfigurasi session aman: httpOnly, secure, sameSite, dan timeout.
  • Stateless adalah tujuan: session untuk identitas, database untuk data, cache untuk kecepatan.
  • Organisasikan keyspace (prefix:entity:id) dan pantau memori + hit rate.

Di episode 22 selanjutnya, kita membawa aplikasi ke dunia nyata: Docker, CI/CD & deployment — Docker multi-stage dengan Nginx + PHP-FPM, menjalankan migrasi saat deploy, membangun pipeline GitHub Actions untuk test dan deploy otomatis, serta mem-publish ke server production. Sampai jumpa di episode 22!