ريديس زكان

Rydys Zkan



التكرار على أعضاء مجموعة مصنفة

كما تعلمون جميعًا ، يتم اشتقاق مجموعات Redis المصنفة من المجموعات العادية حيث يتم ترتيب كل عضو من خلال قيمة درجاته بترتيب تصاعدي. إذا كان لدى عضوين أو أكثر نفس قيمة الدرجة ، فسيتم ترتيبهم بترتيب معجمي. عادة ، يمكن استرداد الأعضاء والنتائج مباشرة باستخدام أمر ZRANGE. عندما يكون لديك مجموعة كبيرة مرتبة مع الآلاف من الأعضاء ، فقد يحظر الأمر ZRANGE الخادم لفترة طويلة مثل أوامر SMEMBERS و KEYS وهو عيب. لذلك ، يقدم Redis أمرًا خاصًا يسمى ZSCAN وهو مشتق من أمر SCAN للتكرار على أعضاء المجموعة التي تم فرزها. نظرًا لأن أمر ZSCAN يرث من أمر SCAN ، فإن جميع السلوكيات تقريبًا هي نفس أمر SCAN للأغراض العامة.







كما في الشكل الموضح ، فإن أمر SCAN عبارة عن مكرر يعتمد على المؤشر. وبالتالي ، يتطلب الأمر تكرارًا واحدًا أو أكثر لتوفير جميع عناصر مجموعة Redis. نظرًا لأن أمر ZSCAN يرث من أمر SCAN الأصل ، فإن السلوك هو نفسه. في هذا الدليل ، ستتم مناقشة بناء الجملة وحالات الاستخدام الخاصة بأمر ZSCAN بالتفصيل.



قيادة ZSCAN

أمر ZSCAN هو مكرر يعتمد على المؤشر ويبدأ التكرار بالمؤشر 0. بعد ذلك ، في كل تكرار ، يقوم بإرجاع صفر أو أكثر من أعضاء المجموعة المصنفة جنبًا إلى جنب مع المؤشر التالي الذي يجب استخدامه كمؤشر لاستدعاء الأمر التالي. إذا كان المؤشر الذي تم إرجاعه يساوي 0 بعد تكرار واحد أو أكثر ، فهذا يعني أن عملية المسح قد انتهت. يتم إرجاع جميع أعضاء المجموعة التي تم فرزها في هذه المرحلة. هذه العملية تسمى التكرار الكامل. كما ترى ، يحافظ أمر ZSCAN على حالته فقط باستخدام مؤشر يؤدي إلى وعي محدود بالحالة. لذلك ، ترتبط العيوب التالية بأمر ZSCAN.



  • قد يعود نفس العنصر في تكرارات متعددة.
  • إذا لم يكن العضو موجودًا في بداية عملية المسح ، فهناك احتمال عدم إرجاع هذا العضو أثناء التكرار الكامل.

بالإضافة إلى ذلك ، لا يوجد ضمان على عدد الأعضاء الذين تم إرجاعهم. في بعض الحالات ، إذا كانت المجموعة التي تم فرزها صغيرة جدًا ، فقد يتم إرجاع جميع العناصر في التكرار الأول. لأن Redis يستخدم تنسيق ترميز حزمة تخصيص فردي خاص للاحتفاظ بالأعضاء حتى الوصول إلى الحد الأقصى لعدد العناصر. لا يستطيع أمر ZSCAN إرجاع المؤشر إلا إذا تم تمثيل بنية البيانات الممسوحة كجدول تجزئة.





بناء الجملة:
يستخدم الأمر ZSCAN نفس بناء الجملة تقريبًا مثل أمر SCAN باستثناء أنه يقبل مفتاح مجموعة تم فرزه باعتباره الوسيطة الأولى. صيغة الأمر مع الوسيطات المسموح بها هي كما يلي:

ZSCAN Sorted_set_key المؤشر [ نمط المباراة ] [ COUNT member_count ]

Sorted_set_key : مفتاح المجموعة التي تم فرزها.
المؤشر : تبدأ قيمة المؤشر من 0 وتنتهي عند 0 إذا كان تكرارًا كاملاً.



الوسيطات التالية اختيارية:

مباراة : نمط يتم مطابقته عند استرجاع العناصر في كل تكرار. يتم إرجاع الأعضاء المتطابقين فقط.
عدد : العدد التقريبي للأعضاء المراد إرجاعهم في كل تكرار.

تحتوي مجموعة النتائج التي تم إرجاعها لكل تكرار على عنصرين. الجزء الأول عبارة عن عدد صحيح بدون إشارة 64 بت يمثل المؤشر الذي سيتم تمريره إلى المكالمة التالية. الجزء التالي هو مجموعة من الأعضاء والنتائج المرتبطة.

