Menggunakan Perintah Redis Scan pada Linux: Panduan Lengkap
Redis adalah penyimpan struktur data in-memory, open-source, berkinerja tinggi yang banyak digunakan sebagai database key-value, cache, dan message broker. Di antara fitur-fiturnya yang paling powerful — namun sering kurang dimanfaatkan — adalah scan commands, yang memungkinkan Anda untuk melakukan iterasi secara bertahap melalui dataset besar tanpa memblokir server atau menurunkan performa.
Jika Anda menjalankan Redis pada server berbasis Linux, menguasai scan commands sangat penting untuk membangun aplikasi yang scalable dan production-ready. Tidak seperti perintah KEYS yang berbahaya, yang mengambil semua kunci yang cocok dalam satu operasi blocking, scan commands mengembalikan data dalam batch kecil yang dapat dikelola — menjadikannya alat yang tepat untuk lingkungan apa pun yang menangani volume data signifikan.
Dalam panduan komprehensif ini, Anda akan mempelajari dengan tepat cara menggunakan SCAN, SSCAN, HSCAN, dan ZSCAN di Redis pada Linux, lengkap dengan contoh dunia nyata, shell script, dan best practice untuk deployment production.
Apa Itu Redis Scan Commands?
Redis scan commands menyediakan mekanisme berbasis cursor, non-blocking untuk melakukan iterasi atas kunci, set, hash, dan sorted set. Setiap perintah mengembalikan subset kecil dari elemen per panggilan bersama dengan nilai cursor, yang Anda gunakan untuk melanjutkan iterasi dalam panggilan berikutnya. Ketika cursor kembali ke 0, dataset lengkap telah ditraversi.
Pendekatan ini secara fundamental lebih aman dan lebih efisien daripada KEYS, yang memblokir seluruh server Redis sampai selesai scanning — masalah kritis di lingkungan production dengan jutaan kunci.
Empat Core Scan Commands
| Command | Tujuan |
|---|---|
SCAN | Melakukan iterasi atas kunci di seluruh keyspace |
SSCAN | Melakukan iterasi atas elemen dalam sebuah Set |
HSCAN | Melakukan iterasi atas field dan value dalam sebuah Hash |
ZSCAN | Melakukan iterasi atas member dan score dalam sebuah Sorted Set |
Syntax Dasar Scan Commands
Keempat scan commands berbagi struktur syntax yang konsisten:
SCAN cursor [MATCH pattern] [COUNT count]
SSCAN key cursor [MATCH pattern] [COUNT count]
HSCAN key cursor [MATCH pattern] [COUNT count]
ZSCAN key cursor [MATCH pattern] [COUNT count]Parameter Dijelaskan
cursor— Sebuah integer yang mewakili posisi saat ini dalam iterasi. Selalu mulai dengan0untuk memulai scan baru. Redis mengembalikan cursor baru dengan setiap response; gunakan dalam panggilan berikutnya untuk melanjutkan.MATCH pattern*(opsional)* — Memfilter hasil menggunakan glob-style pattern matching (misalnya,user:*,*session*). Catatan: filtering terjadi *setelah* retrieval, jadi kecocokan low-density mungkin memerlukan banyak iterasi.COUNT count*(opsional)* — Sebuah hint ke Redis yang menyarankan berapa banyak elemen yang akan dikembalikan per iterasi. Ini bukan hard limit; Redis mungkin mengembalikan lebih banyak atau lebih sedikit. Default adalah10.
Menginstal Redis pada Linux
Sebelum menggunakan scan commands, Anda perlu Redis terinstal dan berjalan pada server Linux Anda. Baik Anda berada di lingkungan production dengan traffic tinggi atau mesin development, proses instalasi sangat mudah.
> Tip: Untuk workload production yang memerlukan Redis dalam skala besar, pertimbangkan untuk deploy pada paket VPS Hosting atau Dedicated Server untuk memastikan Anda memiliki memory, CPU, dan resource I/O yang Redis butuhkan.
Menginstal Redis pada Debian/Ubuntu
sudo apt update
sudo apt install redis-server -yMenginstal Redis pada CentOS/RHEL
sudo yum install redis -yMemulai Redis Service
sudo systemctl start redis
sudo systemctl enable redisMemverifikasi Instalasi
sudo systemctl status redisAnda seharusnya melihat active (running) dalam output. Sekarang hubungkan ke Redis CLI:
redis-cliSetelah berada di dalam CLI, test koneksi:
127.0.0.1:6379> PING
PONGAnda siap untuk mulai menggunakan scan commands.
Menggunakan SCAN Command
Perintah SCAN melakukan iterasi atas semua kunci dalam Redis keyspace. Ini adalah pengganti general-purpose untuk perintah KEYS di lingkungan production.
Contoh 1: Basic SCAN
Untuk mulai scanning semua kunci dalam database, mulai dengan cursor 0:
SCAN 0Sample output:
1) "14"
2) 1) "session:abc123"
2) "user:1001"
3) "product:55"Elemen pertama (14) adalah next cursor. Gunakan dalam panggilan SCAN berikutnya Anda. Ketika cursor yang dikembalikan adalah 0, iterasi penuh selesai.
Contoh 2: Memfilter Kunci dengan MATCH
Untuk mengambil hanya kunci yang cocok dengan pola spesifik — misalnya, semua kunci dengan prefix user::
SCAN 0 MATCH user:*Ini mengembalikan hanya kunci yang namanya dimulai dengan user:. Terus melakukan iterasi sampai cursor mengembalikan 0 untuk memastikan Anda telah scanning seluruh keyspace.
Contoh 3: Mengontrol Batch Size dengan COUNT
Untuk menyarankan bahwa Redis mengembalikan sekitar 100 kunci per iterasi:
SCAN 0 COUNT 100Ingat: COUNT adalah sebuah *hint*, bukan jaminan. Redis mungkin mengembalikan hasil sedikit lebih banyak atau lebih sedikit tergantung struktur data internal.
Contoh 4: Full Keyspace Iteration dengan Shell Script
Dalam skenario dunia nyata, Anda perlu melakukan loop melalui seluruh keyspace secara programmatic. Berikut adalah script Bash production-ready yang melakukan iterasi melalui semua kunci yang cocok dengan pola:
#!/bin/bash
cursor=0
echo "Starting full keyspace scan..."
while true; do
# Execute SCAN and capture the result
result=$(redis-cli SCAN $cursor MATCH user:* COUNT 100)
# Extract the new cursor (first line of output)
cursor=$(echo "$result" | head -n 1)
# Extract and display the keys (remaining lines)
keys=$(echo "$result" | tail -n +2)
echo "Keys found:"
echo "$keys"
# Break the loop when cursor returns to 0
if [[ "$cursor" == "0" ]]; then
echo "Scan complete."
break
fi
doneUntuk menjalankan script ini:
chmod +x scan_keys.sh
./scan_keys.shMenggunakan SSCAN Command
SSCAN digunakan untuk melakukan iterasi secara bertahap melalui member dari sebuah Redis Set. Ini mengikuti pola berbasis cursor yang sama seperti SCAN.
Langkah 1: Buat Set dan Tambahkan Member
SADD myset "apple"
SADD myset "banana"
SADD myset "cherry"
SADD myset "date"
SADD myset "elderberry"
SADD myset "mango"
SADD myset "mango:tropical"
SADD myset "mango:dried"Langkah 2: Basic SSCAN
Scan semua elemen dalam myset mulai dari cursor 0:
SSCAN myset 0Langkah 3: Memfilter Elemen dengan MATCH
Untuk mengambil hanya elemen yang cocok dengan pola mango:*:
SSCAN myset 0 MATCH mango:*Langkah 4: Melakukan Iterasi Melalui Set dengan Shell Script
#!/bin/bash
cursor=0
echo "Scanning through myset:"
while true; do
# Scan the set
result=$(redis-cli SSCAN myset $cursor COUNT 10)
# Update cursor
cursor=$(echo "$result" | head -n 1)
# Print elements returned
elements=$(echo "$result" | tail -n +2)
echo "Elements: $elements"
# Stop when cursor returns to 0
if [[ "$cursor" == "0" ]]; then
echo "Set scan complete."
break
fi
doneSimpan sebagai scan_myset.sh, buat executable, dan jalankan:
chmod +x scan_myset.sh
./scan_myset.shMenggunakan HSCAN Command
HSCAN melakukan iterasi melalui field dan value dari sebuah Redis Hash. Ini sangat berguna ketika hash berisi ratusan atau ribuan field dan Anda perlu memproses mereka tanpa memuat semuanya ke memory sekaligus.
Langkah 1: Buat Hash dan Tambahkan Field
HSET myhash name "John Doe"
HSET myhash age "30"
HSET myhash occupation "Software Developer"
HSET myhash city "San Francisco"
HSET myhash country "USA"
HSET myhash email "john@example.com"Langkah 2: Basic HSCAN
HSCAN myhash 0Sample output:
1) "0"
2) 1) "name"
2) "John Doe"
3) "age"
4) "30"
5) "occupation"
6) "Software Developer"
...Hasil dikembalikan sebagai pasangan field-value yang bergantian.
Langkah 3: Memfilter Hash Field dengan MATCH
Untuk mengambil hanya field yang namanya berisi "city" atau cocok dengan pola:
HSCAN myhash 0 MATCH *city*Langkah 4: Melakukan Iterasi Melalui Hash dengan Shell Script
#!/bin/bash
cursor=0
echo "Scanning hash: myhash"
while true; do
result=$(redis-cli HSCAN myhash $cursor COUNT 10)
cursor=$(echo "$result" | head -n 1)
fields=$(echo "$result" | tail -n +2)
echo "Fields and values:"
echo "$fields"
if [[ "$cursor" == "0" ]]; then
echo "Hash scan complete."
break
fi
doneMenggunakan ZSCAN Command
ZSCAN melakukan iterasi melalui member dan score dari sebuah Redis Sorted Set. Sorted set biasanya digunakan untuk leaderboard, priority queue, dan time-series data — semua skenario di mana scanning koleksi besar secara efisien sangat penting.
Langkah 1: Buat Sorted Set dan Tambahkan Member
ZADD mysortedset 1 "apple"
ZADD mysortedset 2 "banana"
ZADD mysortedset 3 "cherry"
ZADD mysortedset 4 "date"
ZADD mysortedset 5 "elderberry"Langkah 2: Basic ZSCAN
ZSCAN mysortedset 0Sample output:
1) "0"
2) 1) "apple"
2) "1"
3) "banana"
4) "2"
5) "cherry"
6) "3"Hasil dikembalikan sebagai pasangan member-score yang bergantian.
Langkah 3: Memfilter Member dengan MATCH
Untuk menemukan semua member yang namanya berisi huruf "e":
ZSCAN mysortedset 0 MATCH *e*Langkah 4: Full Sorted Set Iteration Script
#!/bin/bash
cursor=0
echo "Scanning sorted set: mysortedset"
while true; do
result=$(redis-cli ZSCAN mysortedset $cursor COUNT 10)
cursor=$(echo "$result" | head -n 1)
members=$(echo "$result" | tail -n +2)
echo "Members and scores:"
echo "$members"
if [[ "$cursor" == "0" ]]; then
echo "Sorted set scan complete."
break
fi
doneScan Command Comparison: Quick Reference
| Fitur | `SCAN` | `SSCAN` | `HSCAN` | `ZSCAN` |
|---|---|---|---|---|
| Target | Semua kunci | Set member | Hash field/value | Sorted set member/score |
| Memerlukan nama kunci | Tidak | Ya | Ya | Ya |
| Mendukung MATCH | Ya | Ya | Ya | Ya |
| Mendukung COUNT | Ya | Ya | Ya | Ya |
| Format output | Nama kunci | String member | Pasangan field-value | Pasangan member-score |
| Blocking | Tidak | Tidak | Tidak | Tidak |
Best Practice untuk Menggunakan Redis Scan Commands di Production
1. Selalu Gunakan SCAN Daripada KEYS di Production
Perintah KEYS adalah single-threaded dan memblokir semua operasi Redis lainnya sampai selesai. Pada database dengan jutaan kunci, ini dapat menyebabkan lonjakan latency yang parah. Jangan pernah gunakan KEYS di production. SCAN adalah alternatif yang benar dan non-blocking.
2. Tune COUNT Berdasarkan Ukuran Dataset Anda
Untuk dataset kecil (< 1.000 kunci), default COUNT 10 sudah cukup. Untuk dataset besar, tingkatkan COUNT ke 100–1000 untuk mengurangi jumlah round trip sambil menjaga response individual tetap dapat dikelola.
3. Jangan Andalkan MATCH Saja untuk Efisiensi
Filter MATCH diterapkan *setelah* Redis mengambil elemen secara internal. Jika pola Anda hanya cocok dengan sebagian kecil dari kunci, Redis masih melakukan scan dataset lengkap secara internal. Gunakan konvensi penamaan kunci (misalnya, prefix yang konsisten) untuk membuat MATCH lebih efektif.
4. Proses Hasil dalam Batch
Jangan pernah mengakumulasi semua hasil scan dalam memory sebelum memproses. Sebaliknya, proses setiap batch segera saat dikembalikan. Ini sangat penting pada server dengan memory terbatas.
5. Tangani Cursor State dengan Hati-hati
Selalu inisialisasi cursor ke 0 dan update dengan setiap response. Jika aplikasi Anda crash di tengah-tengah scan, mulai ulang dari 0. Cursor Redis tidak persistent di seluruh restart server.
6. Test Secara Menyeluruh di Development Terlebih Dahulu
Sebelum deploy scan-based logic ke production, validasi di lingkungan staging dengan dataset yang representatif. Verifikasi bahwa loop Anda dengan benar terminate ketika cursor kembali ke 0.
7. Amankan Instance Redis Anda
Redis tidak boleh pernah exposed ke public internet tanpa authentication. Gunakan requirepass dalam konfigurasi Redis Anda, bind ke localhost atau private network interface, dan gunakan firewall rules untuk membatasi akses.
Memilih Lingkungan Hosting yang Tepat untuk Redis
Performa Redis secara langsung terikat pada available RAM, CPU speed, dan network latency. Memilih infrastruktur hosting yang tepat sama pentingnya dengan menulis efficient Redis commands.
- Development dan small project: Shared Web Hosting mungkin cukup untuk lightweight Redis usage, meskipun dedicated Redis instance selalu lebih disukai.
- Growing application: Paket VPS Hosting memberikan Anda dedicated resource, root access, dan kemampuan untuk tune konfigurasi Redis (
maxmemory, persistence setting, dll) sesuai kebutuhan exact Anda. - High-traffic production system: Dedicated Servers menyediakan maximum RAM dan CPU resource yang dapat digunakan Redis, menghilangkan resource contention sepenuhnya.
- AI dan ML workload menggunakan Redis sebagai vector store: GPU Hosting menawarkan computational power yang dibutuhkan untuk embedding generation dan similarity search bersama Redis.
Untuk aplikasi yang juga memerlukan web control panel untuk manajemen yang lebih mudah, VPS dengan cPanel menyediakan interface user-friendly bersama full server control.
