معاملات Redis

تسمح معاملات Redis بتنفيذ أوامر متعددة كوحدة واحدة. يغطي هذا الدرس استخدام المعاملات والتحذيرات.

ما هي المعاملة؟

المعاملة هي مجموعة من الأوامر التي يتم تنفيذها بالتسلسل دون انقطاع من قبل أوامر أخرى.

MULTI → الأمر 1 → الأمر 2 → الأمر 3 → EXEC

الأوامر الأساسية

MULTI: بدء معاملة

REDIS
MULTI
OK

EXEC: تنفيذ المعاملة

REDIS
MULTI
OK

SET name "Alice"
QUEUED

SET age 25
QUEUED

EXEC
1) OK
2) OK

DISCARD: إلغاء المعاملة

REDIS
MULTI
OK

SET name "Bob"
QUEUED

DISCARD
OK

خصائص المعاملة

قائمة انتظار الأوامر

لا يتم تنفيذ الأوامر في المعاملة فورًا ولكن توضع في قائمة انتظار:

REDIS
MULTI
OK

SET a 1
QUEUED

SET b 2
QUEUED

GET a
QUEUED

EXEC
1) OK
2) OK
3) "1"

الذرية

الأوامر في المعاملة إما أن تنفذ جميعها أو لا ينفذ أي منها:

REDIS
MULTI
OK

SET a 1
QUEUED

SET b 2
QUEUED

EXEC
1) OK
2) OK
⚠️ ملاحظة: معاملات Redis لا تدعم التراجع. إذا فشل أمر داخل معاملة، يتم تنفيذ الأوامر الأخرى.

WATCH: القفل التفاؤلي

WATCH يراقب المفاتيح. إذا تم تعديل أي مفتاح مراقَب قبل تنفيذ المعاملة، يتم إلغاء المعاملة.

الاستخدام الأساسي

REDIS
# مراقبة مفتاح
WATCH mykey
OK

# بدء معاملة
MULTI
OK

# تعديل المفتاح
SET mykey "new_value"
QUEUED

# تنفيذ المعاملة
EXEC
(nil)  # يُرجع nil إذا تم إلغاء المعاملة (تم تعديل المفتاح)

تنفيذ القفل التفاؤلي

مثال:قفل تفاؤلي

BASH
# العميل 1
WATCH balance
GET balance
MULTI
SET balance 900
EXEC

# العميل 2 (قبل أن ينفذ العميل 1 EXEC)
SET balance 800
▶ جرّب الكود

حالات الاستخدام

1. خصم المخزون

مثال:إنقاص المخزون

BASH
# إنقاص المخزون (عملية ذرية)
MULTI
DECR stock:product:123
INCR sold:product:123
EXEC
▶ جرّب الكود

2. تحويل الأموال

مثال:تحويل

BASH
# تحويل: إرسال 100 من المستخدم أ إلى المستخدم ب
MULTI
DECRBY balance:user:a 100
INCRBY balance:user:b 100
EXEC
▶ جرّب الكود

3. العمليات الدفعية

مثال:تعيين دفعات

BASH
# تعيين مفاتيح متعددة
MULTI
SET user:1:name "Alice"
SET user:1:age 25
SET user:1:email "alice@example.com"
EXEC
▶ جرّب الكود

المعاملات مقابل البرامج النصية

برامج Lua النصية (موصى بها)

برامج Lua النصية أقوى من المعاملات، وتدعم المنطق الشرطي والحلقات:

REDIS
# عملية ذرية: الخصم فقط إذا كان الرصيد كافيًا
EVAL "
  local balance = tonumber(redis.call('GET', KEYS[1]) or 0)
  if balance >= tonumber(ARGV[1]) then
    redis.call('DECRBY', KEYS[1], ARGV[1])
    return 1
  else
    return 0
  end
" 1 balance:user:a 100

مقارنة المعاملة مقابل البرنامج النصي

الميزة معاملة Lua Script
الذرية
المنطق الشرطي
الحلقات
الأداء جيد أفضل
التعقيد بسيط أكثر تعقيدًا

ملاحظات مهمة

⚠️ لا يوجد تراجع: معاملات Redis لا تدعم التراجع. إذا فشل أمر، يتم تنفيذ الأوامر الأخرى.

⚠️ أخطاء الأوامر: أخطاء الصيغة تلغي المعاملة بأكملها. أخطاء وقت التشغيل لا تؤثر على الأوامر الأخرى.

💡 برامج Lua النصية موصى بها: للعمليات الذرية المعقدة، يُوصى باستخدام برامج Lua النصية.

❓ أسئلة شائعة

س هل تدعم معاملات Redis التراجع؟
ج لا. معاملات Redis لا تدعم التراجع. استخدم برامج Lua النصية إذا كنت تحتاج سلوك التراجع。
س ماذا يفعل WATCH؟
ج WATCH ينفذ القفل التفاؤلي. يراقب المفاتيح ويلغي المعاملة إذا تم تعديل أي مفتاح مراقَب。
س هل الأوامر في المعاملة تُنفذ ذريًا؟
ج نعم. يتم تنفيذ الأوامر في المعاملة بالتسلسل دون انقطاع من قبل أوامر أخرى。

📖 ملخص

📝 تمارين

  1. تمرين المعاملة: استخدم MULTI/EXEC لتنفيذ أوامر متعددة
  2. تمرين القفل التفاؤلي: استخدم WATCH لتنفيذ قفل تفاؤلي بسيط
  3. تمرين برنامج Lua النصي: استخدم EVAL لتنفيذ برنامج Lua نصي

الدرس التالي

في الدرس التالي، سنتعلم استمرارية Redis، والتي تغطي طرق الاستمرارية RDB و AOF.

100%