در Redis و سیستم‌های توزیع‌شده، عملیات اتمی به عملیاتی گفته می‌شود که:

1. تعریف اتمی بودن:

  • یا کامل اجرا می‌شود یا اصلاً اجرا نمی‌شود (همه یا هیچ)
  • در میانه اجرا قابل قطع شدن نیست
  • تضمین می‌کند در محیط‌های چندنخی/توزیع‌شده، داده‌ها ناسازگار نمی‌شوند

2. مثال ملموس:

فرض کنید دو کاربر همزمان بخواهند موجودی یک کیف پول را تغییر دهند:

# موجودی اولیه
SET balance 100
  • غیراتمی (مشکل رقابتی):
  # کاربر 1: مقدار فعلی را می‌خواند (100)
  # کاربر 2: همزمان مقدار فعلی را می‌خواند (100)
  # هر دو 50 واحد کم می‌کنند
  # کاربر 1: SET balance 50
  # کاربر 2: SET balance 50
  # نتیجه نهایی: 50 (درحالی که باید 0 شود!)
  • اتمی (با INCRBY):
  # کاربر 1: INCRBY balance -50 → 50
  # کاربر 2: INCRBY balance -50 → 0
  # نتیجه صحیح: 0

3. چرا دستور GETSET اتمی است؟

  • تضمین می‌کند: بین خواندن مقدار قدیمی و نوشتن مقدار جدید، عملیات دیگری نمی‌تواند دخالت کند
  • مثال:
  GETSET counter 0

حتی اگر 1000 درخواست همزمان این دستور را اجرا کنند:

  • هر درخواست مقدار قبلی را دقیقاً یک بار می‌خواند
  • مقدار جدید حتماً ثبت می‌شود
  • هیچ داده‌ای گم نمی‌شود

4. مقایسه با پایگاه‌داده‌های رابطه‌ای:

  • در SQL معمولاً از تراکنش‌ها استفاده می‌شود
  • اما در Redis بسیاری از دستورات ذاتاً اتمی هستند (مثل INCR, GETSET, MSETNX)

5. کاربردهای حیاتی اتمی‌بودن:

  1. سیستم‌های پرداخت: جلوگیری از کسر مضاعف موجودی
  2. رای‌گیری: جلوگیری از شمارش تکراری آرا
  3. محدودیت نرخ API: ثبت دقیق درخواست‌ها
  4. مدیریت موجودی: جلوگیری از فروش بیش از حد کالا

6. مثال کاربردی در Redis:

# افزایش اتمی یک شمارنده
INCR page_views

# بازنشانی اتمی یک شمارنده
GETSET daily_visits 0

# تنظیم شرطی اتمی
SETNX lock:user123 true

نتیجه‌گیری: اتمی‌بودن در Redis یعنی شما می‌توانید مطمئن باشید عملیات در محیط‌های موازی به درستی و بدون تداخل اجرا می‌شوند، بدون نیاز به مکانیزم‌های قفل‌گذاری پیچیده.

Categorized in: