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.

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.
Pastikan Redis server berjalan, lalu pasang ekstensi resmi:
composer require yiisoft/yii2-redis'components' => [
'redis' => [
'class' => 'yii\redis\Connection',
'hostname' => '127.0.0.1',
'port' => 6379,
'database' => 0,
'password' => null,
],
],Uji koneksi lewat konsol:
php yii redis/pingHasil PONG berarti koneksi hidup. Ada tiga cara memakai connection ini, dari yang paling idiomatis:
Langsung mengganti backend cache:
'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.
Untuk operasi Redis murni (pub/sub, struktur data), pakai connection 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.
Dari episode 12, tinggal ganti driver:
'queue' => [
'class' => \yii\queue\redis\Queue::class,
'redis' => 'redis',
'channel' => 'default',
],Inilah bagian yang menyelamatkan aplikasi multi-instance. Yii menyediakan yii\redis\Session — session disimpan di Redis, bukan di filesystem:
'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.
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.
Session di Redis tetap butuh parameter keamanan yang sama seperti di episode 17:
'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.
Redis menyembunyikan state, tapi menyimpan state tetap lebih mahal daripada tidak menyimpannya sama sekali. Arahkan aplikasi menuju stateless sebisa mungkin:
State kecil yang memang personal dan sementara: identitas login, flash message, preferensi sesi.
| Data di Session (sebaiknya JANGAN) | Alternatif yang Benar |
|---|---|
| Keranjang belanja | Tabel cart di database + user id |
| Hasil kalkulasi berat | Hitung ulang, atau cache di Redis dengan TTL |
| Data "sementara" yang dibutuhkan multi-request | Database (persisten) atau cache dengan kunci jelas |
| State workflow panjang | State 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 adalah satu namespace datar — disiplin nama kunci adalah tanggung jawab kalian:
// <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.
Aplikasi bergantung pada Redis — jadi Redis harus dipantau:
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.
Inti yang harus dibawa pulang:
yiisoft/yii2-redis menyediakan Connection, Cache, Session, dan Queue dalam satu paket.httpOnly, secure, sameSite, dan timeout.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!