redis

کاربرد عملی مجموعه‌های مرتب‌شده (Sorted Sets) – پیاده‌سازی سیستم رتبه‌بندی کاربران

چکیده
در این مقاله، به بررسی یک کاربرد عملی از مجموعه‌های مرتب‌شده (Sorted Sets) در یک سناریوی کسب‌وکاری می‌پردازیم. با استفاده از یک مثال عینی در زمینه‌ی شبکه‌های اجتماعی و رتبه‌بندی کاربران بر اساس تعداد دنبال‌کنندگان، نحوه‌ی ایجاد، افزودن داده، و بازیابی اطلاعات از این ساختار داده را گام‌به‌گام بررسی خواهیم کرد. همچنین با دستورات کلیدی ZADD و ZRANGE و پارامترهای مهم آنها آشنا می‌شویم.

مقدمه
در سناریوهای واقعی، اغلب با داده‌هایی مواجه می‌شویم که هم شامل یک شناسه‌ی متنی (Member) و هم یک مقدار عددی (Score) هستند. برای مثال، در یک شبکه‌ی اجتماعی، هر کاربر دارای تعداد مشخصی دنبال‌کننده (Follower) است. اگر بخواهیم کاربران را بر اساس تعداد دنبال‌کنندگانشان رتبه‌بندی کنیم و به‌سرعت به اطلاعات دسترسی داشته باشیم، مجموعه‌های مرتب‌شده گزینه‌ی ایده‌آلی هستند.

شناسایی سناریوی مناسب برای Sorted Sets
فرض کنید داده‌های زیر را در اختیار داریم:

کاربر (Member)تعداد دنبال‌کنندگان (Score)
Adam10
Scott20
Amy30

حال این سوال مطرح می‌شود: آیا این داده‌ها برای ساختار مجموعه‌ی مرتب‌شده مناسب هستند؟

  • اگر فقط نام کاربران را داشتیم (بدون عدد)، مجموعه‌ی ساده (Set) کافی بود.
  • اما از آنجا که یک مقدار عددی (تعداد دنبال‌کنندگان) نیز به هر کاربر تعلق گرفته است و این مقدار می‌تواند مبنای رتبه‌بندی قرار گیرد، مجموعه‌ی مرتب‌شده (Sorted Set) بهترین انتخاب خواهد بود.

افزودن داده با دستور ZADD
برای افزودن داده به یک مجموعه‌ی مرتب‌شده، از دستور ZADD استفاده می‌کنیم. ساختار کلی این دستور به صورت زیر است:

ZADD key [options] score member [score member ...]

نکته‌ی بسیار مهم: ترتیب قرارگیری score و member الزامی است و ابتدا باید امتیاز (عدد) و سپس عضو (رشته) ذکر شود.

مثال عملی

ZADD users:followers 10 Adam 20 Scott 30 Amy

پس از اجرای این دستور، خروجی (integer) 3 نشان‌دهنده‌ی افزودن سه عضو جدید به مجموعه است.

خطای رایج: اشتباه در ترتیب Score و Member
اگر به‌اشتباه ابتدا Member و سپس Score را وارد کنیم:

ZADD users:followers Adam 10

با خطای زیر مواجه خواهیم شد:

(error) ERR value is not a valid float

این خطا نشان می‌دهد که دستور ZADD انتظار دارد اولین مقدار پس از کلید، یک عدد اعشاری (Float) باشد. بنابراین دقت در ترتیب پارامترها ضروری است.

پارامترهای اختیاری در ZADD
دستور ZADD از گزینه‌های متعددی پشتیبانی می‌کند که رفتار آن را در شرایط مختلف کنترل می‌کنند:

گزینهتوضیح
NXفقط اعضای جدید را اضافه کن. در صورت وجود عضو، به‌روزرسانی انجام نمی‌شود.
XXفقط اعضای موجود را به‌روزرسانی کن. عضو جدید اضافه نمی‌شود.
LTفقط در صورتی به‌روزرسانی کن که امتیاز جدید کمتر از امتیاز فعلی باشد.
GTفقط در صورتی به‌روزرسانی کن که امتیاز جدید بزرگتر از امتیاز فعلی باشد.
INCRامتیاز فعلی را به مقدار مشخص شده افزایش بده (عملیات اتمیک).

توجه: گزینه‌های NX، XX، LT و GT با یکدیگر متقابلاً منحصر‌به‌فرد (Mutually Exclusive) هستند و نمی‌توان آنها را همزمان استفاده کرد.

بازیابی داده با دستور ZRANGE
برای دریافت اعضای یک مجموعه‌ی مرتب‌شده، از دستور ZRANGE استفاده می‌کنیم. ساختار کلی آن به صورت زیر است:

ZRANGE key start stop [WITHSCORES]
  • start و stop: محدوده‌ی ایندکس‌های مورد نظر (مشابه لیست‌ها، از صفر شروع می‌شوند و -1 نشان‌دهنده‌ی آخرین عضو است).
  • WITHSCORES: پارامتر اختیاری که در صورت ذکر، امتیاز هر عضو نیز به همراه آن بازگردانده می‌شود.

مثال ۱: دریافت فقط اعضا (بدون امتیاز)

ZRANGE users:followers 0 -1

خروجی:

1) "Adam"
2) "Scott"
3) "Amy"

مثال ۲: دریافت اعضا به همراه امتیازها

ZRANGE users:followers 0 -1 WITHSCORES

خروجی:

1) "Adam"
2) "10"
3) "Scott"
4) "20"
5) "Amy"
6) "30"

همان‌طور که مشاهده می‌شود، با استفاده از پارامتر WITHSCORES، امتیاز هر عضو نیز در خروجی نمایش داده می‌شود. ترتیب خروجی به‌صورت member1, score1, member2, score2, ... است.

نکته‌ی مهم در مورد خروجی
دستور ZRANGE به‌طور پیش‌فرض فقط اعضا را بازمی‌گرداند. اگر نیاز به امتیازها دارید، حتماً باید از پارامتر WITHSCORES استفاده کنید. در غیر این صورت، امتیازها در خروجی نمایش داده نخواهند شد.

جمع‌بندی دستورات معرفی‌شده

دستورکاربرد
ZADD key score member [score member ...]افزودن یک یا چند عضو با امتیاز مشخص به مجموعه‌ی مرتب‌شده
ZRANGE key start stop [WITHSCORES]دریافت اعضای یک محدوده‌ی مشخص (با قابلیت نمایش امتیازها)

نتیجه‌گیری
در این مقاله، با یک سناریوی عملی از مجموعه‌های مرتب‌شده آشنا شدیم و نحوه‌ی استفاده از دستورات ZADD و ZRANGE را به‌صورت گام‌به‌گام بررسی کردیم. این ساختار داده، راه‌حلی کارآمد برای ذخیره‌سازی و رتبه‌بندی داده‌هایی است که هم نیاز به یکتایی (Uniqueness) و هم نیاز به ترتیب‌دهی بر اساس یک معیار عددی دارند. درک صحیح از ترتیب پارامترها و گزینه‌های موجود در این دستورات، از الزامات استفاده‌ی مؤثر از مجموعه‌های مرتب‌شده در پروژه‌های واقعی است. در بخش‌های بعدی، با عملیات‌های پیشرفته‌تری مانند افزایش اتمیک امتیازها (ZINCRBY) و بازیابی بر اساس محدوده‌ی امتیازی (ZRANGEBYSCORE) آشنا خواهیم شد.

Leave a Reply

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *