All Products
Search
Document Center

Tair (Redis® OSS-Compatible):TairBloom

Last Updated:Aug 07, 2026

Bloom filter adalah struktur data probabilistik yang hemat ruang untuk menguji apakah suatu elemen merupakan anggota dari sebuah set. Bloom filter sangat efektif untuk set data besar karena membutuhkan jauh lebih sedikit memori dibandingkan struktur data lain seperti hash set. TairBloom didasarkan pada Scalable Bloom Filter, yang mendukung auto-scaling sekaligus mempertahankan tingkat positif palsu yang stabil.

Ikhtisar

Di Redis, Anda dapat mengimplementasikan fungsionalitas serupa menggunakan Hash, Set, atau bitset yang disimpan dalam String. Namun, metode-metode tersebut baik mengonsumsi memori dalam jumlah besar maupun tidak dapat diskalakan secara dinamis sambil mempertahankan tingkat positif palsu yang stabil. TairBloom ideal untuk kasus penggunaan yang memerlukan pengujian keanggotaan yang efisien pada dataset besar dan dapat mentolerir tingkat positif palsu yang kecil. Anda dapat langsung menggunakan API TairBloom tanpa wrapper kustom atau implementasi lokal.

Fitur utama

  • Jejak memori rendah.

  • Mendukung auto-scaling.

  • Tingkat positif palsu yang dapat dikustomisasi dan tetap stabil selama auto-scaling.

Use Cases

TairBloom cocok untuk sistem rekomendasi dan sistem crawler di industri seperti live streaming, musik, dan e-commerce. Contohnya:

  • Sistem rekomendasi: Gunakan TairBloom untuk mencatat artikel yang telah dibaca pengguna. Sebelum merekomendasikan artikel baru, kueri filter untuk memeriksa apakah pengguna sudah membacanya.

  • Sistem crawler: Saat menangani jumlah URL yang sangat besar, gunakan TairBloom untuk melacak URL yang telah di-crawl dan mencegah pekerjaan berulang.

Praktik terbaik

Sistem rekomendasi

Anda dapat menggunakan TairBloom untuk mencatat ID artikel yang telah direkomendasikan kepada pengguna. Sebelum merekomendasikan artikel baru, Anda dapat mengkueri filter untuk menentukan apakah artikel tersebut telah direkomendasikan. Hal ini membantu Anda menghindari rekomendasi ulang artikel yang sama. Pseudocode berikut memberikan contohnya:

void recommendedSystem(userid) {
    while (true) {
        // Dapatkan ID artikel kandidat.
        docid = getDocByRandom()
        if (bf.exists(userid, docid)) {
            // Artikel kemungkinan besar sudah direkomendasikan, jadi lewati.
            continue;
        } else {
            // Artikel pasti belum direkomendasikan, jadi kirimkan.
            sendRecommendMsg(docid);
            // Catat rekomendasi tersebut.
            bf.add(userid, docid);
            break;
        }
    }
}

Sistem crawler

Saat menangani jumlah URL yang sangat besar, Anda dapat menggunakan TairBloom untuk melacak URL yang telah di-crawl dan mencegah pekerjaan berulang. Pseudocode berikut memberikan contohnya:

bool crawlerSystem( ) {
    while (true) {
        // Dapatkan URL untuk di-crawl.
        url = getURLFromQueue()
        if (bf.exists(url_bloom, url)) {
            // URL kemungkinan besar sudah di-crawl, jadi lewati.
            continue;
        } else {
            // Unduh konten URL.
            doDownload(url)
            // Tambahkan URL ke TairBloom.
            bf.add(url_bloom, url);
        }
    }
}

Praktik terbaik lainnya

Cara kerja

