مقدمه

دستور SCAN در ردیس یک ابزار قدرتمند برای پیمایش کلیدهای پایگاه داده به صورت کارآمد و با مصرف بهینه منابع است. برخلاف دستور KEYS که می‌تواند در محیط‌های عملیاتی باعث مشکلات عملکردی شود، SCAN به صورت تدریجی و مبتنی بر cursor کار می‌کند.

مفاهیم پایه

مقایسه SCAN و KEYS

  • KEYS: تمام کلیدهای مطابق الگو را یکجا برمی‌گرداند – مناسب محیط‌های توسعه اما خطرناک در تولید
  • SCAN: کلیدها را به صورت صفحه‌بندی شده (paginated) بازمی‌گرداند – ایمن برای استفاده در محیط‌های عملیاتی

ساختار دستور SCAN

SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]

کاربرد عملی SCAN

مثال پایه

SCAN 0

خروجی:

1) "15"  # cursor بعدی
2) 1) "key:12"
   2) "key:8"
   3) "key:3"
   ...

استفاده از COUNT

برای کنترل تعداد کلیدهای بازگشتی در هر مرحله:

SCAN 0 COUNT 20

فیلتر کردن با MATCH

SCAN 0 MATCH "user:*"

فیلتر بر اساس نوع داده

SCAN 0 TYPE string

نکات پیشرفته

رفتار cursor

  • مقدار 0 نشان‌دهنده شروع پیمایش است
  • وقتی cursor به 0 برگردد، به معنای پایان پیمایش است
  • cursorها قابل پیش‌بینی نیستند و نباید ذخیره شوند

الگوریتم SCAN

  • از الگوریتمی استفاده می‌کند که تضمین می‌کند:
  • همه کلیدها حداقل یک بار دیده می‌شوند
  • ممکن است کلیدها بیش از یک بار ظاهر شوند
  • تعداد واقعی کلیدهای بازگشتی ممکن است با مقدار COUNT متفاوت باشد

مثال‌های کاربردی

پیمایش تمام کلیدها

SCAN 0
SCAN 15  # استفاده از cursor برگشتی از مرحله قبل

جستجوی کلیدهای خاص

SCAN 0 MATCH "cache:*" COUNT 100

جمع‌آوری آمار

# شمارش کلیدهای نوع hash
SCAN 0 TYPE hash | wc -l

بهترین روش‌ها

  1. همیشه در محیط تولید از SCAN به جای KEYS استفاده کنید
  2. برای مجموعه‌های بزرگ، مقدار COUNT را افزایش دهید (مثلاً 1000)
  3. از ترکیب MATCH و TYPE برای فیلتر کردن دقیق‌تر استفاده کنید
  4. cursorها را ذخیره نکنید – ممکن است بین درخواست‌ها تغییر کنند
  5. برای مجموعه‌های بسیار بزرگ، SCAN ممکن است همچنان زمان‌بر باشد

نتیجه‌گیری

دستور SCAN یک ابزار ضروری برای مدیریت کارآمد کلیدها در ردیس است. با درک صحیح از نحوه کار cursorها و پارامترهای مختلف این دستور، می‌توانید به صورت بهینه داده‌های خود را پیمایش و مدیریت کنید بدون آنکه بار غیرضروری بر روی سرور ایجاد شود.

Categorized in: