Episode ini membahas dua struktur data fundamental berikutnya: Lists untuk antrian dan task queue dengan blocking operations, serta Hashes untuk menyimpan objek seperti profil user dan session data dengan field-level access.

Episode 3 membekali kalian Strings. Sekarang kita naik satu tingkat dengan dua struktur yang memecahkan masalah nyata sehari-hari: Lists untuk antrian dan Hashes untuk objek.
Lists adalah jawaban Redis untuk queue dan timeline — dan dengan blocking operations, Lists bahkan bisa menjadi message queue sederhana. Hashes adalah representasi objek: profil user, session data, konfigurasi — semuanya pas disimpan sebagai field-value map. Kalian akan memakai dua struktur ini hampir setiap hari. Mari langsung praktik.
List di Redis adalah linked list yang menampung urutan elemen. Operasi inti: LPUSH/RPUSH untuk menambah di kiri/kanan, LPOP/RPOP untuk mengambil dari kiri/kanan.
redis-cli RPUSH notifications "pesan-1"
redis-cli RPUSH notifications "pesan-2"
redis-cli LPOP notifications
redis-cli LLEN notificationsRPUSH notifications "pesan-1" menambahkan di kanan, LPOP notifications mengambil dari kiri — kombinasi FIFO queue klasik. LLEN memberi panjang list. Pola RPUSH + LPOP ini adalah dasar antrian tugas paling sederhana.
Untuk melihat isi list tanpa menghapusnya, gunakan LRANGE — wajib diingat karena ini satu-satunya cara melihat seluruh list:
redis-cli LRANGE notifications 0 -1
redis-cli LINDEX notifications 0
redis-cli LTRIM notifications 0 4LRANGE notifications 0 -1 membaca semua elemen (indeks -1 berarti paling kanan). LINDEX mengakses elemen per indeks. LTRIM memotong list hanya menyisakan rentang tertentu — teknik ini dipakai untuk membatasi panjang log atau timeline.
Danger
Hati-hati dengan LRANGE notifications 0 -1 pada list raksasa: membaca jutaan elemen sekaligus memblokir server. Untuk list besar, selalu baca per halaman atau pindah ke struktur lain. Detailnya dibahas di episode 17.
Inilah kekuatan Lists sebagai message queue. BLPOP/BRPOP menunggu dengan timeout jika list kosong — worker bisa berhenti memoles-polen list dan langsung diaktifkan saat data masuk:
redis-cli BLPOP task_queue 5BLPOP task_queue 5 menunggu maksimal 5 detik sampai ada elemen di task_queue, lalu mengambilnya. Kalau tidak ada, perintah kembali dengan nil. Ini mencegah busy-waiting dan memungkinkan arsitektur worker yang efisien — kita akan perkuat dengan Streams di episode 6.
Hash adalah peta field → value. Tidak seperti string JSON yang harus di-serialize utuh, Hash memungkinkan akses per-field — hemat bandwidth dan lebih cepat untuk update parsial:
redis-cli HSET user:1 name "Arman" email "arman@example.com" role "admin"
redis-cli HGET user:1 name
redis-cli HGETALL user:1HSET user:1 name "Arman" email "arman@example.com" role "admin" membuat satu objek dengan tiga field. HGET membaca satu field, HGETALL membaca semua. Inilah pola standar menyimpan user profile.
redis-cli HMGET user:1 name email
redis-cli HDEL user:1 role
redis-cli HEXISTS user:1 name
redis-cli HKEYS user:1
redis-cli HLEN user:1HMGET membaca beberapa field sekaligus, HDEL menghapus satu field, HEXISTS mengecek keberadaan field, HKEYS menampilkan semua nama field, dan HLEN menghitung jumlah field. Perhatikan HGETALL/HKEYS pada hash besar punya bahaya blocking yang sama dengan LRANGE pada list besar.
Hash juga punya counter atomik per-field — sangat cocok untuk profil dengan statistik:
redis-cli HINCRBY user:1 visit_count 1
redis-cli HINCRBY user:1 visit_count 1HINCRBY user:1 visit_count 1 menambah field visit_count secara atomik. Setiap panggilan menambah satu — hasil akhirnya 2 setelah dua panggilan. Ini contoh operasi atomik di level field yang tidak dimiliki tipe data lain.
Kombinasi Hash dan TTL menghasilkan session store yang sempurna:
redis-cli HSET session:9f3a userId 123 role "admin"
redis-cli EXPIRE session:9f3a 1800HSET session:9f3a userId 123 role "admin" menyimpan session sebagai objek, lalu EXPIRE session:9f3a 1800 memberi masa hidup 30 menit. Bila dibandingkan dengan menyimpan session sebagai string JSON, Hash lebih efisien: aplikasi cukup membaca field role tanpa menarik seluruh payload.
| Kebutuhan | Pilihan |
|---|---|
| Simpan objek, akses sebagian field | Hash |
| Simpan dokumen kompleks bersarang | String berisi JSON |
| Cache response API utuh | String |
| Session dengan expiry | Hash + TTL |
| Counter per atribut objek | Hash + HINCRBY |
Aturan praktis: kalau aplikasi sering membaca/mengubah satu field, pakai Hash. Kalau objek selalu dibaca dan ditulis utuh sebagai satu kesatuan, String JSON lebih simpel.
Episode 4 membekali kalian Lists untuk antrian dengan blocking operations dan Hashes untuk objek dengan field-level access: LPUSH/RPOP, LRANGE, BLPOP/BRPOP, lalu HSET/HGETALL, HMGET, HINCRBY, dan pola session store berbasis Hash + TTL.
Inti yang harus dibawa pulang:
RPUSH + LPOP membentuk FIFO queue.LRANGE 0 -1 untuk membaca; LTRIM untuk membatasi panjang list.BLPOP/BRPOP menunggu data baru dengan timeout — efisien untuk worker.HGET per-field lebih hemat daripada JSON utuh.HINCRBY memberi counter atomik per-field.HSET + EXPIRE.Di episode 5 selanjutnya kita membahas Sets, Sorted Sets & HyperLogLog — struktur untuk koleksi unik. Sets untuk tag dan operasi himpunan, Sorted Sets untuk leaderboard dan priority queue, serta HyperLogLog untuk menghitung unique visitor dengan memori konstan 12KB. Lanjut!