TairBloom adalah implementasi Scalable Bloom Filter. TairBloom mendukung auto-scaling dan mempertahankan tingkat positif palsu yang stabil. Scalable Bloom Filter merupakan versi yang dioptimalkan dari bloom filter. Bagian-bagian berikut menjelaskan prinsip dasar bloom filter dan Scalable Bloom Filter.

  • Bloom filter

    Bloom filter adalah struktur data probabilistik yang hemat ruang yang diajukan oleh Burton Bloom pada tahun 1970. Bloom filter digunakan untuk menguji apakah suatu elemen merupakan anggota dari sebuah set.

    Bloom filter baru adalah array bit berukuran m bit, dengan semua bit awalnya diatur ke 0. Bloom filter juga menggunakan k fungsi hash berbeda yang menghasilkan distribusi acak seragam, di mana k adalah konstanta yang lebih kecil dari m. Saat Anda menambahkan elemen ke bloom filter, k fungsi hash memetakan elemen tersebut ke k posisi dalam array bit, dan bit-bit pada posisi tersebut diatur ke 1. Satu bit dapat digunakan bersama oleh beberapa elemen. Gambar berikut menunjukkan bagaimana elemen X1 dan X2 dimasukkan ke dalam bloom filter dengan k = 3.

    Untuk mengkueri suatu elemen, k fungsi hash yang sama digunakan untuk mendapatkan k posisi bit yang sesuai. Jika semua bit pada posisi tersebut bernilai 1, elemen tersebut dianggap ada dalam bloom filter. Jika ada satu bit saja yang bernilai 0, elemen tersebut pasti tidak ada. Gambar berikut menunjukkan cara memeriksa keberadaan Y1 dan Y2 dalam bloom filter.

    Seperti yang ditunjukkan pada gambar, meskipun elemen Y2 tidak pernah dimasukkan ke dalam bloom filter, filter tersebut melaporkan bahwa Y2 ada. Ini disebut positif palsu. Berdasarkan hal ini, kita dapat merangkum karakteristik bloom filter sebagai berikut:

    • Posisi bit dapat digunakan bersama oleh elemen yang berbeda.

    • Positif palsu dapat terjadi. Semakin banyak elemen dalam bloom filter, semakin tinggi probabilitas positif palsu. Namun, negatif palsu tidak terjadi. Jika suatu elemen dilaporkan tidak ada, maka elemen tersebut pasti tidak ada.

    • Elemen dapat ditambahkan ke bloom filter tetapi tidak dapat dihapus. Hal ini karena posisi bit dapat digunakan bersama, dan mengosongkan bit untuk satu elemen dapat memengaruhi elemen lain.

  • Scalable Bloom Filter

    Saat semakin banyak elemen ditambahkan ke bloom filter, tingkat positif palsu meningkat. Untuk menjaga tingkat positif palsu tetap stabil, ukuran bloom filter harus ditingkatkan. Namun, bloom filter standar tidak dapat diubah ukurannya. Scalable Bloom Filter mengatasi hal ini dengan membuat bloom filter baru dan menumpuknya menjadi satu filter logis.

    Gambar berikut menunjukkan model dasar Scalable Bloom Filter (SBF), yang terdiri dari dua lapisan: BF0 dan BF1. Awalnya, SBF hanya berisi lapisan BF0. Misalkan setelah elemen a, b, dan c dimasukkan, lapisan BF0 tidak lagi dapat mempertahankan tingkat positif palsu yang ditentukan pengguna. Pada titik ini, lapisan baru (BF1) dibuat. Elemen-elemen berikutnya d, e, dan f dimasukkan ke lapisan BF1. Demikian pula, saat lapisan BF1 tidak lagi memenuhi tingkat positif palsu, lapisan baru (BF2) dibuat, dan seterusnya. Untuk informasi lebih lanjut, lihat Scalable Bloom Filter.

    Penting

    Saat TairBloom melakukan auto-scaling, lapisan baru memiliki kapasitas dua kali lipat dan penggunaan memori empat kali lipat dari lapisan sebelumnya.

    Setiap lapisan tambahan meningkatkan waktu kueri karena kueri mungkin perlu melintasi beberapa lapisan bloom filter. Scalable Bloom Filter selalu memasukkan data ke lapisan terbaru, dan kueri dimulai dari lapisan terbaru lalu berlanjut mundur ke lapisan pertama (BF0). Akibatnya, operasi auto-scaling pada TairBloom dapat membuat kunci besar dan menurunkan performa. Penurunan performa meningkat seiring bertambahnya jumlah elemen.

    Dalam praktiknya, Anda harus menghindari memicu auto-scaling TairBloom dan memperlakukan fitur ini sebagai pengaman. Sediakan cukup memori untuk instans guna mencegah kegagalan penulisan setelah kejadian auto-scaling, yang dapat memicu proses eviksi data berkepanjangan dan membuat instans tidak responsif. Anda dapat menggunakan perintah BF.INFO untuk memeriksa apakah suatu kunci akan segera memicu kejadian auto-scaling. Saat jumlah items di lapisan terbaru mencapai capacity-nya, kejadian auto-scaling akan segera terjadi.

    Saat kapasitas aktual melebihi kapasitas yang telah ditentukan, TairBloom melakukan auto-scaling untuk memastikan operasi penulisan dapat berlanjut, sehingga mencegah insiden produksi. Setelah TairBloom menyelesaikan operasi auto-scaling, segera bangun ulang kunci tersebut untuk meningkatkan performa dan mengurangi risiko yang terkait dengan kejadian auto-scaling berikutnya.

Prasyarat

Instans Tair berbasis DRAM telah dibuat.

Catatan

Versi minor terbaru menyediakan lebih banyak fitur dan stabilitas lebih tinggi. Kami menyarankan Anda memperbarui instans ke versi minor terbaru. Untuk informasi lebih lanjut, lihat Perbarui versi minor instans. Jika instans Anda adalah instans cluster atau read/write splitting, kami menyarankan Anda memperbarui node proxy dalam instans ke versi minor terbaru. Hal ini memastikan semua perintah dapat dijalankan sebagaimana mestinya.

Catatan penggunaan

  • Perintah dalam topik ini beroperasi pada data TairBloom dalam instans Tair.

  • Rencanakan kapasitas awal dan tingkat positif palsu terlebih dahulu. Jika kapasitas yang diharapkan untuk kunci target jauh lebih besar dari 100, gunakan perintah BF.RESERVE untuk membuat kunci TairBloom. Hindari membuat kunci dengan perintah BF.ADD.

    Daftar berikut menjelaskan perbedaan antara menjalankan perintah BF.ADD dan perintah BF.RESERVE.

    • BF.ADD (atau BF.MADD): Jika kunci target tidak ada saat perintah dijalankan, Tair secara otomatis membuat instans TairBloom dengan kapasitas default 100 dan tingkat positif palsu (error_rate) 0,01. Jika kapasitas yang Anda butuhkan jauh lebih besar dari 100, Anda dapat menambahkan lebih banyak elemen nanti dengan memperluas kapasitas. Namun, saat jumlah lapisan internal dalam TairBloom meningkat, operasi kueri harus melintasi beberapa Bloom filter, yang secara signifikan menurunkan performa.

    • BF.RESERVE (atau BF.INSERT): Saat menjalankan perintah ini, Anda harus menetapkan capacity (kapasitas awal). Perintah ini menginisialisasi kapasitas di lapisan pertama kunci TairBloom. Kunci TairBloom dengan lebih sedikit lapisan memberikan kueri yang lebih cepat.

    Catatan

    Sebagai contoh, untuk memasukkan 10.000.000 elemen dengan tingkat positif palsu 0,01, membuat kunci TairBloom dengan perintah BF.ADD memerlukan memori 176 MB. Sebaliknya, membuat kunci dengan perintah BF.RESERVE hanya memerlukan 16 MB.

    Tabel berikut mencantumkan penggunaan memori untuk kunci yang dibuat dengan kapasitas awal dan tingkat positif palsu berbeda menggunakan perintah BF.RESERVE. Nilai-nilai ini hanya sebagai referensi.

    Kapasitas

    Tingkat positif palsu: 0,01

    Tingkat positif palsu: 0,001

    Tingkat positif palsu: 0,0001

    100.000

    0,12 MB

    0,25 MB

    0,25 MB

    1.000.000

    2 MB

    2 MB

    4 MB

    10.000.000

    16 MB

    32 MB

    32 MB

    100.000.000

    128 MB

    256 MB

    256 MB

    1.000.000.000

    2 GB

    2 GB

    4 GB

    Saat membuat kunci dengan kapasitas sangat besar, pertimbangkan error_rate. Kunci dengan kapasitas sangat besar dan presisi tinggi (nilai error_rate rendah) dapat gagal karena memori instans tidak mencukupi.

  • TairBloom memungkinkan Anda memasukkan elemen baru tetapi tidak menghapus elemen yang sudah ada. Akibatnya, penggunaan memori kunci TairBloom hanya meningkat. Untuk mencegah kunci TairBloom tumbuh secara berlebihan dan menyebabkan error out of memory (OOM), pertimbangkan saran berikut.

    • Pisahkan data bisnis: Pisahkan dan perhalus data bisnis Anda untuk menghindari penyimpanan data dalam jumlah besar dalam satu kunci TairBloom. Hal ini tidak hanya mencegah kunci menjadi terlalu besar dan memengaruhi performa kueri, tetapi juga mencegah sebagian besar trafik kueri diarahkan ke instans Redis tempat kunci tersebut berada, yang dapat menciptakan hot key dan menyebabkan ketimpangan akses.

      Pisahkan data bisnis Anda dan distribusikan data tersebut ke beberapa kunci TairBloom. Jika Anda menggunakan instans cluster, Anda dapat mendistribusikan kunci TairBloom ke berbagai node dalam cluster untuk menyeimbangkan memori dan trafik, yang membantu Anda memanfaatkan cluster terdistribusi secara optimal.

    • Bangun ulang secara berkala: Jika bisnis Anda memungkinkan, Anda dapat membangun ulang kunci TairBloom secara berkala. Gunakan perintah DEL untuk menghapus kunci TairBloom, lalu tarik data dari database backend untuk membangunnya kembali. Hal ini membantu mengontrol ukuran kunci TairBloom.

      Anda juga dapat membuat beberapa kunci TairBloom sejak awal dan melakukan rotasi di antara kunci-kunci tersebut untuk mengontrol ukuran masing-masing kunci. Pendekatan ini menghindari pembangunan ulang yang sering tetapi mengonsumsi lebih banyak memori.

