مقدمه
در سیستمهای پایگاهداده مانند ردیس (Redis)، گاهی نیاز داریم کلیدی را فقط در صورتی ایجاد کنیم که از قبل وجود نداشته باشد. این کاربرد بهویژه در سناریوهای قفلگذاری (Locking) و جلوگیری از تداخل دادهها اهمیت دارد. دستور SETNX
در ردیس این امکان را فراهم میکند.
دستور SETNX چیست؟
SETNX
مخفف SET if Not eXists است و برای تنظیم مقدار یک کلید تنها در صورتی استفاده میشود که آن کلید از قبل وجود نداشته باشد. این دستور دو مقدار بازگشتی دارد:
- ۱: اگر کلید وجود نداشته و مقدار با موفقیت تنظیم شده باشد.
- ۰: اگر کلید از قبل موجود باشد و مقدار جدید تنظیم نشود.
مثال عملی
برای درک بهتر، مراحل زیر را دنبال میکنیم:
۱. پاکسازی پایگاه داده:
ابتدا تمام کلیدهای موجود را پاک میکنیم تا محیطی تمیز داشته باشیم:
FLUSHDB
KEYS *
خروجی دستور KEYS *
باید خالی باشد، که نشاندهنده عدم وجود کلید در پایگاه داده است.
۲. ایجاد یک کلید جدید:
حال کلید num1
را با مقدار 100
ایجاد میکنیم:
SET num1 100
با دستور GET num1
میتوانیم مقدار کلید را بررسی کنیم.
۳. استفاده از SETNX روی کلید موجود:
حال اگر بخواهیم همان کلید را با مقدار جدید تنظیم کنیم:
SETNX num1 200
خروجی این دستور ۰ خواهد بود، زیرا کلید از قبل وجود دارد و مقدار جدید تنظیم نشده است. بررسی مجدد GET num1
مقدار 100
را نشان میدهد.
۴. استفاده از SETNX روی کلید جدید:
اکنون کلید جدیدی مانند num2
را امتحان میکنیم:
SETNX num2 200
این بار خروجی ۱ است و با GET num2
مقدار 200
را مشاهده میکنیم.
کاربردهای عملی
یکی از کاربردهای رایج SETNX
در سیستمهای احراز هویت است. بهعنوان مثال، میتوان تعداد تلاشهای ناموفق کاربر برای ورود به سیستم را پیگیری کرد:
SETNX user:1:login_attempts 1
اگر کلید user:1:login_attempts
وجود نداشته باشد، مقدار ۱
تنظیم میشود. در غیر این صورت، مقدار قبلی حفظ میشود. این مکانیزم برای جلوگیری از حملات brute-force مفید است.
نتیجهگیری
دستور SETNX
ابزاری قدرتمند در ردیس برای مدیریت شرایط رقابتی (Race Conditions) و ایجاد کلیدها بهصورت شرطی است. با استفاده از این دستور، میتوان از تداخل در عملیاتهای همزمان جلوگیری کرد و دادهها را با امنیت بیشتری مدیریت نمود. این ویژگی بهویژه در سیستمهای توزیعشرده و سناریوهای قفلگذاری کاربرد فراوانی دارد.