Redis adalah in-memory key-value store: database yang menyimpan pasangan key dan value di RAM, lalu mengambilnya lagi lewat key. Karena datanya di RAM, jawabannya biasanya datang dalam waktu di bawah satu milidetik. Bayangin etalase di samping kasir Kedai Senja. Kue yang paling laku ditaruh di etalase, jadi kasir gak perlu jalan ke gudang (database di disk) setiap ada pembeli. Etalasenya kecil dan kuenya bisa basi, makanya tiap kue diberi tanggal kedaluwarsa. Di Redis, tanggal itu namanya TTL.
🧪 Tebakan cepat: data Kopi Susu (harga 18.000) disimpan di Redis dengan TTL 60 detik. Detik ke-10, admin menaikkan harganya jadi 20.000 di database. Detik ke-15 ada pembeli membuka halaman produk. Harga yang dia lihat 18.000 atau 20.000? Tebak dulu, jawabannya ada di bagian "Cache yang basi".
Kenapa Redis cepat, dan kapan dipakai
Redis cepat karena datanya disimpan di RAM (memory), bukan di disk. Membaca RAM jauh lebih cepat daripada membaca disk, dan Redis mencari value langsung lewat key, tanpa query yang rumit.
Bayarannya: RAM terbatas dan mahal, dan tergantung pengaturan persistence-nya, perubahan beberapa detik terakhir bisa hilang saat server mati. Jadi Redis bukan tempat data utama. Dia dipakai di samping database utama untuk:
- caching: menyimpan hasil query yang sering dibaca,
- session: siapa pemilik login ini, dicek di setiap request,
- counter dan rate limiting: jumlah kunjungan, batas 3 OTP per menit,
- queue: antrian pekerjaan,
- leaderboard: peringkat poin.
Kamu bicara dengan Redis lewat redis-cli. Prompt-nya 127.0.0.1:6379>, karena Redis berjalan di port 6379.
Perintah pertama: SET, GET, INCR
127.0.0.1:6379> SET session:7f3a "1"
OK
127.0.0.1:6379> GET session:7f3a
"1"
127.0.0.1:6379> GET session:0000
(nil)
127.0.0.1:6379> INCR views:product:1
(integer) 1
127.0.0.1:6379> INCR views:product:1
(integer) 2
SET key valuemenyimpan value di key itu. Redis menjawabOK.GET keymengembalikan value-nya dalam tanda kutip. Key yang gak ada dijawab(nil), artinya kosong.INCRmenambah angka di key sebesar 1 dan menjawab(integer)hasilnya. Key yang belum ada dianggap 0. INCR atomic: dua request yang menambah bersamaan gak akan saling menimpa.- Nama key biasanya disusun pakai titik dua:
jenis:id:bagian, misalnyaviews:product:1. Redis gak peduli, tapi manusia jadi gampang membacanya.
TTL: data yang kedaluwarsa sendiri
127.0.0.1:6379> SET product:1 '{"id":1,"name":"Kopi Susu","price":18000}' EX 60
OK
127.0.0.1:6379> TTL product:1
(integer) 60
127.0.0.1:6379> TTL session:7f3a
(integer) -1
Lalu 60 detik kemudian:
127.0.0.1:6379> TTL product:1
(integer) -2
127.0.0.1:6379> GET product:1
(nil)
EX 60memberi key itu TTL (Time To Live) 60 detik. Setelah itu Redis menghapusnya sendiri. Ini fitur yang cocok untuk data sementara: cache, session, kode OTP.TTL keymenjawab sisa detiknya.-1artinya key ada tapi gak punya TTL (hidup selamanya),-2artinya key-nya gak ada.EXPIRE key 60memasang TTL ke key yang sudah ada.PERSIST keykebalikannya: mencabut TTL.- Jangan tertukar dengan
maxmemorydan kebijakan eviction sepertiallkeys-lru: itu membuang key saat RAM penuh, bukan karena waktunya habis.
Cache-aside: cek Redis dulu
Pola paling umum memakai Redis sebagai cache disebut cache-aside. Untuk setiap request halaman Kopi Susu:
GET product:1. Kalau ada isinya, itu cache hit: kirim ke pembeli, database gak disentuh.- Kalau
(nil), itu cache miss: baca database denganSELECT id, name, price FROM products WHERE id = 1;. - Simpan hasilnya:
SET product:1 '...' EX 60, supaya request berikutnya hit.
Jejaknya di Lab, dengan jam virtual:
| detik | Redis menjawab | hasil | database |
|---|---|---|---|
| 0 | (nil) |
miss | dibaca, lalu SET ... EX 60 |
| 5 | "{...18000}" |
hit | gak disentuh |
| 61 | (nil) |
miss, TTL habis | dibaca lagi |
Di Laravel (dengan CACHE_STORE=redis), ketiga langkah itu cukup satu baris:
$product = Cache::remember('product:1', 60, fn () => Product::find(1));
Cache yang basi
Kembali ke tebakan: detik ke-10 harga di database jadi 20.000, tapi product:1 di Redis masih berisi 18.000 sampai detik ke-60. Pembeli di detik ke-15 dapat cache hit, jadi dia melihat 18.000. Itu jawaban tebakannya. Data di cache yang sudah beda dengan database disebut cache basi (stale).
Dua cara memperbaikinya:
- Hapus key-nya setelah mengubah database:
DEL product:1. Request berikutnya miss dan membaca 20.000. Ini disebut cache invalidation. - TTL pendek: makin pendek TTL, makin sebentar cache basi bisa bertahan, tapi makin sering database dibaca.
Lima struktur data Redis
Value di Redis gak cuma teks. Pilih strukturnya sesuai kebutuhan:
| Struktur | Perintah | Cocok untuk |
|---|---|---|
| String | SET, GET, INCR |
counter, cache sederhana |
| Hash | HSET, HGET, HGETALL |
profil user, object |
| List | RPUSH, LPOP, LRANGE |
antrian, notifikasi terbaru |
| Set | SADD, SISMEMBER, SMEMBERS |
tag unik, roles |
| Sorted Set | ZADD, ZRANGE ... REV |
leaderboard, ranking |
127.0.0.1:6379> HSET user:1 name "Budi" phone "0812-9999-0000"
(integer) 2
127.0.0.1:6379> RPUSH antrian:pesanan "order:4" "order:5"
(integer) 2
127.0.0.1:6379> LPOP antrian:pesanan
"order:4"
127.0.0.1:6379> SADD tags:product:1 kopi susu kopi
(integer) 2
127.0.0.1:6379> ZADD poin 120 Budi 95 Siti 40 Andi
(integer) 3
127.0.0.1:6379> ZRANGE poin 0 -1 REV WITHSCORES
1) "Budi"
2) "120"
3) "Siti"
4) "95"
5) "Andi"
6) "40"
- Hash menyimpan banyak field di satu key, seperti object: nama dan nomor HP Budi.
HSETmenjawab jumlah field baru. - List urut.
RPUSHmenaruh di kanan,LPOPmengambil dari kiri: yang masuk duluan diproses duluan, persis antrian. - Set gak menyimpan nilai dobel.
kopidimasukkan dua kali, yang tersimpan cuma 2 tag. - Sorted Set menyimpan anggota dengan skor dan selalu urut.
REVmembaliknya, jadi poin terbesar di atas.
⚠️ Jebakan yang sering ketemu
- Menyimpan data utama cuma di Redis. RAM-nya bisa penuh dan perubahan terakhir bisa hilang saat server mati. Data pesanan tetap di database utama.
- Cache tanpa TTL. Key hidup selamanya: datanya bisa basi terus dan RAM pelan-pelan penuh.
- Lupa
DELsetelahUPDATE. Pembeli melihat harga lama sampai TTL habis. KEYS *di production. Perintah ini memeriksa semua key sekaligus dan membuat Redis berhenti melayani yang lain sementara. PakaiSCAN.- Salah tulis nama struktur di latihan. Kembalikan teks persis:
"String","Hash","List","Set","Sorted Set"(huruf besar di awal kata, satu spasi).
TL;DR: Redis adalah in-memory key-value store: cepat karena datanya di RAM, dicari lewat key, dan dibalas dalam format OK, "value", (nil) atau (integer) n. Pakai untuk cache, session, counter, queue dan leaderboard, bukan sebagai satu-satunya salinan data. TTL (EX 60, EXPIRE, TTL) membuat key terhapus sendiri: -1 artinya tanpa TTL, -2 artinya key gak ada. Cache-aside: GET dulu, kalau (nil) baca database lalu SET ... EX; setelah data berubah, DEL key-nya supaya gak basi. Strukturnya: String untuk counter, Hash untuk profil user, List untuk antrian, Set untuk tag unik, Sorted Set untuk leaderboard.