Referensi perintah

Tabel 1. Perintah TairBloom

Perintah

Sintaks

Deskripsi

BF.RESERVE

BF.RESERVE key error_rate capacity

Membuat kunci TairBloom kosong dengan capacity dan error_rate yang ditentukan.

BF.ADD

BF.ADD key item

Menambahkan elemen ke kunci TairBloom yang ditentukan.

BF.MADD

BF.MADD key item [item ...]

Menambahkan beberapa elemen ke kunci TairBloom yang ditentukan.

BF.EXISTS

BF.EXISTS key item

Memeriksa apakah elemen ada dalam kunci TairBloom yang ditentukan.

BF.MEXISTS

BF.MEXISTS key item [item ...]

Memeriksa apakah beberapa elemen ada dalam kunci TairBloom yang ditentukan.

BF.INSERT

BF.INSERT key [CAPACITY cap] [ERROR error] [NOCREATE] ITEMS item [item ...]

Menambahkan beberapa elemen ke kunci TairBloom. Anda dapat menentukan kapasitas dan tingkat positif palsu, serta mengontrol apakah kunci dibuat secara otomatis jika belum ada.

BF.INFO

BF.INFO key

Mengembalikan informasi tentang kunci TairBloom, seperti jumlah lapisan saat ini, jumlah elemen di setiap lapisan, dan tingkat positif palsu.

DEL

DEL key [key ...]

Gunakan perintah Redis asli DEL untuk menghapus satu atau beberapa kunci TairBloom.

Catatan

Elemen tidak dapat dihapus secara individual dari kunci TairBloom. Untuk menghapusnya, Anda harus menghapus seluruh kunci dengan perintah DEL.

Catatan

Daftar berikut menjelaskan konvensi sintaks perintah yang digunakan dalam topik ini:

  • Kata kunci huruf kapital: menunjukkan kata kunci perintah.

  • Teks miring: menunjukkan variabel.

  • [opsi]: menunjukkan bahwa parameter yang diapit tanda kurung siku bersifat opsional. Parameter yang tidak diapit tanda kurung siku harus ditentukan.

  • A|B: menunjukkan bahwa parameter yang dipisahkan oleh garis vertikal (|) saling eksklusif. Hanya satu parameter yang dapat ditentukan.

  • ...: menunjukkan bahwa parameter sebelum simbol ini dapat diulang.

BF.RESERVE

Kategori

Deskripsi

Sintaks

BF.RESERVE key error_rate capacity

Kompleksitas waktu

O(1)

Deskripsi

Membuat kunci TairBloom kosong dengan capacity dan error_rate yang ditentukan.

Parameter

  • key: Nama kunci TairBloom.

  • error_rate: Tingkat positif palsu yang diinginkan. Nilai ini harus berada di antara 0 dan 1. Nilai yang lebih kecil menunjukkan presisi lebih tinggi tetapi juga meningkatkan penggunaan memori dan pemanfaatan CPU kunci TairBloom.

  • capacity: Kapasitas awal kunci TairBloom, yaitu jumlah elemen yang diharapkan akan ditambahkan.

    Saat jumlah elemen yang ditambahkan melebihi nilai ini, kunci TairBloom secara otomatis diskalakan dengan menambahkan lebih banyak lapisan bloom filter. Proses ini menurunkan performa kueri karena kueri harus melintasi lapisan tambahan. Oleh karena itu, jika performa menjadi prioritas utama, Anda harus memperkirakan dengan cermat jumlah elemen yang akan ditambahkan ke kunci TairBloom untuk menghindari operasi auto-scaling.

Nilai kembalian

  • OK: Perintah berhasil.

  • Jika tidak, pesan error dikembalikan.

Contoh

Contoh perintah:

BF.RESERVE BFKEY 0.01 100

Contoh nilai kembalian:

OK

BF.ADD

Kategori

Deskripsi

Sintaks

BF.ADD key item

Kompleksitas waktu

O(log N), di mana N adalah jumlah lapisan dalam kunci TairBloom.

Deskripsi

Menambahkan elemen ke kunci TairBloom yang ditentukan.

Catatan

Jika kunci target tidak ada, Tair secara otomatis membuat kunci TairBloom dengan capacity default 100 dan tingkat positif palsu 0,01.

Parameter

  • key: Nama kunci TairBloom.

  • item: Elemen yang akan ditambahkan ke kunci TairBloom.

Nilai kembalian

  • 1: Elemen pasti belum ada sebelumnya dan telah ditambahkan ke kunci TairBloom.

  • 0: Elemen mungkin sudah ada dan tidak ditambahkan lagi.

  • Jika tidak, pesan error dikembalikan.

Contoh

Contoh perintah:

BF.ADD BFKEY item1

Contoh nilai kembalian:

(integer) 1

BF.MADD

Kategori

Deskripsi

Sintaks

BF.MADD key item [item ...]

Kompleksitas waktu

O(log N), di mana N adalah jumlah lapisan dalam kunci TairBloom.

Deskripsi

Menambahkan beberapa elemen ke kunci TairBloom yang ditentukan.

Catatan

Jika kunci target tidak ada, Tair secara otomatis membuat kunci TairBloom dengan capacity default 100 dan tingkat positif palsu 0,01.

Parameter

  • key: Nama kunci TairBloom.

  • item: Satu atau beberapa elemen yang akan ditambahkan ke kunci TairBloom.

Nilai kembalian

  • 1: Elemen pasti belum ada sebelumnya dan telah ditambahkan ke kunci TairBloom.

  • 0: Elemen mungkin sudah ada dan tidak ditambahkan lagi.

  • Jika tidak, pesan error dikembalikan.

Contoh

Contoh perintah:

BF.MADD BFKEY item1 item2 item3

Contoh nilai kembalian:

(integer) 1
(integer) 1
(integer) 1

BF.EXISTS

Kategori

Deskripsi

Sintaks

BF.EXISTS key item

Kompleksitas waktu

O(log N), di mana N adalah jumlah lapisan dalam kunci TairBloom.

Deskripsi

Memeriksa apakah elemen ada dalam kunci TairBloom yang ditentukan.

Parameter

  • key: Nama kunci TairBloom.

  • item: Elemen yang akan diperiksa.

Nilai kembalian

  • 0: Elemen pasti tidak ada.

  • 1: Elemen mungkin ada.

  • Jika tidak, pesan error dikembalikan.

Contoh

Contoh perintah:

BF.EXISTS BFKEY item1

Contoh nilai kembalian:

(integer) 1

BF.MEXISTS

Kategori

Deskripsi

Sintaks

BF.MEXISTS key item [item ...]

Kompleksitas waktu

O(log N), di mana N adalah jumlah lapisan dalam kunci TairBloom.

Deskripsi

Memeriksa apakah beberapa elemen ada dalam kunci TairBloom yang ditentukan.

