مقدمه

در سیستم‌های پایگاه‌داده مانند ردیس (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) و ایجاد کلیدها به‌صورت شرطی است. با استفاده از این دستور، می‌توان از تداخل در عملیات‌های همزمان جلوگیری کرد و داده‌ها را با امنیت بیشتری مدیریت نمود. این ویژگی به‌ویژه در سیستم‌های توزیع‌شرده و سناریوهای قفل‌گذاری کاربرد فراوانی دارد.

Categorized in: