Redis Basics — Database

Apa itu Redis? Redis (Remote Dictionary Server) adalah in-memory key-value store yang sangat cepat. Data disimpan di RAM sehingga akses dalam mikrodetik. Use…

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:

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

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)

Cache-aside: cek Redis dulu

Pola paling umum memakai Redis sebagai cache disebut cache-aside. Untuk setiap request halaman Kopi Susu:

  1. GET product:1. Kalau ada isinya, itu cache hit: kirim ke pembeli, database gak disentuh.
  2. Kalau (nil), itu cache miss: baca database dengan SELECT id, name, price FROM products WHERE id = 1;.
  3. 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:

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"

⚠️ Jebakan yang sering ketemu

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.

Yang akan kamu pelajari