全部产品
Search
文档中心

Tair (Redis® OSS-Compatible):Implementasikan papan peringkat multidimensi menggunakan exZset

更新时间:Nov 10, 2025

exZset adalah struktur data yang dikembangkan oleh Alibaba Cloud untuk mengurutkan skor bertipe double hingga 256 dimensi.

Informasi latar belakang

Struktur data Redis Sorted Set (Zset) asli hanya mendukung pengurutan berdasarkan skor bertipe double dalam satu dimensi, sehingga sulit untuk mengimplementasikan pengurutan multidimensi. Sebagai contoh, Anda dapat menggunakan standar IEEE 754 untuk menggabungkan data skor guna mencapai pengurutan multidimensi. Namun, metode ini memiliki keterbatasan seperti kompleksitas implementasi, penurunan presisi, dan ketidakmampuan untuk menggunakan perintah ZINCRBY.

Fitur exZset

Struktur data exZset, yang dikembangkan oleh Alibaba Cloud, memudahkan pengurutan multidimensi dengan keunggulan berikut dibandingkan solusi tradisional:

  • Mendukung pengurutan skor bertipe double hingga maksimal 256 dimensi, dengan prioritas pengurutan dari kiri ke kanan.

    Untuk skor multidimensi, skor di sebelah kiri memiliki prioritas lebih tinggi daripada skor di sebelah kanan. Sebagai contoh, pertimbangkan skor tiga dimensi: score1#score2#score3. Ketika exZset membandingkan skor, ia pertama-tama membandingkan score1. Jika nilai score1 sama, ia membandingkan score2. Jika tidak, hasil perbandingan score1 menjadi hasil akhir untuk seluruh skor. Demikian juga, ia hanya membandingkan score3 jika nilai score2 sama. Jika semua skor dimensi identik, elemen diurutkan berdasarkan urutan ASCII mereka.

    Untuk mempermudah pemahaman, Anda bisa membayangkan simbol pagar (#) sebagai titik desimal (.). Sebagai contoh, hubungan antara 0#99, 99#90, dan 99#99 dapat dipahami sebagai 0.99 < 99.90 < 99.99. Ini berarti 0#99 < 99#90 < 99#99.

  • Mendukung perintah EXZINCRBY, sehingga Anda tidak perlu lagi mengambil data saat ini, menambahkan nilai secara lokal, dan kemudian menulis hasil gabungan kembali ke Tair.

  • Menyediakan API yang mirip dengan Zset asli.

  • Menyediakan kemampuan untuk papan peringkat standar dan papan peringkat arsitektur terdistribusi .

  • Menyediakan klien TairJedis open source. Tidak diperlukan enkapsulasi pengkodean atau dekoding. Anda juga dapat merujuk pada kode sumber terbuka untuk mengimplementasikan enkapsulasi dalam bahasa lain.

Catatan

Untuk informasi lebih lanjut tentang perintah exZset yang disebutkan dalam topik ini, lihat exZset.

Skenario

Pengurutan merupakan kebutuhan umum dalam papan peringkat game, aplikasi, dan tabel medali. Persyaratan bisnis umum untuk pengurutan meliputi hal-hal berikut:

  • Dukungan untuk operasi buat, baca, perbarui, hapus (CRUD), pengurutan terbalik, dan kueri anggota berdasarkan rentang skor tertentu.

  • Pengambilan cepat hasil pengurutan.

  • Skalabilitas untuk mengimplementasikan papan peringkat terdistribusi . Beban kerja dapat dialihkan ke shard data lain ketika shard data saat ini memiliki penyimpanan atau daya komputasi yang tidak mencukupi.

Implementasikan tabel medali

Dalam papan peringkat medali, peserta diurutkan berdasarkan jumlah medali emas, perak, dan perunggu. Mereka pertama kali diurutkan berdasarkan jumlah medali emas. Jika jumlah medali emas sama, mereka diurutkan berdasarkan jumlah medali perak. Jika jumlah medali perak juga sama, mereka diurutkan berdasarkan jumlah medali perunggu. Dalam contoh ini, Peserta E dan F memiliki jumlah medali emas yang sama, tetapi Peserta E memiliki lebih banyak medali perak daripada Peserta F. Oleh karena itu, Peserta E berperingkat lebih tinggi. Dengan kemampuan pengurutan multidimensi exZset, Anda dapat memenuhi persyaratan ini menggunakan API sederhana.

Peringkat

Peserta

金牌Medali emas

银牌Medali perak

铜牌Medali perunggu

1

A

32

21

16

2

B

25

29

21

3

C

20

7

12

4

D

14

4

16

5

E

13

21

18

6

F

13

17

14

Contoh kode

Solusi ini memerlukan klien TairJedis, yang dikembangkan oleh Tair.

  1. Tambahkan konfigurasi pom.xml.

            <dependency>
                <groupId>com.aliyun.tair</groupId>
                <artifactId>alibabacloud-tairjedis-sdk</artifactId>
                <version>5.3.1</version>
            </dependency>
  2. Kode sampel.

    import io.valkey.JedisPool;
    import io.valkey.JedisPoolConfig;
    import com.aliyun.tair.tairzset.LeaderBoard;
    
    public class LeaderBoardExample {
        // Konfigurasikan endpoint instans, nomor port, kata sandi, dan informasi lainnya.
        private static final int DEFAULT_CONNECTION_TIMEOUT = 5000;
        private static final int DEFAULT_SO_TIMEOUT = 2000;
        private static final String HOST = "<r-bp1mx0ydsivrbp****.redis.rds.aliyuncs.com>";
        private static final int PORT = 6379;
        private static final String PASSWORD = "<Pass****word>";
        private static final JedisPoolConfig config = new JedisPoolConfig();
    
        public static void main(String[] args) {
            JedisPool jedisPool = new JedisPool(config, HOST, PORT, DEFAULT_CONNECTION_TIMEOUT,
                    DEFAULT_SO_TIMEOUT, PASSWORD, 0, null);
    
            // Buat papan peringkat.
            LeaderBoard lb = new LeaderBoard("leaderboard", jedisPool, 10, true, false);
    
            // Jika jumlah medali emas sama, urutkan berdasarkan jumlah medali perak. Jika jumlah medali perak juga sama, urutkan berdasarkan jumlah medali perunggu.
            //                    Emas Perak Perunggu
            lb.addMember("A",     32,  21, 16);
            lb.addMember("D",     14,  4,  16);
            lb.addMember("C",     20,  7,  12);
            lb.addMember("B",     25,  29, 21);
            lb.addMember("E",     13,  21, 18);
            lb.addMember("F",     13,  17,  14);
    
            // Dapatkan peringkat A.
            lb.rankFor("A"); // 1
            System.out.println(lb.rankFor("A"));
    
            // Dapatkan 3 teratas.
            lb.top(3);
            System.out.println(lb.top(3));
            // [{"member":"A","score":"32#21#16","rank":1}, 
            // {"member":"B","score":"25#29#21","rank":2}, 
            // {"member":"C","score":"20#7#12","rank":3}]
    
            // Dapatkan seluruh papan peringkat.
            lb.allLeaders();
            System.out.println(lb.allLeaders());
            // [{"member":"A","score":"32#21#16","rank":1}, 
            // {"member":"B","score":"25#29#21","rank":2}, 
            // {"member":"C","score":"20#7#12","rank":3}, 
            // {"member":"D","score":"14#4#16","rank":4}, 
            // {"member":"E","score":"13#21#18","rank":5}, 
            // {"member":"F","score":"13#17#14","rank":6}]
        }
    } 

    Untuk informasi lebih lanjut tentang operasi, lihat bagian com.aliyun.tair.tairzset.LeaderBoard dalam dokumentasi alibabacloud-tairjedis-sdk.

Gunakan TairZset untuk mengimplementasikan papan peringkat berdasarkan jam, hari, minggu, bulan, atau waktu nyata

Jika Anda ingin mengimplementasikan papan peringkat bulanan untuk sebuah key, informasi bulan harus digunakan sebagai indeks.

Papan peringkat berbagai rentang waktu dapat diimplementasikan menggunakan pengindeksan multi-level yang disediakan oleh struktur data TairZset. Dalam contoh ini, semua data bulan disimpan dalam sebuah key bernama julyZset. Kode berikut menunjukkan cara menulis data sampel ke key tersebut:

EXZINCRBY julyZset 7#2#6#16#22#100 7#2#6#16#22_user1
EXZINCRBY julyZset 7#2#6#16#22#50 7#2#6#16#22_user2
EXZINCRBY julyZset 7#2#6#16#23#70 7#2#6#16#23_user1
EXZINCRBY julyZset 7#2#6#16#23#80 7#2#6#16#23_user1
Catatan
  • 7#2#6#16#22#100 menunjukkan bahwa skor diperbarui menjadi 100 pada pukul 16:22 tanggal 6 minggu kedua Juli.

  • 7#2#6#16#22_user1 menunjukkan pengguna yang skornya diperbarui pada saat itu. Awalan waktu ditambahkan ke nama pengguna.

Jenis Papan Peringkat

Perintah dan Keluaran

Papan peringkat waktu nyata per jam. Jenis papan peringkat ini mencakup anggota yang skornya diperbarui dalam satu jam sebelum waktu saat ini. Sebagai contoh, jika waktu saat ini adalah 16:23, papan peringkat mencakup anggota yang skornya diperbarui dalam rentang 15:23 hingga 16:23.

Catatan

Jika hasil peringkat sering diakses, kami sarankan Anda menyimpan cache hasil peringkat.

Perintah:

EXZREVRANGEBYSCORE julyZset 7#2#6#16#23#0 7#2#6#15#23#0

Keluaran:

1) "7#2#6#16#22_user1"
2) "7#2#6#16#22_user2"

