0Pricing
Lua Academy · درس

قواميس الذاكرة المشتركة

خزّن البيانات مؤقتًا بين العاملين باستخدام ngx.shared.DICT لعمليات بحث منخفضة الكمون

قواميس الذاكرة المشتركة درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Lua Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Lua Academy 4 دروس في المجموع.

ما هو ngx.shared.DICT؟

يمثل ngx.shared.DICT منطقة ذاكرة مشتركة يمكن لجميع عمليات عامل Nginx الوصول إليها. ويوفر عمليات get/set/incr بتعقيد O(1) للتخزين المؤقت والتنسيق.

تعريف الذاكرة المشتركة في nginx.conf

خصّص القواميس المشتركة باسم وحجم داخل كتلة http.

# nginx.conf
http {
  lua_shared_dict rate_limit 10m;
  lua_shared_dict cache      50m;
  lua_shared_dict locks      1m;
}

الحصول والتعيين الأساسيان

خزّن القيم واسترجعها مع مدة صلاحية اختيارية (بالجزء من الثانية؟)

-- content_by_lua_block
local cache = ngx.shared.cache
cache:set("greeting", "Hello, World!", 60)  -- expires in 60s
local val = cache:get("greeting")
ngx.say(val)  -- Hello, World!

الزيادة الذرية

تزيد dict:incr(key, delta, init, expiry) عدّادًا ذريًا. وتُهيّئه إلى init إذا لم يكن المفتاح موجودًا.

local rl = ngx.shared.rate_limit
local count = rl:incr("req:" .. ngx.var.remote_addr, 1, 0, 60)
if count > 100 then
  ngx.exit(429)  -- Too Many Requests
end

تحديد معدل الطلبات باستخدام الذاكرة المشتركة

يطبّق نمط incr محدِّدًا بسيطًا لمعدل الطلبات باستخدام نافذة منزلقة، وهو أحد أكثر أنماط OpenResty شيوعًا.

الحذف والتفريغ

تزيل dict:delete(key) مفتاحًا واحدًا. وتعلّم dict:flush_all() جميع المفاتيح على أنها منتهية الصلاحية (حذف كسول). أما dict:flush_expired(n) فتزيل المفاتيح منتهية الصلاحية فعليًا.

الإضافة الذرية

تعيّن dict:add(key, val, expiry) مفتاحًا فقط إذا لم يكن موجودًا من قبل، ما يجعلها مفيدة للقفل الموزع.

local locks = ngx.shared.locks
local ok, err = locks:add("my_lock", true, 5)  -- 5s lock
if not ok then
  ngx.say("Lock held, try later")
  return
end
-- critical section
-- locks:delete("my_lock")  -- release

تخطيط حجم الذاكرة المشتركة

لكل زوج مفتاح-قيمة تكلفة إضافية (~100 بايت). التقدير هو: size_mb * 1024^2 / avg_entry_size = max entries. راقب الاستخدام باستخدام dict:capacity() وdict:free_space().

إخلاء الذاكرة

عندما يمتلئ القاموس، تُخلي OpenResty أقدم الإدخالات لإفساح المجال. اضبط مدد صلاحية مناسبة للتحكم في سلوك الإخلاء.

التنسيق بين العمليات العاملة

بما أن جميع العمليات العاملة تتشارك القاموس نفسه، استخدم :add لانتخاب القائد و:incr للعدّادات العامة عبر جميع عمليات العامل.

القيود

لا تدعم القواميس المشتركة إلا القيم العددية المفردة (سلسلة نصية أو رقمًا أو قيمة منطقية). خزّن الجداول بعد تحويلها إلى JSON باستخدام cjson.

سؤال حول الذاكرة المشتركة

ماذا تفعل dict:incr(key, 1, 0, 60)؟

مراجعة: قواميس الذاكرة المشتركة

يوفر ngx.shared.DICT عمليات get/set/incr ذرية بتعقيد O(1) عبر جميع العمال. استخدمه لتحديد معدل الطلبات، والتخزين المؤقت، والقفل الموزع. واضبط مدد الصلاحية للتحكم في الإخلاء. وحوّل الجداول إلى JSON للتعامل مع القيم المعقدة.

الأسئلة الشائعة

هل درس «قواميس الذاكرة المشتركة» مجاني؟

نعم — نص درس «قواميس الذاكرة المشتركة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.

ماذا ستتعلم في «قواميس الذاكرة المشتركة»؟

خزّن البيانات مؤقتًا بين العاملين باستخدام ngx.shared.DICT لعمليات بحث منخفضة الكمون تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟

لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «قواميس الذاكرة المشتركة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟

نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. بنية OpenResty
  2. معالجة طلبات HTTP في Lua
  3. ‏Cosockets وTCP غير الحاجب
  4. قواميس الذاكرة المشتركة
← العودة إلى Lua Academy