Topik ini menjelaskan cara mengelola notifikasi push event dalam operasi game menggunakan filter Bloom untuk mencegah notifikasi berulang kepada pemain. Topik ini juga mencakup cara terhubung ke instance Tair (Enterprise Edition) dan melakukan operasi pada filter Bloom menggunakan Jedis.
Informasi latar belakang
Dalam operasi game modern, pengembang game dan tim operasi sering meluncurkan berbagai event untuk meningkatkan popularitas pengguna, keterlibatan, atau laju pembayaran. Event tersebut biasanya didorong kepada pemain melalui jendela pop-up, pesan dalam game, dan tugas karakter non-pemain (NPC). Dalam lingkungan game yang kompleks, pengembang perlu memastikan efisiensi sistem sambil mengontrol frekuensi pendorongan notifikasi event untuk mencegah penurunan pengalaman pengguna akibat notifikasi berulang.
Dalam skenario ini, struktur data filter Bloom memberikan solusi efisien untuk mengontrol notifikasi pop-up berulang. Filter Bloom adalah struktur data probabilistik yang digunakan untuk menentukan apakah sebuah elemen merupakan anggota dari suatu set. Filter Bloom dengan cepat menentukan apakah sebuah elemen mungkin ada di dalam set atau pasti tidak ada di dalam set. Filter Bloom menawarkan kompleksitas ruang yang rendah dan kueri cepat, cocok untuk dataset besar. Namun, hasil positif palsu dapat terjadi, yang berarti seorang pengguna bisa melewatkan notifikasi.
Dalam skenario ini, filter Bloom lebih unggul dibandingkan struktur data lain dalam aspek berikut:
Efisiensi Tinggi: Filter Bloom menggunakan larik bit untuk menyimpan sejumlah besar data pengguna.
Penggunaan Memori Rendah: Dibandingkan dengan struktur data tradisional, filter Bloom menggunakan ruang secara signifikan lebih sedikit, terutama saat menyimpan status push jutaan pemain.
Skalabilitas: Filter Bloom bersifat skalabel dan sangat cocok untuk lingkungan terdistribusi berskala besar, seperti kluster Redis.
Filter Bloom yang disediakan oleh Tair (Enterprise Edition) kompatibel dengan filter Bloom Redis dan digunakan dengan cara yang sama.
Ikhtisar
Berikut ini adalah contoh kode tentang cara menggunakan filter Bloom untuk mengelola notifikasi push event game.
Terhubung ke instance Tair (Enterprise Edition).
Buat filter Bloom bernama
activity_popupmenggunakan fungsicreateBloomdalam contoh kode.Dalam contoh ini, filter Bloom diharapkan menyimpan 50.000 elemen dengan tingkat positif palsu sebesar 1%.
Ketika seorang pemain masuk, Anda dapat mendorong notifikasi kepada pemain tersebut menggunakan fungsi
handlePopupdalam contoh kode.Sebelum melakukannya, Anda harus memeriksa apakah dorongan diperlukan menggunakan fungsi
shouldShowPopupdalam contoh kode.Jika ID pemain tidak ditemukan dalam filter Bloom, berarti tidak ada notifikasi yang telah didorong kepada pemain. Dalam hal ini, Anda harus mendorong notifikasi kepada pemain dan memperbarui status push pemain menggunakan fungsi
updatePopupState.Jika ID pemain sudah ada dalam filter Bloom, pemain mungkin telah menerima notifikasi. Dalam hal ini, jangan dorong notifikasi lagi.
Contoh kode
Informasi berikut ini menjelaskan dependensi Jedis:
Contoh kode:
import redis.clients.jedis.*;
import redis.clients.jedis.UnifiedJedis;
public class TairBloomFilterDemo {
static HostAndPort hostAndPort=new HostAndPort("r-bp1y****svonly41srpd.redis.rds.aliyuncs.com", 6379); // Anda dapat memperoleh titik akhir dan nomor port instance di konsol.
static JedisClientConfig config=DefaultJedisClientConfig.builder().password ("tw:Da***3").build(); // Kata sandi akun instance.
static UnifiedJedis unifiedJedis = new UnifiedJedis(hostAndPort, config);
private static final String BLOOM_KEY = "activity_popup";
/**
* Buat kunci filter Bloom.
*/
public static void createBloom() {
try {
unifiedJedis.bfReserve(BLOOM_KEY, 0.01, 50000);
} catch (Exception e) {
e.printStackTrace(); // Tangani pengecualian seperti waktu habis koneksi.
}
}
/**
* Periksa apakah ID pemain tertentu sudah ada dalam filter Bloom.
*/
public static boolean shouldShowPopup(String playerId) {
try {
return !unifiedJedis.bfExists(BLOOM_KEY, playerId);
} catch (Exception e) {
e.printStackTrace(); // Tangani pengecualian seperti waktu habis koneksi.
return true;
}
}
/**
* Tambahkan ID pemain ke kunci filter Bloom.
*/
public static void updatePopupState(String playerId) {
try {
unifiedJedis.bfAdd(BLOOM_KEY, playerId);
} catch (Exception e) {
e.printStackTrace(); // Tangani pengecualian seperti waktu habis koneksi.
}
}
/**
* Dorong notifikasi ke ID pemain tertentu.
*/
public static void handlePopup(String playerId) {
if (shouldShowPopup(playerId)) {
// Dorong notifikasi.
System.out.println("Dorong notifikasi ke pemain: " + playerId);
// Perbarui status push.
updatePopupState(playerId);
} else {
System.out.println("Pemain" + playerId + "telah didorong");
}
}
public static void main(String[] args) {
createBloom();
// Anggaplah ID pemain adalah player123.
String playerId = "player123";
// Dorong notifikasi pada panggilan pertama.
handlePopup(playerId);
// Jangan dorong notifikasi pada panggilan kedua.
handlePopup(playerId);
}
}Contoh keluaran sukses:
Dorong notifikasi ke pemain123.
Notifikasi telah didorong ke pemain123.