全部产品
Search
文档中心

Tair (Redis® OSS-Compatible):Gunakan filter Bloom untuk mengelola notifikasi push event game

更新时间:Jul 02, 2025

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.

  1. Terhubung ke instance Tair (Enterprise Edition).

  2. Buat filter Bloom bernama activity_popup menggunakan fungsi createBloom dalam contoh kode.

    Dalam contoh ini, filter Bloom diharapkan menyimpan 50.000 elemen dengan tingkat positif palsu sebesar 1%.

    Saran untuk Tingkat Positif Palsu

    Tingkat positif palsu adalah parameter kunci untuk filter Bloom. Positif palsu terjadi ketika elemen yang tidak ada dalam set salah diidentifikasi sebagai ada. Tingkat positif palsu yang lebih rendah menunjukkan akurasi filter Bloom yang lebih tinggi, tetapi memerlukan penggunaan memori yang lebih besar. Oleh karena itu, pengaturan tingkat positif palsu melibatkan kompromi antara efisiensi memori dan akurasi. Kami menyarankan Anda mengatur tingkat positif palsu berdasarkan kebutuhan bisnis Anda:

    • Tingkat Positif Palsu Rendah (0,01% atau lebih rendah): Dalam skenario bisnis di mana tingkat positif palsu rendah sangat penting, seperti sistem keamanan atau aplikasi keuangan, Anda dapat mengatur tingkat positif palsu menjadi 0,01% atau lebih rendah. Namun, ini mengorbankan penggunaan memori yang lebih tinggi.

    • Tingkat Positif Palsu Sedang (0,1% hingga 1%): Tingkat positif palsu ini merupakan kompromi yang masuk akal untuk sebagian besar skenario. Tingkat positif palsu ini memberikan keseimbangan yang baik antara efisiensi memori tinggi dan tingkat positif palsu rendah.

    • Tingkat Positif Palsu Tinggi (1% atau lebih tinggi): Dalam skenario bisnis di mana akurasi tidak kritis, seperti pra-pemuatan cache atau sistem rekomendasi, Anda dapat mengatur tingkat positif palsu menjadi 1% atau bahkan lebih tinggi. Dalam hal ini, ruang memori yang lebih sedikit digunakan, tetapi tingkat positif palsu tinggi.

  3. Ketika seorang pemain masuk, Anda dapat mendorong notifikasi kepada pemain tersebut menggunakan fungsi handlePopup dalam contoh kode.

    Sebelum melakukannya, Anda harus memeriksa apakah dorongan diperlukan menggunakan fungsi shouldShowPopup dalam 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:

Dependensi Maven dalam file pom.xml

Dalam contoh ini, Jedis 5.1.0 ditambahkan sebagai dependensi Maven dalam file pom.xml:

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>5.1.0</version>
</dependency>

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.