Redis ZSCAN

Redis Zscan



Sıralanmış Bir Kümenin Üyeleri Üzerinde Yineleme

Hepinizin bildiği gibi, Redis sıralı kümeleri, her üyenin artan sırada puan değerine göre sıralandığı normal kümelerden türetilir. İki veya daha fazla üye aynı puan değerine sahipse, sözlük sırasına göre sıralanır. Genellikle üyeler ve puanlar, ZRANGE komutu kullanılarak doğrudan alınabilir. Binlerce üyeli büyük bir sıralamalı kümeniz olduğunda, ZRANGE komutu SMEMBERS ve KEYS komutları gibi sunucuyu uzun süre bloke edebilir ki bu bir dezavantajdır. Bu nedenle Redis, sıralanmış bir kümenin üyeleri üzerinde yineleme yapmak için SCAN komutundan türetilen ZSCAN adlı özel bir komut sunar. ZSCAN komutu SCAN komutundan miras aldığı için hemen hemen tüm davranışlar genel amaçlı SCAN komutu ile aynıdır.







Verilen şekilde olduğu gibi, SCAN komutu imleç tabanlı bir yineleyicidir. Bu nedenle, bir Redis koleksiyonunun tüm öğelerini sağlamak için bir veya daha fazla yineleme gerekir. ZSCAN komutu üst SCAN komutundan miras aldığı için davranış aynıdır. Bu kılavuzda, ZSCAN komutunun sözdizimi ve kullanım durumları ayrıntılı olarak tartışılacaktır.



ZSCAN Komutu

ZSCAN komutu, yinelemeyi 0. imleçle başlatan imleç tabanlı bir yineleyicidir. Daha sonra, her yinelemede, aşağıdaki komut çağrısı için imleç olarak kullanılması gereken bir sonraki imleçle birlikte sıfır veya daha fazla sıralanmış küme üyesi döndürür. Döndürülen imleç bir veya daha fazla yinelemeden sonra 0 ise, tarama işleminin bittiği anlamına gelir. Tüm sıralanmış küme üyeleri bu noktada döndürülür. Bu işleme tam yineleme denir. Gördüğünüz gibi, ZSCAN komutu durumunu yalnızca sınırlı bir durum farkındalığına yol açan bir imleç kullanarak korur. Bu nedenle, aşağıdaki dezavantajlar ZSCAN komutuyla ilişkilidir.



  • Aynı öğe birden çok yinelemede dönebilir.
  • Tarama sürecinin başlangıcında bir üye yoksa, tam yineleme sırasında o üyeyi geri döndürmeme olasılığı vardır.

Ayrıca geri dönen üyelerin sayısı konusunda bir garanti yoktur. Bazı durumlarda, sıralanan küme çok küçükse, tüm üyeler ilk yinelemede döndürülebilir. Çünkü Redis, üyeleri maksimum öğe sayısına ulaşılana kadar tutmak için özel bir tek tahsisli paketlenmiş kodlama formatı kullanır. ZSCAN komutu, yalnızca taranan veri yapısı bir karma tablo olarak temsil ediliyorsa bir imleç döndürebilir.





Sözdizimi:
ZSCAN komutu, ilk argüman olarak sıralanmış bir set anahtarını kabul etmesi dışında, SCAN komutuyla hemen hemen aynı sözdizimini kullanır. İzin verilen bağımsız değişkenlerle komut sözdizimi aşağıdaki gibidir:

ZSCAN sorted_set_key imleç [ MAÇ deseni ] [ COUNT üye_sayısı ]

sort_set_key : Sıralanan kümenin anahtarı.
imleç : İmleç değeri 0'dan başlar ve tam bir yineleme ise 0'da biter.



Aşağıdaki argümanlar isteğe bağlıdır:

KİBRİT : Her yinelemede öğeler alınırken eşleştirilecek bir desen. Yalnızca eşleşen üyeler döndürülür.
SAYMAK : Her yinelemede döndürülecek yaklaşık üye sayısı.

Yineleme başına döndürülen sonuç kümesi birkaç öğe içerir. İlk kısım, sonraki çağrıya geçirilecek imleci temsil eden 64 bitlik işaretsiz bir tamsayıdır. Sonraki kısım, bir dizi üye ve ilişkili puanlardır.