حالة الاستخدام 1 - استرداد جميع الأعضاء ومهماتهم المكتملة من لعبة عبر الإنترنت

لنفترض أن شركة الألعاب عبر الإنترنت تحتفظ بلوحة صدارة باستخدام مجموعة Redis المصنفة. نظرًا لأن المستخدمين الهائلين يلعبون اللعبة بنشاط ، فهم بحاجة إلى طريقة لاسترداد كل لاعب والنتيجة المرتبطة به وهي عدد المهام المكتملة. من الضروري إجراء الاسترجاع دون حظر الخادم. لذا ، فإن التوصية هي استخدام أمر ZSCAN على النحو التالي:

أولاً ، نقوم بإنشاء مجموعة مرتبة مع بعض اللاعبين والعدد المكتمل من المهام.

زاد ليدر بورد 12 Player6: جون 4 Player2: ماري 22 Player1: باتل خمسة عشر لاعب: أحد عشر 23 Player5: آن 30 Player7: قاسية 23 Player12: آبي اثنين Player13: نيكي 6 Player9: جيريمي 7 Player45: كينا

الآن ، يمكننا التكرار على أعضاء المجموعة التي تم فرزها على النحو التالي:

ليدر بورد zscan 0

انتاج:

قيمة المؤشر هي 0 في مجموعة النتائج التي تم إرجاعها مما يعني أنه يتم إرجاع جميع الأعضاء في نهاية التكرار الأول. في هذه الحالة ، نظرًا لأن عدد الأعضاء صغير ، فإن Redis يمثل هؤلاء الأعضاء باستخدام ترميز معبأ بتخصيص فردي. لذلك ، حتى يتم الوصول إلى الحد الأقصى لحجم الحزمة أو عدد الأعضاء ، يقوم الأمر بإرجاع جميع الأعضاء في المجموعة التي تم فرزها. هذا يسمى التكرار الكامل. لأنه في نهاية التكرار الأول ، نتلقى جميع الأعضاء العشرة ونتائجهم. إذا كان لدينا المئات من الأعضاء ، فسيتم تمثيله كجدول تجزئة في الذاكرة. لذلك ، يتطلب الأمر عدة تكرارات لإعادة جميع الأعضاء.

يمكن استخدام المعلمة COUNT للحد من عدد الأعضاء الذين يتم إرجاعهم في التكرار. بشكل افتراضي ، يتم تعيين هذه الوسيطة على 10. إذا كانت المجموعة التي تم فرزها تتكون من مئات الأعضاء ، فسيتم تمثيلها بواسطة جدول تجزئة في الذاكرة. لذا ، فإن عدد الأعضاء الذين تم إرجاعهم يبلغ حوالي عشرة لكل تكرار. يتم تجاهل قيمة الوسيطة COUNT إذا كانت المجموعة التي تم فرزها صغيرة جدًا.

حالة الاستخدام 2 - جلب اللاعبين الذين يبدأ اسمهم بحرف 'J'

يمكن استخدام أمر ZSCAN لتصفية الأعضاء الذين تم إرجاعهم بناءً على تطابق النمط. في هذه الحالة ، يجب تحديد وسيطة MATCH.

دعنا نستخدم نفس المثال من حالة الاستخدام السابقة. الشرط هو جلب اللاعبين الذين تبدأ أسماؤهم بالحرف 'J'. إنه فقط لتنفيذ الميزة الرائعة التالية المتعلقة باللعبة. يمكن تحديد وسيطة MATCH على النحو التالي:

ليدر بورد zscan 0 مباراة * ي *

يجب أن يعيد هذا بشكل مثالي عضوين اسمه جيريمي وجون.

استنتاج

باختصار ، يتم استخدام أمر ZSCAN للتكرار على أعضاء وعشرات مجموعة Redis التي تم فرزها. يعمل هذا الأمر بنفس سلوك أمر SCAN ، فيما عدا أن أمر ZSCAN يقبل المفتاح set باعتباره الوسيطة الأولى. كما تمت مناقشته في حالات الاستخدام ، يمكن استخدام أمر ZSCAN بطرق مختلفة من خلال تحديد وسيطات MATCH و COUNT حيث يمكنك استرداد الأعضاء والنتائج المرتبطة التي تتطابق مع نمط معين وتحد من عدد الأعضاء المرتجعات لكل تكرار. بشكل عام ، يمكن أن يكون أمر ZSCAN مفيدًا عند استرداد أعضاء مجموعة تم فرزها دون حظر الخادم أو العميل.