Redis / المتوسط: صحة التطبيق والتنسيق / الدرس 10
الشيفرات المحدودة ودوال Redis
انقل قرار قراءة صغيراً للخادم مع حد التنفيذ وإعلان المفاتيح ودلالة الخطأ، وميز مخبأ الشيفرة عن نشر الدالة.
في هذه الصفحة
أهداف الدرس
- شرح ذرية الشيفرة وكلفة الحجب وترتيب التحقق.
- تحديد دورة EVAL والدوال وقيود المفاتيح.
يشغل التنفيذ الذري الخادم أيضاً
تقرأ Lua وتقرر تحديثاً صغيراً دون رحلة بينهما. التنفيذ ذري بالنسبة للآخرين، وتعيق الطويلة العمل. حد المدخل والحجم ولا تفحص مجموعة بلا حد. البيئة ليست إذن ملفات أو شبكة. لا تنشئ الذرية تراجعاً للكتابة قبل خطأ لاحق، فتحقق من المدخل والنوع أولاً.
تحقق من قرار مخزون صغير قبل كتابته الوحيدة
يتوقع المقطع مفتاحاً وكمية واحدة. يقبل مخزوناً صحيحاً صغيراً غير سالب وطلباً موجباً محدوداً ثم يخصم عند الكفاية. الحد مجال تعليمي لا دقة Lua لصحيح ضخم. لا EVAL أو تشغيل، والمتوقع ست من تسع وثلاث. تعود حالات الخطأ والنقص قبل الكتابة؛ ليست دفتراً أو قفلاً موزعاً.
local stock = tonumber(redis.call('GET', KEYS[1]))
local need = tonumber(ARGV[1])
if not stock or not need or stock < 0 or need <= 0
or stock ~= math.floor(stock) or need ~= math.floor(need)
or stock > 1000000 or need > 1000000 then
return redis.error_reply('INVALID_STOCK_INPUT')
end
if stock < need then return false end
return redis.call('DECRBY', KEYS[1], need)
مع9 و3 يتوقع6 دون شيفرة حية أو مفتاح أو إعداد، وتحتاج المفاتيح والمنح مراجعة.
افحص الفشل قبل ادعاء الثابت
لا يلغي خطأ بعد الكتابة السابق عادة. يختلف redis.call وpcall ولا يصبحان محرك تراجع. ليست عتبة الانشغال إلغاء آمناً آلياً بعد الكتابة. فضل خطوات صغيرة محددة وتعقيداً معروفاً. توسيع الأمر أو المفاتيح عشوائياً يوسع السلطة والكلفة خارج اللبنة المراجعة.
اختبر المجال المعلن منفصلاً عن التنفيذ
يختبر Python الشروط الحسابية دون أنواع Lua وجدولة Redis والرد. يرفض النقص والخطأ قبل الرصيد. يفيد للقاعدة ويحتاج الحقيقي النوع والتوجيه والمنح والدورة والتزامن. احفظ مصدر EVALSHA فقد يغيب المخبأ بعد التشغيل أو أحداثه، وليست البصمة نشراً دائماً.
def reserve_model(stock, need):
if type(stock) is not int or type(need) is not int:
raise ValueError('INVALID_STOCK_INPUT')
if not (0 <= stock <= 1000000 and 0 < need <= 1000000):
raise ValueError('INVALID_STOCK_INPUT')
return None if stock < need else stock - need
assert reserve_model(9, 3) == 6
assert reserve_model(2, 3) is None
يفحص الحساب فقط وتبقى Lua وسلوك Redis والمتانة غير منفذة.
افصل مخبأ EVAL وإدارة الدوال
توجد EVAL منذ2.6 والدوال منذ7.0 بدورة تحميل واستمرار مختلفة. النشر إداري لا ينفذه المقرر. تلزم المفاتيح والشق في Cluster ولا تخف وصولاً يعتمد البيانات عن التوجيه. قد تقيد الإدارة البرمجة. حدد الإصدار والحدود والتوافق وإعادة التحميل دون إعادة منفلتة أو شيفرة عشوائية.
الأخطاء الشائعة وإصلاحها
NOSCRIPT No matching script. Please use EVAL.
- لماذا يحدث؟
- افترض التطبيق وجود مخبأ EVALSHA دائماً.
- كيف تصلحه؟
- استخدم إعادة التحميل المراجعة دون تكرار أثر مجهول.
- كيف تتجنب تكراره؟
- احفظ المصدر والإصدار واختبر الفقد.
يترك خطأ الشيفرة تغييرات سابقة
- لماذا يحدث؟
- اختلطت الذرية بتراجع الخطأ.
- كيف تصلحه؟
- تحقق قبل الكتابة وأعد تصميم الفشل.
- كيف تتجنب تكراره؟
- اختبر الخطأ عند كل حد كتابة.
تؤخر الشيفرة البطيئة عملاء آخرين
- لماذا يحدث؟
- لم يحد العمل أو أهمل التعقيد.
- كيف تصلحه؟
- حد اللبنة بمراجعة.
- كيف تتجنب تكراره؟
- حد المدخل وتجنب المسح والدوران غير المحدود.
اختبر فهمك
1. لماذا يهم التحقق قبل التعديل داخل Lua ذرية؟
اعرض الحل المشروح
تمنع الذرية تداخل الأوامر الأخرى، لكنها لا تضمن التراجع عن كتابات سبقت خطأ لاحقاً. افحص مجال الوسائط ونوع المفتاح والحالة اللازمة أولاً، ثم نفذ أقل تعديل محدود. راجع كذلك أي مسار فشل بعد الكتابة الأولى؛ لا تساوِ استدعاء EVAL واحداً بدلالات معاملة SQL.
2. يعرف التطبيق SHA دون المصدر. ما الضعف التشغيلي؟
اعرض الحل المشروح
لن يستطيع التطبيق إعادة تحميل الشيفرة المفقودة بموثوقية بعد التشغيل أو أحداث دورة المخبأ. احفظ أثراً للمصدر المراجع وربطه بالإصدار، واستخدم معالجة العميل الموثقة لغياب الشيفرة. تعرف SHA المحتوى، لكنها لا تثبت أن كل خادم هدف حمله أو أن التطبيق يملك سلطة تحميله.
أهم ما تعلمته
- حد العمل الخادمي وتحقق قبل الكتابة.
- الذرية والتعافي ودورة النشر مختلفة.