کاربرد عملی مجموعههای مرتبشده (Sorted Sets) – پیادهسازی سیستم رتبهبندی کاربران
چکیده
در این مقاله، به بررسی یک کاربرد عملی از مجموعههای مرتبشده (Sorted Sets) در یک سناریوی کسبوکاری میپردازیم. با استفاده از یک مثال عینی در زمینهی شبکههای اجتماعی و رتبهبندی کاربران بر اساس تعداد دنبالکنندگان، نحوهی ایجاد، افزودن داده، و بازیابی اطلاعات از این ساختار داده را گامبهگام بررسی خواهیم کرد. همچنین با دستورات کلیدی ZADD و ZRANGE و پارامترهای مهم آنها آشنا میشویم.
مقدمه
در سناریوهای واقعی، اغلب با دادههایی مواجه میشویم که هم شامل یک شناسهی متنی (Member) و هم یک مقدار عددی (Score) هستند. برای مثال، در یک شبکهی اجتماعی، هر کاربر دارای تعداد مشخصی دنبالکننده (Follower) است. اگر بخواهیم کاربران را بر اساس تعداد دنبالکنندگانشان رتبهبندی کنیم و بهسرعت به اطلاعات دسترسی داشته باشیم، مجموعههای مرتبشده گزینهی ایدهآلی هستند.
شناسایی سناریوی مناسب برای Sorted Sets
فرض کنید دادههای زیر را در اختیار داریم:
| کاربر (Member) | تعداد دنبالکنندگان (Score) |
|---|---|
| Adam | 10 |
| Scott | 20 |
| Amy | 30 |
حال این سوال مطرح میشود: آیا این دادهها برای ساختار مجموعهی مرتبشده مناسب هستند؟
- اگر فقط نام کاربران را داشتیم (بدون عدد)، مجموعهی ساده (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) آشنا خواهیم شد.