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.
PentingSaat 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
itemsdi lapisan terbaru mencapaicapacity-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.
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.RESERVEuntuk membuat kunci TairBloom. Hindari membuat kunci dengan perintahBF.ADD.Daftar berikut menjelaskan perbedaan antara menjalankan perintah
BF.ADDdan perintahBF.RESERVE.BF.ADD(atauBF.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(atauBF.INSERT): Saat menjalankan perintah ini, Anda harus menetapkancapacity(kapasitas awal). Perintah ini menginisialisasi kapasitas di lapisan pertama kunci TairBloom. Kunci TairBloom dengan lebih sedikit lapisan memberikan kueri yang lebih cepat.
CatatanSebagai contoh, untuk memasukkan 10.000.000 elemen dengan tingkat positif palsu 0,01, membuat kunci TairBloom dengan perintah
BF.ADDmemerlukan memori 176 MB. Sebaliknya, membuat kunci dengan perintahBF.RESERVEhanya 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 (nilaierror_raterendah) 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
DELuntuk 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 |
| Membuat kunci TairBloom kosong dengan | |
| Menambahkan elemen ke kunci TairBloom yang ditentukan. | |
| Menambahkan beberapa elemen ke kunci TairBloom yang ditentukan. | |
| Memeriksa apakah elemen ada dalam kunci TairBloom yang ditentukan. | |
| Memeriksa apakah beberapa elemen ada dalam kunci TairBloom yang ditentukan. | |
| Menambahkan beberapa elemen ke kunci TairBloom. Anda dapat menentukan kapasitas dan tingkat positif palsu, serta mengontrol apakah kunci dibuat secara otomatis jika belum ada. | |
| Mengembalikan informasi tentang kunci TairBloom, seperti jumlah lapisan saat ini, jumlah elemen di setiap lapisan, dan tingkat positif palsu. | |
| Gunakan perintah Redis asli Catatan Elemen tidak dapat dihapus secara individual dari kunci TairBloom. Untuk menghapusnya, Anda harus menghapus seluruh kunci dengan perintah |
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 |
|
Kompleksitas waktu | O(1) |
Deskripsi | Membuat kunci TairBloom kosong dengan |
Parameter |
|
Nilai kembalian |
|
Contoh | Contoh perintah: Contoh nilai kembalian: |
BF.ADD
Kategori | Deskripsi |
Sintaks |
|
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 |
Parameter |
|
Nilai kembalian |
|
Contoh | Contoh perintah: Contoh nilai kembalian: |
BF.MADD
Kategori | Deskripsi |
Sintaks |
|
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 |
Parameter |
|
Nilai kembalian |
|
Contoh | Contoh perintah: Contoh nilai kembalian: |
BF.EXISTS
Kategori | Deskripsi |
Sintaks |
|
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 |
|
Nilai kembalian |
|
Contoh | Contoh perintah: Contoh nilai kembalian: |
BF.MEXISTS
Kategori | Deskripsi |
Sintaks |
|
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 |
|
Nilai kembalian |
|
Contoh | Contoh perintah: Contoh nilai kembalian: |
BF.INSERT
Kategori | Deskripsi |
Sintaks |
|
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 |
|
Nilai kembalian |
|
Contoh | Contoh perintah: Contoh nilai kembalian: |
BF.INFO
Kategori | Deskripsi |
Sintaks |
|
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 |
|
Nilai kembalian |
|
Contoh | Contoh perintah: Contoh nilai kembalian: Detail nilai kembalian:
|
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.