Sejak Redis 8, kemampuan yang dulu berupa modul terpisah (RedisJSON, RediSearch, RedisTimeSeries, RedisBloom) menyatu ke dalam Redis inti open source. Ini menambah tipe dokumen JSON dengan akses jalur, indeks sekunder dengan kueri teks penuh dan filter numerik, deret waktu dengan agregasi otomatis, struktur probabilistik hemat memori, serta Vector Set untuk pencarian kemiripan yang menopang aplikasi AI.
1. Perubahan Besar di Redis 8
Selama bertahun-tahun, kemampuan lanjutan Redis hanya tersedia lewat modul terpisah yang harus dipasang sendiri atau melalui Redis Stack. Sejak Redis 8, kemampuan tersebut menjadi bagian dari Redis inti.
Redis sempat berpindah dari BSD ke lisensi ganda RSALv2/SSPLv1 pada 2024, yang memicu lahirnya fork Valkey (dikelola Linux Foundation, tetap BSD). Redis 8 kemudian menambahkan opsi AGPLv3 sehingga kembali tersedia sebagai perangkat lunak open source. Bila proyek Anda punya batasan lisensi yang ketat, Valkey adalah alternatif yang kompatibel di tingkat protokol.
2. JSON — Dokumen dengan Akses Jalur
Tanpa JSON, menyimpan objek berarti melakukan serialisasi ke string; mengubah satu field mengharuskan membaca seluruh objek, mengurainya, mengubahnya, lalu menulis balik semuanya.
# Simpan dokumen utuh. Tanda $ adalah jalur akar.
JSON.SET produk:1 $ '{"nama":"Kopi Gayo","harga":85000,"stok":40,"tag":["kopi","aceh"]}'
# Baca hanya field tertentu -- tanpa mengambil seluruh dokumen
JSON.GET produk:1 $.harga
JSON.GET produk:1 $.nama $.stok
# Ubah satu field saja, secara atomik
JSON.SET produk:1 $.harga 90000
# Operasi numerik langsung di server
JSON.NUMINCRBY produk:1 $.stok -1
# Menambah elemen ke array di dalam dokumen
JSON.ARRAPPEND produk:1 $.tag '"premium"'
JSON.ARRLEN produk:1 $.tag
JSON.DEL produk:1 $.tag
JSON.TYPE produk:1 $.harga
3. Search — Indeks Sekunder untuk Redis
Redis biasa hanya bisa mencari berdasarkan nama key. Search menambahkan indeks sekunder sehingga Anda bisa mencari berdasarkan isi.
# Membuat indeks atas semua key berawalan produk:
FT.CREATE idx:produk
ON JSON
PREFIX 1 produk:
SCHEMA
$.nama AS nama TEXT SORTABLE
$.harga AS harga NUMERIC SORTABLE
$.stok AS stok NUMERIC
$.tag[*] AS tag TAG
# Pencarian teks penuh
FT.SEARCH idx:produk "kopi"
# Filter rentang numerik
FT.SEARCH idx:produk "@harga:[50000 100000]"
# Gabungan teks, tag, dan angka
FT.SEARCH idx:produk "@tag:{aceh} @harga:[0 90000]" SORTBY harga ASC LIMIT 0 10
# Agregasi ala GROUP BY
FT.AGGREGATE idx:produk "*"
GROUPBY 1 @tag
REDUCE COUNT 0 AS jumlah
REDUCE AVG 1 @harga AS rata_harga
FT.INFO idx:produk
FT.DROPINDEX idx:produk
Setelah indeks dibuat, setiap JSON.SET atau HSET pada key yang cocok dengan PREFIX akan langsung memperbarui indeks. Anda tidak perlu melakukan reindex manual. Ingat bahwa indeks memakan RAM tambahan — ini pertukaran antara kecepatan kueri dan konsumsi memori.
4. Time Series — Deret Waktu
# Buat deret dengan retensi 7 hari (dalam milidetik) dan label TS.CREATE suhu:ruang1 RETENTION 604800000 LABELS ruangan 1 lokasi jakarta # Tambah titik data. Tanda * berarti waktu sekarang. TS.ADD suhu:ruang1 * 27.5 # Aturan agregasi otomatis: # rata-ratakan tiap 1 menit ke deret ringkasan TS.CREATE suhu:ruang1:1m TS.CREATERULE suhu:ruang1 suhu:ruang1:1m AGGREGATION avg 60000 # Kueri rentang dengan agregasi TS.RANGE suhu:ruang1 - + AGGREGATION avg 60000 # Kueri banyak deret sekaligus berdasarkan label TS.MRANGE - + FILTER lokasi=jakarta
5. Struktur Probabilistik — Menukar Ketepatan dengan Memori
Struktur ini menjawab pertanyaan secara hampir tepat, tetapi dengan memori yang jauh lebih kecil dan konstan.
# Kapasitas 1 juta item, tingkat positif palsu 0,1% BF.RESERVE email:terdaftar 0.001 1000000 BF.ADD email:terdaftar "[email protected]" BF.EXISTS email:terdaftar "[email protected]" # => 1 BF.EXISTS email:terdaftar "[email protected]" # => 0
Jawaban "tidak ada" pasti benar. Jawaban "ada" mungkin salah (positif palsu). Karena itu Bloom cocok sebagai penyaring awal: bila jawabannya "tidak ada", Anda bisa langsung melewati kueri database. Bila "ada", barulah periksa ke database yang sesungguhnya. Pola ini sangat efektif melawan serangan cache penetration.
# Cuckoo Filter -- seperti Bloom, tapi mendukung penghapusan CF.RESERVE ip:diblokir 1000000 CF.ADD ip:diblokir "10.1.2.3" CF.DEL ip:diblokir "10.1.2.3" # Count-Min Sketch -- perkiraan frekuensi CMS.INITBYPROB kunjungan 0.001 0.01 CMS.INCRBY kunjungan "/beranda" 1 "/produk" 1 CMS.QUERY kunjungan "/beranda" # Top-K -- daftar item terpopuler TOPK.RESERVE lagu:populer 10 2000 7 0.925 TOPK.ADD lagu:populer "lagu-a" "lagu-b" "lagu-a" TOPK.LIST lagu:populer # HyperLogLog (sudah ada sejak lama di Redis inti) # Menghitung jumlah unik dengan memori tetap ~12 KB PFADD pengunjung:hariini "user1" "user2" "user3" PFCOUNT pengunjung:hariini
6. Vector Set — Pencarian Kemiripan untuk AI
Tipe data yang diperkenalkan di Redis 8 untuk menyimpan embedding dan mencari tetangga terdekat — fondasi aplikasi RAG (Retrieval-Augmented Generation) dan rekomendasi.
# Menambahkan vektor beserta atribut VADD dokumen VALUES 4 0.12 0.88 0.31 0.05 doc:1 VADD dokumen VALUES 4 0.10 0.90 0.29 0.07 doc:2 VADD dokumen VALUES 4 0.91 0.02 0.11 0.44 doc:3 # Cari 5 tetangga terdekat dari sebuah vektor kueri VSIM dokumen VALUES 4 0.11 0.89 0.30 0.06 COUNT 5 WITHSCORES # Cari yang mirip dengan elemen yang sudah ada VSIM dokumen ELE doc:1 COUNT 3 VCARD dokumen VDIM dokumen VREM dokumen doc:3
- Potong dokumen menjadi bagian-bagian kecil (chunk).
- Ubah tiap bagian menjadi vektor embedding lewat model bahasa.
- Simpan vektornya ke Vector Set, teks aslinya ke JSON.
- Saat ada pertanyaan, ubah pertanyaan menjadi vektor, lalu
VSIMuntuk menemukan bagian yang paling relevan. - Kirim bagian-bagian itu sebagai konteks ke model bahasa.
7. Kapan Memakai, Kapan Menahan Diri
| Kebutuhan | Pertimbangan |
|---|---|
| Menyimpan objek yang sering diubah sebagian | JSON jelas lebih baik daripada serialisasi string |
| Pencarian teks penuh berskala besar | Search cukup untuk banyak kasus; Elasticsearch tetap unggul untuk analitik teks yang sangat kompleks |
| Metrik jangka panjang | Time Series baik untuk retensi pendek; Prometheus/Mimir lebih tepat untuk jangka panjang |
| Deduplikasi berskala jutaan | Bloom sangat unggul — memori tetap, bukan tumbuh linear |
| Basis data vektor produksi berskala besar | Vector Set praktis bila sudah pakai Redis; pertimbangkan basis data vektor khusus untuk skala sangat besar |
Indeks Search, dokumen JSON, dan vektor semuanya memakan memori. Sebuah indeks vektor bisa lebih besar daripada data aslinya. Rencanakan kapasitas RAM dengan cermat, dan pantau INFO memory setelah membangun indeks baru.