Kullanım Durumu 1 – Bir Çevrimiçi Oyunun Tüm Üyelerini ve Tamamlanmış Görevlerini Alın

Bir çevrimiçi oyun şirketinin Redis sıralı setini kullanarak bir lider tablosu tuttuğunu varsayalım. Büyük kullanıcılar oyunu aktif olarak oynadığından, her oyuncuyu ve tamamlanan görevlerin sayısı olan ilgili puanlarını almak için bir yola ihtiyaçları vardır. Sunucuyu bloke etmeden alma işlemini gerçekleştirmek zorunludur. Bu nedenle tavsiye, ZSCAN komutunu aşağıdaki gibi kullanmaktır:

İlk olarak, bazı oyuncular ve tamamlanan görev sayısı ile sıralanmış bir set oluşturuyoruz.

zadd Lider Tablosu 12 Oyuncu6:John 4 Oyuncu2: Mary 22 Oyuncu1: Patel on beş Oyuncu: on bir 23 Oyuncu5:Ann 30 Oyuncu7: Sert 23 oyuncu12:abby iki Oyuncu13:Nicky 6 Oyuncu9:Jeremy 7 Oyuncu45:Kina

Şimdi, sıralanmış kümenin üyelerini aşağıdaki gibi yineleyebiliriz:

zscan Lider Tablosu 0

Çıktı:

Döndürülen sonuç kümesinde imleç değeri 0'dır; bu, tüm üyelerin ilk yinelemenin sonunda döndürüldüğü anlamına gelir. Bu durumda, üye sayısı az olduğu için Redis bu üyeleri tek tahsisli paketlenmiş kodlama kullanarak temsil eder. Bu nedenle, maksimum paket boyutuna veya üye sayısına ulaşılana kadar komut, sıralanan kümedeki tüm üyeleri döndürür. Buna tam yineleme denir. Çünkü ilk iterasyonun sonunda on üyenin hepsini ve puanlarını alıyoruz. Yüzlerce üyemiz varsa, bellekte bir karma tablo olarak temsil edilir. Bu nedenle, tüm üyeleri döndürmek için birkaç yineleme gerekir.

COUNT parametresi, bir yinelemede döndürülen üye sayısını sınırlamak için kullanılabilir. Varsayılan olarak, bu argüman 10'a ayarlanır. Sıralanan küme yüzlerce üyeden oluşuyorsa, bellekte bir karma tablo ile temsil edilir. Bu nedenle, döndürülen üye sayısı yineleme başına on civarındadır. Sıralanan küme çok küçükse, COUNT bağımsız değişkeninin değeri yok sayılır.

Kullanım Durumu 2 – Adı “J” Harfi ile Başlayan Oyuncuları Getirin

ZSCAN komutu, bir kalıp eşleşmesine göre döndürülen üyeleri filtrelemek için kullanılabilir. Bu durumda, KAÇINCI argümanı belirtilmelidir.

Önceki kullanım durumundan aynı örneği kullanalım. Adı “J” harfi ile başlayan oyuncuları getirmeniz gerekmektedir. Sadece oyunla ilgili bir sonraki harika özelliği uygulamaktır. KAÇINCI argümanı şu şekilde belirtilebilir:

zscan Lider Tablosu 0 kibrit * J *

Bu ideal olarak isimleri Jeremy ve John olan iki üyeyi döndürmelidir.

Çözüm

Özetle, ZSCAN komutu, Redis ile sıralanmış bir kümenin üyeleri ve puanları üzerinde yineleme yapmak için kullanılır. Bu komut, ZSCAN komutunun set anahtarını ilk argüman olarak kabul etmesi dışında SCAN komutuyla aynı şekilde davranır. Kullanım örneklerinde tartışıldığı gibi, ZSCAN komutu, belirli bir modelle eşleşen üyeleri ve ilişkili puanları alabileceğiniz ve yineleme başına döndürülen üye sayısını sınırlayabileceğiniz KAÇINCI ve SAYI bağımsız değişkenlerini belirterek farklı şekillerde kullanılabilir. Genel olarak, ZSCAN komutu, sunucu veya istemciyi engellemeden sıralanmış bir kümenin üyelerini alırken faydalı olabilir.