Parameter

  • key: Nama kunci TairBloom.

  • item: Satu atau beberapa elemen yang akan diperiksa.

Nilai kembalian

  • 0: Elemen pasti tidak ada.

  • 1: Elemen mungkin ada.

  • Jika tidak, pesan error dikembalikan.

Contoh

Contoh perintah:

BF.MEXISTS BFKEY item1 item5

Contoh nilai kembalian:

(integer) 1
(integer) 0

BF.INSERT

Kategori

Deskripsi

Sintaks

BF.INSERT key [CAPACITY cap] [ERROR error] [NOCREATE] ITEMS item [item ...]

Kompleksitas waktu

O(log N), di mana N adalah jumlah lapisan dalam kunci TairBloom.

Deskripsi

Menambahkan beberapa elemen ke kunci TairBloom. Anda dapat menentukan kapasitas dan tingkat positif palsu, serta mengontrol apakah kunci dibuat secara otomatis jika belum ada.

Parameter

  • key: Nama kunci TairBloom.

  • capacity: Kapasitas awal kunci TairBloom, yaitu jumlah elemen yang diharapkan akan ditambahkan. Nilai ini diabaikan jika kunci TairBloom sudah ada.

    Saat jumlah elemen yang ditambahkan melebihi nilai ini, kunci TairBloom secara otomatis diskalakan.

  • error_rate: Tingkat positif palsu yang diinginkan. Nilai ini harus berada di antara 0 dan 1. Nilai yang lebih kecil menunjukkan presisi lebih tinggi tetapi juga meningkatkan penggunaan memori dan pemanfaatan CPU.

  • NOCREATE: Jika ditentukan, kunci TairBloom tidak dibuat secara otomatis jika belum ada. Parameter ini tidak dapat digunakan bersama CAPACITY atau ERROR.

  • item: Satu atau beberapa elemen yang akan ditambahkan.

Nilai kembalian

  • 1: Elemen pasti belum ada sebelumnya dan telah ditambahkan ke kunci TairBloom.

  • 0: Elemen mungkin sudah ada dan tidak ditambahkan lagi.

  • Jika tidak, pesan error dikembalikan.

Contoh

Contoh perintah:

BF.INSERT bfkey1 CAPACITY 10000 ERROR 0.001 ITEMS item1 item2 item3

Contoh nilai kembalian:

(integer) 1
(integer) 1
(integer) 1

BF.INFO

Kategori

Deskripsi

Sintaks

BF.INFO key

Kompleksitas waktu

O(log N), di mana N adalah jumlah lapisan dalam kunci TairBloom.

Deskripsi

Mengembalikan informasi tentang kunci TairBloom, seperti jumlah lapisan saat ini, jumlah elemen di setiap lapisan, dan tingkat positif palsu.

Parameter

  • key: Nama kunci TairBloom.

Nilai kembalian

  • Informasi tentang kunci TairBloom dikembalikan jika perintah berhasil.

  • Jika tidak, pesan error dikembalikan.

Contoh

Contoh perintah:

BF.INFO bk1

Contoh nilai kembalian:

1) "total_items:6,num_blooms:2"
2) "bytes:4 bits:32 hashes:7 hashwidth:64 capacity:3 items:3 error_ratio:0.01"
3) "bytes:16 bits:128 hashes:9 hashwidth:64 capacity:10 items:3 error_ratio:0.0025"

Detail nilai kembalian:

  • total_items: Jumlah total elemen. num_blooms: Jumlah total lapisan bloom filter.

  • Informasi tentang setiap lapisan bloom filter:

    • bytes: Jumlah byte yang digunakan.

    • bits: Jumlah bit yang digunakan. bits = bytes * 8.

    • hashes: Jumlah fungsi hash.

    • hashwidth: Lebar fungsi hash.

    • capacity: Kapasitas.

    • items: Jumlah elemen.

    • error_ratio: Tingkat positif palsu.

FAQ

Apakah TairBloom mendukung perintah CF (Cuckoo Filter)?

Tidak. TairBloom kompatibel dengan perintah BF.* dari RedisBloom (seperti BF.RESERVE dan BF.ADD) tetapi tidak mendukung perintah CF.* (seperti CF.RESERVE dan CF.ADD). CF termasuk dalam ekstensi Cuckoo Filter dari modul RedisBloom.