در 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. کاربردهای حیاتی اتمیبودن:
- سیستمهای پرداخت: جلوگیری از کسر مضاعف موجودی
- رایگیری: جلوگیری از شمارش تکراری آرا
- محدودیت نرخ API: ثبت دقیق درخواستها
- مدیریت موجودی: جلوگیری از فروش بیش از حد کالا
6. مثال کاربردی در Redis:
# افزایش اتمی یک شمارنده
INCR page_views
# بازنشانی اتمی یک شمارنده
GETSET daily_visits 0
# تنظیم شرطی اتمی
SETNX lock:user123 true
نتیجهگیری: اتمیبودن در Redis یعنی شما میتوانید مطمئن باشید عملیات در محیطهای موازی به درستی و بدون تداخل اجرا میشوند، بدون نیاز به مکانیزمهای قفلگذاری پیچیده.