Bloom adalah struktur data probabilistik yang hemat ruang dan menggunakan memori minimal untuk memeriksa apakah suatu elemen ada di antara sejumlah besar data. TairBloom merupakan implementasi dari filter Bloom yang dapat diskalakan (SBFs). Fiturnya mencakup skalabilitas dinamis sambil menjaga tingkat positif palsu yang stabil selama proses penskalaan.
Ikhtisar
Bitmap pada struktur data Redis seperti hash, set, dan string dapat digunakan untuk mengimplementasikan fitur serupa dengan TairBloom. Namun, struktur data ini mungkin mengonsumsi banyak memori atau gagal mempertahankan tingkat positif palsu yang stabil selama penskalaan dinamis. Oleh karena itu, TairBloom ideal untuk memeriksa keanggotaan dalam kumpulan data besar sambil mengizinkan adanya tingkat positif palsu tertentu. Filter Bloom bawaan TairBloom dapat digunakan tanpa enkapsulasi lebih lanjut atau pembuatan filter tambahan pada perangkat lokal Anda.
Fitur
Penggunaan memori rendah.
Skalabilitas dinamis.
Tingkat positif palsu yang stabil selama penskalaan.
Skenario tipikal
TairBloom dapat digunakan dalam sistem rekomendasi dan crawler di industri seperti live-streaming, musik, dan e-commerce.
Sistem rekomendasi: TairBloom mencatat ID artikel yang mungkin telah direkomendasikan, menanyakan artikel-artikel tersebut, menentukan artikel duplikat, lalu merekomendasikan artikel baru yang mungkin diminati pengguna.
Sistem crawler: TairBloom menyaring URL yang telah di-crawl untuk meningkatkan produktivitas.
Praktik terbaik
Membangun sistem rekomendasi berdasarkan TairBloom
TairBloom mencatat ID artikel yang mungkin telah direkomendasikan, menanyakan artikel-artikel tersebut, menentukan artikel duplikat, lalu merekomendasikan artikel baru yang mungkin diminati pengguna. Pseudocode:
void recommendedSystem(userid) {
while (true) {
// Dapatkan ID artikel acak atau ID artikel yang diinginkan.
docid = getDocByRandom()
if (bf.exists(userid, docid)) {
// Jika artikel mungkin telah direkomendasikan kepada pengguna, artikel berikutnya direkomendasikan.
continue;
} else {
// Jika artikel belum direkomendasikan kepada pengguna, artikel tersebut direkomendasikan.
sendRecommendMsg(docid);
// Jika artikel telah direkomendasikan, ID artikel dicatat dalam filter Bloom.
bf.add(userid, docid);
break;
}
}
}Mengoptimalkan sistem crawler berdasarkan TairBloom
TairBloom menyaring URL yang mungkin telah di-crawl untuk meningkatkan produktivitas. Pseudocode:
bool crawlerSystem( ) {
while (true) {
// Dapatkan URL yang ingin Anda crawl.
url = getURLFromQueue()
if (bf.exists(url_bloom, url)) {
// Jika URL mungkin telah di-crawl, URL dilewati.
continue;
} else {
// Crawl URL ini.
doDownload(url)
// Tambahkan URL ini ke filter Bloom.
bf.add(url_bloom, url);
}
}
}Praktik terbaik lainnya
Cara kerjanya
TairBloom adalah implementasi dari SBFs. Fiturnya mencakup skalabilitas dinamis sambil menjaga tingkat positif palsu yang stabil. SBFs adalah filter Bloom yang dioptimalkan. Bagian berikut menjelaskan prinsip dasar filter Bloom dan SBFs.
Filter Bloom
Filter Bloom adalah struktur data probabilistik yang hemat ruang, dibayangkan oleh Burton Howard Bloom pada tahun 1970, yang digunakan untuk menguji apakah sebuah elemen merupakan anggota dari suatu set.
Filter Bloom baru adalah larik bit dari m bit, semuanya disetel ke 0. Filter Bloom juga mencakup satu set fungsi hash k yang berbeda untuk menghasilkan distribusi acak seragam. k adalah konstanta yang kurang dari m. Saat Anda menambahkan elemen ke filter Bloom, fungsi hash k memetakan elemen-elemen ini ke k bit dalam larik bit dan menyetel k bit menjadi nilai 1. Dalam hal ini, satu bit dapat digunakan bersama oleh beberapa data. Gambar berikut menunjukkan cara memasukkan X1 dan X2 ke dalam filter Bloom yang mencakup 3 fungsi hash.
Saat Anda menanyakan elemen dalam filter Bloom, Anda dapat menggunakan fungsi hash k untuk mendapatkan k bit. Jika semua k bit memiliki nilai 1, elemen tersebut ada dalam filter Bloom. Sebaliknya, elemen tersebut tidak ada. Gambar berikut menunjukkan cara menanyakan Y1 dan Y2 dalam filter Bloom.
Gambar sebelumnya menunjukkan bahwa meskipun Y2 tidak pernah dimasukkan ke dalam filter Bloom, Y2 ditentukan ada dalam filter Bloom. Skenario ini menunjukkan bahwa filter Bloom memiliki tingkat positif palsu. Analisis sebelumnya menunjukkan bahwa filter Bloom memiliki fitur berikut:
Sebuah bit dapat digunakan bersama oleh beberapa data.
Filter Bloom memiliki tingkat positif palsu dan tingkat tersebut meningkat seiring dengan bertambahnya jumlah elemen dalam filter Bloom. Namun, filter Bloom tidak memiliki tingkat negatif palsu. Jika elemen ada dalam filter Bloom, elemen tersebut selalu ditentukan ada.
Elemen dapat ditambahkan ke filter Bloom tetapi tidak dapat dihapus dari filter Bloom. Alasannya adalah bit dapat digunakan bersama. Jika Anda menghapus elemen dari filter Bloom, elemen lain dalam filter Bloom terpengaruh.
Filter Bloom yang Dapat Diskalakan
Saat jumlah elemen meningkat, tingkat positif palsu juga meningkat. Jika Anda ingin mempertahankan tingkat positif palsu yang stabil, Anda harus menambah ukuran filter Bloom secara proporsional. Namun, ukuran tersebut tidak dapat ditingkatkan karena batasan struktural. SBFs muncul sebagai tanggapan atas masalah ini. SBFs adalah jenis baru filter Bloom yang menggabungkan beberapa filter Bloom menjadi satu.
Gambar berikut menunjukkan model dasar SBF. SBF ini memiliki dua lapisan: BF0 dan BF1. Awalnya, SBF hanya berisi lapisan BF0. Jika Anda memasukkan elemen a, b, dan c ke dalam SBF ini dan lapisan BF0 tidak cukup besar untuk mempertahankan tingkat positif palsu yang ditentukan, lapisan BF1 dibuat untuk meningkatkan ukuran SBF. Kemudian, elemen d, e, dan f dimasukkan ke lapisan BF1. Lapisan baru bernama BF2 dibuat jika lapisan BF1 juga tidak dapat mempertahankan tingkat positif palsu yang ditentukan. Untuk informasi lebih lanjut, lihat Filter Bloom yang Dapat Diskalakan.
PentingSelama penskalaan dinamis TairBloom, kapasitas lapisan baru adalah dua kali lipat dari lapisan sebelumnya, dan ruang memori yang ditempati adalah empat kali lipat dari lapisan sebelumnya.
Dengan setiap lapisan tambahan, beberapa filter Bloom mungkin perlu dilalui selama kueri. SBFs hanya menyisipkan data ke lapisan terakhir dan menanyakan data dari lapisan terakhir hingga lapisan BF0. Oleh karena itu, peningkatan skala TairBloom dapat mengakibatkan pembuatan kunci besar dan dapat menyebabkan penurunan kinerja, dengan tingkat penurunan meningkat seiring dengan bertambahnya jumlah elemen.
Dalam penggunaan aktual, kami sarankan Anda mempertimbangkan peningkatan skala TairBloom hanya sebagai tindakan pencegahan dan tidak sering melakukan peningkatan skala TairBloom. Pastikan memori yang cukup dicadangkan untuk instans untuk mencegah kegagalan tulis setelah Anda meningkatkan skala TairBloom, yang dapat menyebabkan operasi pengusiran data yang berkepanjangan dan menghambat pemrosesan permintaan.
Anda dapat menjalankan perintah
BF.INFOuntuk memeriksa apakah kunci akan memicu peningkatan skala. Saat jumlah item di lapisan terbaru sama dengan kapasitas, ini menunjukkan bahwa peningkatan skala akan segera terjadi.Jika kapasitas aktual melebihi batas yang telah ditentukan, Anda dapat meningkatkan skala TairBloom untuk memastikan operasi tulis untuk bisnis dapat dilakukan pada TairBloom untuk mencegah insiden langsung. Setelah Anda meningkatkan skala TairBloom, kami sarankan Anda segera membangun ulang untuk meningkatkan kinerja dan mengurangi risiko terkait peningkatan skala di masa depan.
Prasyarat
Instans Tair berbasis DRAM telah dibuat.
Versi minor terbaru menyediakan lebih banyak fitur dan stabilitas yang lebih tinggi. Kami sarankan Anda memperbarui instans Anda ke versi minor terbaru. Untuk informasi lebih lanjut, lihat Perbarui versi minor instans. Jika instans Anda adalah kluster atau pemisahan baca/tulis instans, kami sarankan Anda memperbarui node proxy dalam instans ke versi minor terbaru. Ini memastikan bahwa semua perintah dapat dijalankan sesuai harapan.
Peringatan
Data TairBloom yang ingin Anda kelola disimpan dalam instans Tair.
Kapasitas awal dan tingkat positif palsu yang memenuhi persyaratan Anda harus dihitung terlebih dahulu. Untuk membuat kunci TairBloom yang memiliki kapasitas jauh lebih dari 100 elemen, jalankan perintah
BF.RESERVEbukan perintahBF.ADD.Berikut ini menunjukkan perbedaan antara perintah
BF.ADDdan perintahBF.RESERVE:BF.ADD(juga dikenal sebagaiBF.MADD): Jika kunci TairBloom tidak ada saat perintah ini dijalankan, kunci tersebut dibuat secara otomatis. Kapasitas default kunci adalah 100, dan tingkat positif palsu default kunci adalah 0,01. Jika Anda memerlukan kapasitas kunci yang jauh lebih dari 100, Anda hanya dapat meningkatkan skala kunci untuk mendukung lebih banyak elemen.BF.RESERVE(juga dikenal sebagaiBF.INSERT): Kapasitas awal ditentukan saat perintah ini dijalankan. Perintah ini menentukan kapasitas awal di lapisan pertama kunci. Jika kunci berisi lebih sedikit lapisan filter Bloom, kecepatan kueri kunci lebih cepat.
CatatanSebagai contoh, asumsikan Anda ingin memasukkan 10.000.000 elemen ke dalam kunci dan mengizinkan tingkat positif palsu sebesar 0,01. Ukuran kunci yang dibuat adalah 176 MB jika Anda menggunakan perintah
BF.ADD, atau 16 MB jika Anda menggunakan perintahBF.RESERVE.Tabel berikut mencantumkan berbagai ukuran kunci yang didukung oleh perintah
BF.RESERVEdan kapasitas awal serta tingkat positif palsu yang sesuai.Kapasitas (jumlah elemen)
positif salah:0,01
positif salah:0,001
positif salah: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 Anda membuat kunci dengan kapasitas ultra-tinggi, Anda harus memperhatikan presisi tingkat kesalahan. Kunci dengan kapasitas ultra-tinggi dan presisi ultra-tinggi mungkin gagal dibuat karena memori instans tidak mencukupi.
Ukuran kunci tidak dapat dikurangi karena elemen hanya dapat ditambahkan tetapi tidak dapat dihapus dari kunci. Untuk mencegah masalah kapasitas seperti kesalahan memori habis (OOM), kami sarankan Anda menerapkan solusi berikut:
Pisahkan data bisnis. Anda dapat membagi data bisnis untuk mencegah kunci besar yang memengaruhi kinerja kueri. Jika kunci besar ada, sebagian besar permintaan dibuat ke instans yang berisi kunci-kunci ini. Hal ini dapat menyebabkan hotkeys atau bahkan permintaan yang tidak seimbang.
Anda dapat mendistribusikan data yang dipisahkan ke beberapa kunci. Jika data bisnis Anda disimpan dalam instans kluster Tair, Anda dapat mendistribusikan data yang dipisahkan ke beberapa node dalam instans untuk memastikan bahwa kunci besar dan hotkeys tidak terjadi.
Bangun ulang kunci secara berkala. Jika memungkinkan, Anda dapat menjalankan perintah
DELuntuk menghapus data dari kunci, lalu menyisipkan data dari database backend ke dalam kunci untuk mengelola ukuran kunci.Anda juga dapat membuat beberapa kunci untuk digunakan secara bergantian. Dengan cara ini, ukuran kunci tunggal tetap sesuai. Manfaat dari solusi ini adalah Anda hanya perlu membuat kunci sekali. Namun, beberapa kunci harus dibuat dan beberapa memori mungkin terbuang.
Perintah yang didukung
Tabel 1. Perintah TairBloom
Perintah | Sintaksis | Deskripsi |
| Membuat kunci TairBloom kosong dengan kapasitas dan tingkat positif palsu yang ditentukan. Parameter kapasitas menentukan kapasitas kunci dan parameter tingkat_kesalahan menentukan tingkat positif palsu kunci. | |
| Menambahkan elemen ke kunci TairBloom. | |
| Menambahkan beberapa elemen ke kunci TairBloom. | |
| Memeriksa apakah elemen ada dalam kunci TairBloom. | |
| Memeriksa apakah beberapa elemen ada dalam kunci TairBloom. | |
| Menambahkan beberapa elemen ke kunci TairBloom. Jika kunci tidak ada, Anda dapat menentukan apakah akan membuat kunci. Anda juga dapat menentukan kapasitas dan tingkat positif palsu kunci. | |
| Mengambil informasi tentang kunci TairBloom. Informasi tersebut mencakup jumlah lapisan, jumlah item di setiap lapisan, dan tingkat positif palsu. | |
| Menghapus satu atau lebih kunci TairBloom. Catatan Elemen yang sudah ditambahkan ke kunci tidak dapat dihapus. Anda dapat menjalankan perintah DEL untuk menghapus semua data dari kunci. |
Daftar berikut menjelaskan konvensi sintaksis perintah yang digunakan dalam topik ini:
Kata kunci huruf besar: menunjukkan kata kunci perintah.Teks miring: menunjukkan variabel.[opsi]: menunjukkan bahwa parameter yang terlampir dalam tanda kurung siku bersifat opsional. Parameter yang tidak dilampirkan dalam tanda kurung siku harus ditentukan.A|B: menunjukkan bahwa parameter yang dipisahkan oleh garis vertikal (|) saling eksklusif. Hanya satu dari parameter tersebut yang dapat ditentukan....: menunjukkan bahwa parameter sebelum simbol ini dapat diulang beberapa kali.
BF.RESERVE
Item | Deskripsi |
Sintaksis |
|
Kompleksitas waktu | O(1) |
Deskripsi perintah | Membuat kunci TairBloom kosong dengan kapasitas dan tingkat positif palsu yang ditentukan. Parameter kapasitas menentukan kapasitas kunci dan parameter tingkat_kesalahan menentukan tingkat positif palsu kunci. |
Parameter |
|
Output |
|
Contoh | Perintah contoh: Output contoh: |
BF.ADD
Item | Deskripsi |
Sintaksis |
|
Kompleksitas waktu | O(log N), di mana N menentukan jumlah lapisan filter Bloom. |
Deskripsi perintah | Menambahkan elemen ke kunci TairBloom. Catatan Jika kunci tidak ada, kunci dibuat secara otomatis. Kapasitas default kunci adalah 100, dan tingkat positif palsu default kunci adalah 0,01. |
Parameter |
|
Output |
|
Contoh | Perintah contoh: Output contoh: |
BF.MADD
Item | Deskripsi |
Sintaksis |
|
Kompleksitas waktu | O(log N), di mana N menentukan jumlah lapisan filter Bloom. |
Deskripsi perintah | Menambahkan beberapa elemen ke kunci TairBloom. Catatan Jika kunci tidak ada, kunci dibuat secara otomatis. Kapasitas default kunci adalah 100, dan tingkat positif palsu default kunci adalah 0,01. |
Parameter |
|
Output |
|
Contoh | Perintah contoh: Output contoh: |
BF.EXISTS
Item | Deskripsi |
Sintaksis |
|
Kompleksitas waktu | O(log N), di mana N menentukan jumlah lapisan filter Bloom. |
Deskripsi perintah | Memeriksa apakah elemen ada dalam kunci TairBloom. |
Parameter |
|
Output |
|
Contoh | Perintah contoh: Output contoh: |
BF.MEXISTS
Item | Deskripsi |
Sintaksis |
|
Kompleksitas waktu | O(log N), di mana N menentukan jumlah lapisan filter Bloom. |
Deskripsi perintah | Memeriksa apakah beberapa elemen ada dalam kunci TairBloom. |
Parameter |
|
Output |
|
Contoh | Perintah contoh: Output contoh: |
BF.INSERT
Item | Deskripsi |
Sintaksis |
|
Kompleksitas waktu | O(log N), di mana N menentukan jumlah lapisan filter Bloom. |
Deskripsi perintah | Menambahkan beberapa elemen ke kunci TairBloom. Jika kunci tidak ada, Anda dapat menentukan apakah akan membuat kunci. Anda juga dapat menentukan kapasitas dan tingkat positif palsu kunci. |
Parameter |
|
Output |
|
Contoh | Perintah contoh: Output contoh: |
BF.INFO
Item | Deskripsi |
Sintaksis |
|
Kompleksitas waktu | O(log N), di mana N menentukan jumlah lapisan filter Bloom. |
Deskripsi perintah | Mengambil informasi tentang kunci TairBloom. Informasi tersebut mencakup jumlah lapisan, jumlah item di setiap lapisan, dan tingkat positif palsu. |
Parameter |
|
Output |
|
Contoh | Perintah contoh: Output contoh: Parameter respons BF.INFO:
|