Redis: معاملات Redis

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

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

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

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

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

(1) MULTI: بدء معاملة

REDIS
MULTI
OK

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

REDIS
MULTI
OK

SET name "Alice"
QUEUED

SET age 25
QUEUED

EXEC
1) OK
2) OK

(3) DISCARD: إلغاء المعاملة

REDIS
MULTI
OK

SET name "Bob"
QUEUED

DISCARD
OK

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

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

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

REDIS
MULTI
OK

SET a 1
QUEUED

SET b 2
QUEUED

GET a
QUEUED

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

(2) الذرية

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

REDIS
MULTI
OK

SET a 1
QUEUED

SET b 2
QUEUED

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


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

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

(1) الاستخدام الأساسي

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

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

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

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

(2) تنفيذ القفل التفاؤلي

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

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

# العميل 2 (قبل أن ينفذ العميل 1 EXEC)
SET balance 800

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

(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

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

(1) برامج 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

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

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

7. ملاحظات مهمة

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

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

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


❓ أسئلة شائعة

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

📖 ملخص

📝 تمارين

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

8. الدرس التالي

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

Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%