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.
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 |
|
|
|
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.
Tambahkan konfigurasi pom.xml.
<dependency> <groupId>com.aliyun.tair</groupId> <artifactId>alibabacloud-tairjedis-sdk</artifactId> <version>5.3.1</version> </dependency>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_user17#2#6#16#22#100menunjukkan bahwa skor diperbarui menjadi 100 pada pukul 16:22 tanggal 6 minggu kedua Juli.7#2#6#16#22_user1menunjukkan 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: Keluaran: |
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: Keluaran: |
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: Keluaran: Perintah: Keluaran: |
Papan peringkat mingguan. Sebagai contoh, Anda dapat menanyakan papan peringkat untuk minggu kedua Juli. | Perintah: Keluaran: |
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: Keluaran: Perintah: Keluaran: |
Medali emas
Medali perak
Medali perunggu