معاملات 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 ينفذ القفل التفاؤلي. يراقب المفاتيح ويلغي المعاملة إذا تم تعديل أي مفتاح مراقَب。
س هل الأوامر في المعاملة تُنفذ ذريًا؟
ج نعم. يتم تنفيذ الأوامر في المعاملة بالتسلسل دون انقطاع من قبل أوامر أخرى。
📖 ملخص
- MULTI يبدأ معاملة، EXEC ينفذها، DISCARD يلغيها
- يتم وضع الأوامر في قائمة انتظار في المعاملة وتُنفذ بالتسلسل عند EXEC
- WATCH يوفر قفلًا تفاؤليًا، يراقب المفاتيح للتغييرات
- معاملات Redis لا تدعم التراجع
- للعمليات الذرية المعقدة، يُوصى باستخدام برامج Lua النصية
📝 تمارين
- تمرين المعاملة: استخدم MULTI/EXEC لتنفيذ أوامر متعددة
- تمرين القفل التفاؤلي: استخدم WATCH لتنفيذ قفل تفاؤلي بسيط
- تمرين برنامج Lua النصي: استخدم EVAL لتنفيذ برنامج Lua نصي
الدرس التالي
في الدرس التالي، سنتعلم استمرارية Redis، والتي تغطي طرق الاستمرارية RDB و AOF.



