0Pricing
Lua Academy · درس

التخزين المؤقت بالاعتماد على الإغلاقات

خزّن نتائج الدوال المكلفة مؤقتًا داخل جدول تحتفظ به الإغلاقة

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

ما التخزين المؤقت للنتائج؟

يخزّن التخزين المؤقت للنتائج نتائج استدعاءات الدوال المكلفة، بحيث تُرجع الاستدعاءات المتكررة بالوسيطات نفسها النتيجة المخزنة فورًا.

غلاف تخزين مؤقت أساسي

يحتفظ إغلاق بجدول cache. عند الاستدعاء الأول، يُحسب الناتج ويُخزّن. وعند الاستدعاءات اللاحقة، تُرجع القيمة المخزنة.

local function memoize(fn)
  local cache = {}
  return function(x)
    if cache[x] == nil then
      cache[x] = fn(x)
    end
    return cache[x]
  end
end

فيبوناتشي مع التخزين المؤقت

يؤدي استخدام التخزين المؤقت لدالة فيبوناتشي العودية إلى خفض تعقيدها الزمني من أُسّي إلى خطي.

local fib
fib = memoize(function(n)
  if n <= 1 then return n end
  return fib(n-1) + fib(n-2)
end)
print(fib(30))  -- 832040 (fast!)

التخزين المؤقت لعدة وسائط

بالنسبة إلى الدوال ذات الوسائط المتعددة، كوّنوا سلسلة مفتاح للتخزين المؤقت من جميع الوسائط.

local function memoize2(fn)
  local cache = {}
  return function(a, b)
    local key = a .. "," .. b
    if cache[key] == nil then cache[key] = fn(a, b) end
    return cache[key]
  end
end

جداول التخزين المؤقت المتداخلة

بالنسبة إلى أنواع الوسائط المختلطة، استخدموا جداول متداخلة مفهرسة بكل وسيط لإجراء بحث بزمن O(1) من دون تحويل إلى سلسلة.

local function nestedMemo(fn)
  local cache = {}
  return function(a, b)
    cache[a] = cache[a] or {}
    if cache[a][b] == nil then cache[a][b] = fn(a, b) end
    return cache[a][b]
  end
end

إبطال التخزين المؤقت

يفترض التخزين المؤقت أن الدوال نقية (من دون آثار جانبية، وتعطي الناتج نفسه للإدخال نفسه). ولا ينبغي تطبيق التخزين المؤقت على الدوال ذات الآثار الجانبية من دون إبطال دقيق للتخزين المؤقت.

التخزين المؤقت المستند إلى TTL

أضيفوا منطق مدة الصلاحية باستخدام os.time() لإبطال الإدخالات المخزنة مؤقتًا.

local function memoizeTTL(fn, ttl)
  local cache = {}
  return function(x)
    local entry = cache[x]
    if entry and os.time() - entry.time < ttl then
      return entry.value
    end
    cache[x] = {value = fn(x), time = os.time()}
    return cache[x].value
  end
end

تخزين مؤقت بقيم ضعيفة

استخدموا قيمًا ضعيفة حتى يمكن جمع النتائج المخزنة مؤقتًا بواسطة جامع القمامة عند انخفاض الذاكرة.

local function memoizeWeak(fn)
  local cache = setmetatable({}, {__mode = "v"})
  return function(x)
    if cache[x] == nil then cache[x] = fn(x) end
    return cache[x]
  end
end

نمط التخزين المؤقت العودي

بالنسبة إلى الدوال العودية المتبادلة، أسندوا الغلاف المخزن مؤقتًا قبل أن يستخدمه الجسم العودي، حتى تمر الاستدعاءات العودية عبر التخزين المؤقت.

تخزين مؤقت محدود (تصوّر LRU)

للتحكم في الذاكرة، طبّقوا تخزينًا مؤقتًا من نوع LRU يطرد الإدخال الأقل استخدامًا مؤخرًا عند تجاوز التخزين المؤقت حدًا أقصى للحجم.

التخزين المؤقت عمليًا

من الاستخدامات الشائعة: الحسابات الرياضية المكلفة، وتخزين نتائج استعلامات قاعدة البيانات مؤقتًا، وتجميع أنماط Lua، وتحليل ملفات الإعداد.

سؤال عن التخزين المؤقت للنتائج

لماذا ينبغي تطبيق التخزين المؤقت للنتائج على الدوال النقية فقط؟

مراجعة: التخزين المؤقت للنتائج

يستخدم التخزين المؤقت للنتائج ذاكرةً مؤقتة يحتفظ بها إغلاق لتخزين النتائج وفق مفتاح الوسائط، مما يلغي الحسابات المكررة. استخدموا الجداول الضعيفة للحفاظ على سلامة الذاكرة، وأضيفوا TTL للتخزينات المؤقتة الحساسة للوقت.

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

هل درس «التخزين المؤقت بالاعتماد على الإغلاقات» مجاني؟

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

ماذا ستتعلم في «التخزين المؤقت بالاعتماد على الإغلاقات»؟

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

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

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

كم من الوقت يستغرق درس «التخزين المؤقت بالاعتماد على الإغلاقات»؟

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

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

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

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

  1. ما المقصود بـ Upvalues؟
  2. مشاركة Upvalues بين الإغلاقات
  3. دوال المصنع والمولّدات
  4. التخزين المؤقت بالاعتماد على الإغلاقات
← العودة إلى Lua Academy