Kodeloka
  1. Kodeloka
  2. Kelas Redis
  3. Materi

Advanced · Modul 17 dari 21

Redis 8 & Modul Bawaan (JSON, Search, Time Series, Bloom, Vector)

Struktur data lanjutan yang kini menyatu di Redis 8: dokumen JSON, indeks pencarian, deret waktu, struktur probabilistik, dan pencarian vektor untuk aplikasi AI.

📌 Ringkasan Eksekutif Modul:
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.

💡 Catatan lisensi

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
📌 Indeks diperbarui otomatis

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.

Bloom Filter — "apakah ini pernah ada?"
# 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
⚠️ Sifat jawaban Bloom Filter

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.

Struktur probabilistik lainnya
# 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
💡 Alur khas aplikasi RAG
  1. Potong dokumen menjadi bagian-bagian kecil (chunk).
  2. Ubah tiap bagian menjadi vektor embedding lewat model bahasa.
  3. Simpan vektornya ke Vector Set, teks aslinya ke JSON.
  4. Saat ada pertanyaan, ubah pertanyaan menjadi vektor, lalu VSIM untuk menemukan bagian yang paling relevan.
  5. Kirim bagian-bagian itu sebagai konteks ke model bahasa.

7. Kapan Memakai, Kapan Menahan Diri

KebutuhanPertimbangan
Menyimpan objek yang sering diubah sebagianJSON jelas lebih baik daripada serialisasi string
Pencarian teks penuh berskala besarSearch cukup untuk banyak kasus; Elasticsearch tetap unggul untuk analitik teks yang sangat kompleks
Metrik jangka panjangTime Series baik untuk retensi pendek; Prometheus/Mimir lebih tepat untuk jangka panjang
Deduplikasi berskala jutaanBloom sangat unggul — memori tetap, bukan tumbuh linear
Basis data vektor produksi berskala besarVector Set praktis bila sudah pakai Redis; pertimbangkan basis data vektor khusus untuk skala sangat besar
⚠️ Semuanya tetap tinggal di RAM

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.