Redis ZSCAN

Redis Zscan



Iterasi Anggota Himpunan Terurut

Seperti yang Anda semua tahu, himpunan Redis yang diurutkan berasal dari himpunan reguler di mana setiap anggota diurutkan berdasarkan nilai skornya dalam urutan menaik. Jika dua atau lebih anggota memiliki nilai skor yang sama, mereka diurutkan menurut urutan leksikografis. Biasanya member dan skor bisa langsung diambil menggunakan perintah ZRANGE. Ketika Anda memiliki kumpulan besar yang diurutkan dengan ribuan anggota, perintah ZRANGE mungkin memblokir server untuk waktu yang lama seperti perintah SMEMBERS dan KEYS yang merupakan kelemahan. Jadi, Redis menawarkan perintah khusus yang disebut ZSCAN yang diturunkan dari perintah SCAN untuk melakukan iterasi pada anggota himpunan yang diurutkan. Karena perintah ZSCAN mewarisi dari perintah SCAN, hampir semua perilaku sama dengan perintah SCAN tujuan umum.







Seperti pada gambar yang diberikan, perintah SCAN adalah iterator berbasis kursor. Oleh karena itu, dibutuhkan satu atau lebih iterasi untuk menyediakan semua item dari koleksi Redis. Karena perintah ZSCAN mewarisi dari perintah induk SCAN, perilakunya sama. Dalam panduan ini, sintaks dan kasus penggunaan perintah ZSCAN akan dibahas secara rinci.



Perintah ZSCAN

Perintah ZSCAN adalah iterator berbasis kursor yang memulai iterasi dengan kursor ke-0. Setelah itu, di setiap iterasi, ia mengembalikan nol atau lebih anggota set yang diurutkan bersama dengan kursor berikutnya yang harus digunakan sebagai kursor untuk panggilan perintah berikut. Jika kursor yang dikembalikan bernilai 0 setelah satu atau lebih iterasi, berarti proses pemindaian telah selesai. Semua anggota himpunan yang diurutkan dikembalikan pada saat ini. Proses ini disebut iterasi penuh. Seperti yang Anda lihat, perintah ZSCAN mempertahankan statusnya hanya menggunakan kursor yang mengarah ke kesadaran status terbatas. Oleh karena itu, kelemahan berikut terkait dengan perintah ZSCAN.



  • Elemen yang sama dapat kembali dalam beberapa iterasi.
  • Jika anggota tidak hadir pada awal proses pemindaian, ada kemungkinan untuk tidak mengembalikan anggota tersebut selama iterasi penuh.

Selain itu, tidak ada jaminan jumlah anggota yang dikembalikan. Dalam beberapa kasus, jika himpunan yang diurutkan sangat kecil, semua anggota mungkin dikembalikan pada iterasi pertama. Karena Redis menggunakan format pengkodean paket alokasi tunggal khusus untuk menahan anggota hingga jumlah item maksimum tercapai. Perintah ZSCAN hanya dapat mengembalikan kursor jika struktur data yang dipindai direpresentasikan sebagai tabel hash.





Sintaksis:
Perintah ZSCAN menggunakan sintaks yang hampir sama dengan perintah SCAN kecuali bahwa perintah tersebut menerima kunci set yang diurutkan sebagai argumen pertama. Sintaks perintah dengan argumen yang diizinkan adalah sebagai berikut:

ZSCAN diurutkan_set_kursor kunci [ pola PERTANDINGAN ] [ COUNT anggota_jumlah ]

diurutkan_set_kunci : Kunci dari set yang diurutkan.
kursor : Nilai kursor dimulai dari 0 dan berakhir pada 0 jika merupakan iterasi penuh.



Argumen berikut adalah opsional:

COCOK : Pola yang cocok saat mengambil elemen di setiap iterasi. Hanya anggota yang cocok yang dikembalikan.
MENGHITUNG : Perkiraan jumlah anggota yang akan dikembalikan dalam setiap iterasi.

Set hasil yang dikembalikan per iterasi berisi beberapa elemen. Bagian pertama adalah bilangan bulat tidak bertanda 64-bit yang mewakili kursor untuk diteruskan ke panggilan berikutnya. Bagian selanjutnya adalah susunan anggota dan skor terkait.