Papan peringkat untuk jam tertentu. Sebagai contoh, Anda dapat menanyakan papan peringkat yang mencakup anggota yang skornya diperbarui dalam rentang waktu 16:00 hingga 17:00.

Perintah:

EXZREVRANGEBYSCORE julyZset 7#2#6#17#0#0 7#2#6#16#0#0

Keluaran:

1) "7#2#6#16#22_user1"
2) "7#2#6#16#22_user2"

Papan peringkat harian. Sebagai contoh, Anda dapat menanyakan papan peringkat yang datanya dihasilkan pada 5 Juli.

Sebelum penanyaaan, gunakan perintah berikut untuk menyisipkan catatan data yang dihasilkan pada 5 Juli:

EXZINCRBY julyZset 7#2#5#10#23#70 7#2#5#10#23_user1

Keluaran:

"7#2#5#10#23#70"

Perintah:

EXZREVRANGEBYSCORE julyZset 7#2#6#0#0#0 7#2#5#0#0#0

Keluaran:

1) "7#2#5#10#23_user1"

Papan peringkat mingguan. Sebagai contoh, Anda dapat menanyakan papan peringkat untuk minggu kedua Juli.

Perintah:

EXZREVRANGEBYSCORE julyZset 7#3#0#0#0#0 7#2#0#0#0#0

Keluaran:

1) "7#2#6#16#22_user1"
2) "7#2#6#16#22_user2"
3) "7#2#5#10#23_user1"

Papan peringkat bulanan. Sebagai contoh, Anda dapat menanyakan papan peringkat Juli.

Sebelum penanyaaan, gunakan perintah berikut untuk menyisipkan catatan data yang dihasilkan pada 20 Juli:

EXZINCRBY julyZset 7#4#20#12#20#50 7#4#20#12#20_user1

Keluaran:

"7#4#20#12#20#50"

Perintah:

EXZREVRANGEBYSCORE julyZset 7#6#0#0#0#0 7#0#0#0#0#0

Keluaran:

1) "7#4#20#12#20_user1"
2) "7#2#6#16#22_user1"
3) "7#2#6#16#22_user2"
4) "7#2#5#10#23_user1"