全部产品
Search
文档中心

Tair (Redis® OSS-Compatible):Mitigasi masalah kunci hot spot dengan pemisahan baca/tulis

更新时间:Nov 10, 2025

Untuk mengurangi dampak dari volume tinggi permintaan baca terhadap kunci hot spot, aktifkan pemisahan baca/tulis dan tambahkan node read-only. Pendekatan ini mendistribusikan permintaan baca di seluruh node, mengurangi beban pada node utama, serta meningkatkan throughput dan stabilitas sistem secara keseluruhan.

Ikhtisar fungsi

Dalam arsitektur pemisahan baca/tulis, semua node read-only secara asinkron mereplikasi data dari node utama. Hal ini memberikan konsistensi akhir dengan latensi sinkronisasi data yang rendah. Namun, selama periode volume tulis yang tinggi, latensi sinkronisasi data dapat terjadi. Dalam kasus ini, aplikasi Anda harus mampu mentolerir data yang sedikit ketinggalan zaman. Contohnya meliputi skenario berikut:

  • Data yang di-cache: Cache HTML untuk halaman utama situs web yang diperbarui jarang.

  • Papan peringkat game: Papan peringkat per jam di mana penundaan pembaruan kecil tidak secara signifikan memengaruhi pengguna.

  • Data prakiraan cuaca: Pengguna sering meminta informasi cuaca, tetapi data tersebut diperbarui sesuai jadwal tetap.

Manfaat menambahkan node read-only

  • Mendistribusikan beban pada node utama: Node utama menangani 100% permintaan tulis dan 1/N permintaan baca, di mana N adalah jumlah total node. Sebagai contoh, jika Anda memiliki satu node utama dan tiga node read-only, N adalah 4. Ini mengurangi tekanan CPU, lalu lintas jaringan, dan overhead koneksi pada node utama.

  • Meningkatkan throughput sistem: Setiap node read-only dapat memproses permintaan baca secara independen. Kinerja baca keseluruhan meningkat secara linier. Secara ideal, menambahkan N node read-only dapat meningkatkan kinerja baca sebanyak N kali.

  • Mengurangi latensi tanggapan: Mendistribusikan permintaan baca di beberapa node mengurangi waktu antrian untuk permintaan individu.

Anda dapat mengaktifkan pemisahan baca/tulis untuk arsitektur standar (utama-replika) dan arsitektur kluster. Untuk arsitektur kluster, Anda dapat menambahkan node read-only yang sesuai untuk setiap shard data. Untuk informasi lebih lanjut tentang arsitektur, lihat Pemisahan Baca/Tulis.

Cara mengaktifkan

Prasyarat:

  • Instans diterapkan dalam mode cloud-native.

  • Instans adalah Redis Community Edition atau Tair (Enterprise Edition) instans yang dioptimalkan untuk memori atau instans yang dioptimalkan untuk memori persisten.

  • Instans memiliki kapasitas 1 GB atau lebih tinggi.

  • Instans adalah instans ketersediaan tinggi (HA).

Di halaman detail instans, di panel navigasi di sebelah kiri, klik Node Management, lalu aktifkan sakelar Read/write Splitting. Untuk informasi lebih lanjut, lihat Aktifkan Pemisahan Baca/Tulis.

Koneksi klien

Instans zona tunggal

Biasanya, instans dengan arsitektur pemisahan baca/tulis menyediakan satu titik akhir. Instans menggunakan komponen Proxy untuk routing. Anda tidak perlu memodifikasi kode Anda. Fitur ini siap digunakan langsung dari kotak. Untuk informasi lebih lanjut, lihat Tutorial Koneksi Klien.

Instans zona ganda

Untuk instans zona ganda dengan arsitektur pemisahan baca/tulis, instans menyediakan titik akhir terpisah untuk zona utama dan zona sekunder. Titik akhir untuk zona sekunder hanya digunakan untuk permintaan baca. Ini memungkinkan akses lokal dan mengurangi latensi permintaan baca.

Sebagai contoh, pertimbangkan instans di Hangzhou Zone I (zona utama) dan Hangzhou Zone J (zona sekunder).

  • Klien (Instance ECS) di Hangzhou Zone I dapat terhubung ke titik akhir zona utama untuk melakukan operasi baca dan tulis. Kode berikut memberikan contoh:

    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisPool;
    import redis.clients.jedis.JedisPoolConfig;
    
    public class MasterReadWrite {
        public static void main(String[] args) {
            JedisPoolConfig config = new JedisPoolConfig();
            config.setMaxIdle(200);
            config.setMaxTotal(300);
            config.setTestOnBorrow(false);
            config.setTestOnReturn(false);
    
            // Konfigurasikan titik akhir, port, dan kata sandi untuk zona utama.
            String host = "r-bp1vtq8tnrquy****pd.redis.rds.aliyuncs.com";
            int port = 6379;
            String password = "default:Passw***2";
        
            JedisPool pool = new JedisPool(config, host, port, 3000, password);
            Jedis jedis = null;
            try {
                jedis = pool.getResource();
                // Lakukan operasi. Kode berikut memberikan contoh.
                jedis.set("foo", "bar");
                System.out.println(jedis.get("foo"));
            }
            catch (Exception e) {
                // Tangani timeout atau pengecualian lainnya.
                e.printStackTrace();
            }
            finally {
                if (jedis != null) {
                    jedis.close();
                }
            }
            pool.destroy();    // Saat aplikasi keluar, panggil metode ini untuk menghapus sumber daya. Metode ini memutuskan klien dan melepaskan sumber daya.
        }
    }
  • Klien (Instance ECS) di Hangzhou Zone J dapat terhubung ke titik akhir zona sekunder untuk melakukan operasi baca saja. Untuk melakukan operasi tulis, klien masih harus terhubung ke titik akhir zona utama. Kode berikut memberikan contoh:

    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisPool;
    import redis.clients.jedis.JedisPoolConfig;
    
    public class ReplicaRead {
        public static void main(String[] args) {
            JedisPoolConfig config = new JedisPoolConfig();
            config.setMaxIdle(200);
            config.setMaxTotal(300);
            config.setTestOnBorrow(false);
            config.setTestOnReturn(false);
    
            // Konfigurasikan titik akhir, port, dan kata sandi untuk zona sekunder.
            String host = "r-bp1vtq8tnrquy****pd.redis.rds.aliyuncs.com";
            int port = 6379;
            String password = "default:Passw***2";
    
            JedisPool pool = new JedisPool(config, host, port, 3000, password);
            Jedis jedis = null;
            try {
                jedis = pool.getResource();
                // Lakukan operasi. Kode berikut memberikan contoh.
                System.out.println(jedis.get("foo"));
            }
            catch (JedisDataException e) {
                // Tangkap pengecualian untuk operasi tulis jika operasi tulis dilakukan secara tidak sengaja.
                e.getMessage();
            }
            catch (Exception e) {
                // Tangani timeout atau pengecualian lainnya.
                e.printStackTrace();
            }
            finally {
                if (jedis != null) {
                    jedis.close();
                }
            }
            pool.destroy();    // Saat aplikasi keluar, panggil metode ini untuk menghapus sumber daya. Metode ini memutuskan klien dan melepaskan sumber daya.
        }
    }