Kasus Penggunaan 1 – Ambil Semua Anggota dan Misi yang Selesai dari Game Online

Mari kita asumsikan bahwa perusahaan game online mempertahankan papan peringkat menggunakan set yang diurutkan Redis. Karena pengguna besar secara aktif memainkan permainan, mereka membutuhkan cara untuk mengambil setiap pemain dan skor terkait mereka yang merupakan jumlah misi yang diselesaikan. Ini adalah suatu keharusan untuk melakukan pengambilan tanpa memblokir server. Jadi, rekomendasinya adalah menggunakan perintah ZSCAN sebagai berikut:

Pertama, kami membuat set yang diurutkan dengan beberapa pemain dan jumlah misi yang diselesaikan.

zadd LeaderBoard 12 Pemain6: John 4 Pemain2: Maria 22 Pemain1: Patel limabelas Pemain: sebelas 23 Pemain5: Ann 30 Pemain7: Keras 23 Pemain12: abby dua Pemain13: Nicky 6 Pemain9: Jeremy 7 Pemain45:Kina

Sekarang, kita dapat mengulangi anggota himpunan yang diurutkan sebagai berikut:

zscan LeaderBoard 0

Keluaran:

Nilai kursor adalah 0 di set hasil yang dikembalikan yang berarti bahwa semua anggota dikembalikan pada akhir iterasi pertama. Dalam hal ini, karena jumlah anggotanya kecil, Redis mewakili anggota ini menggunakan pengkodean paket alokasi tunggal. Oleh karena itu, hingga ukuran paket maksimum atau jumlah anggota tercapai, perintah mengembalikan semua anggota dalam kumpulan yang diurutkan. Ini disebut iterasi penuh. Karena pada akhir iterasi pertama, kami menerima semua sepuluh anggota dan skor mereka. Jika kita memiliki ratusan anggota, itu direpresentasikan sebagai tabel hash di memori. Jadi, dibutuhkan beberapa iterasi untuk mengembalikan semua anggota.

Parameter COUNT dapat digunakan untuk membatasi jumlah anggota yang dikembalikan dalam sebuah iterasi. Secara default, argumen ini diset ke 10. Jika set yang diurutkan terdiri dari ratusan anggota, itu diwakili oleh tabel hash di memori. Jadi, jumlah anggota yang dikembalikan sekitar sepuluh per iterasi. Nilai argumen COUNT diabaikan jika kumpulan yang diurutkan terlalu kecil.

Use Case 2 – Ambil Pemain yang Namanya Dimulai dengan Huruf “J”

Perintah ZSCAN dapat digunakan untuk menyaring anggota yang dikembalikan berdasarkan kecocokan pola. Dalam hal ini, argumen MATCH harus ditentukan.

Mari kita gunakan contoh yang sama dari kasus penggunaan sebelumnya. Syaratnya adalah menjemput pemain yang namanya berawalan huruf “J”. Itu hanya untuk mengimplementasikan fitur keren berikutnya yang terkait dengan game. Argumen MATCH dapat ditentukan sebagai berikut:

zscan LeaderBoard 0 cocok * J *

Ini idealnya harus mengembalikan dua anggota yang namanya Jeremy dan John.

Kesimpulan

Singkatnya, perintah ZSCAN digunakan untuk mengulangi anggota dan skor dari set yang diurutkan Redis. Perintah ini berperilaku sama dengan perintah SCAN, kecuali bahwa perintah ZSCAN menerima set key sebagai argumen pertama. Seperti yang dibahas dalam kasus penggunaan, perintah ZSCAN dapat digunakan dengan cara yang berbeda dengan menentukan argumen MATCH dan COUNT di mana Anda dapat mengambil anggota dan skor terkait yang cocok dengan pola tertentu dan membatasi jumlah anggota yang dikembalikan per iterasi. Secara keseluruhan, perintah ZSCAN dapat berguna saat mengambil anggota dari kumpulan yang diurutkan tanpa memblokir server atau klien.