Lua Academy · Lektion

Shared-Memory-Dictionaries

Cachen Sie Daten mit ngx.shared.DICT für latenzarme Zugriffe über mehrere Worker hinweg

Lektion 4 von 413 Schritte

Shared-Memory-Dictionaries ist eine kostenlose Lua Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Lua Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.

Was ist ngx.shared.DICT?

ngx.shared.DICT ist eine Shared-Memory-Zone, auf die alle Nginx-Worker-Prozesse zugreifen können. Sie stellt O(1)-Operationen für get, set und incr bereit, die sich für Caching und Koordination eignen.

Shared Memory in nginx.conf deklarieren

Reservieren Sie im http-Block Shared Dictionaries mit einem Namen und einer Größe.

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

Einfaches Abrufen und Setzen

Speichern Sie Werte und rufen Sie sie mit einer optionalen TTL ab (time-to-live in Sekunden).

-- 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!

Atomare Inkrementierung

dict:incr(key, delta, init, expiry) erhöht einen Zähler atomar. Wenn der Schlüssel nicht vorhanden ist, wird er mit init initialisiert.

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

Rate Limiting mit Shared Memory

Das incr-Muster implementiert einen einfachen Rate Limiter mit gleitendem Zeitfenster – eines der häufigsten OpenResty-Muster.

Löschen und Leeren

dict:delete(key) entfernt einen einzelnen Schlüssel. dict:flush_all() markiert alle Schlüssel als abgelaufen (verzögertes Löschen). dict:flush_expired(n) entfernt abgelaufene Schlüssel aktiv.

Atomar hinzufügen

dict:add(key, val, expiry) setzt einen Schlüssel nur, wenn er noch nicht vorhanden ist – nützlich für verteilte Sperren.

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

Planung der Shared-Memory-Größe

Jedes Schlüssel-Wert-Paar hat einen Overhead (etwa 100 Byte). Schätzung: size_mb * 1024^2 / avg_entry_size = maximale Anzahl von Einträgen. Überwachen Sie den Speicher mit dict:capacity() und dict:free_space().

Speicherverdrängung

Wenn das Dictionary voll ist, entfernt OpenResty die ältesten Einträge, um Platz zu schaffen. Legen Sie geeignete TTLs fest, um das Verdrängungsverhalten zu steuern.

Koordination zwischen Workern

Da alle Worker dasselbe Dictionary verwenden, können Sie :add für eine Leader-Wahl und :incr für globale Zähler über alle Worker-Prozesse hinweg verwenden.

Einschränkungen

Shared Dictionaries unterstützen nur skalare Werte (Zeichenfolge, Zahl, boolescher Wert). Speichern Sie Tabellen, indem Sie sie mit cjson in JSON serialisieren.

Frage zum Shared Memory

Was bewirkt dict:incr(key, 1, 0, 60)?

Zusammenfassung: Shared-Memory-Dictionaries

ngx.shared.DICT stellt atomare O(1)-Operationen für get, set und incr über alle Worker hinweg bereit. Verwenden Sie es für Rate Limiting, Caching und verteilte Sperren. Setzen Sie TTLs, um die Verdrängung zu steuern. Serialisieren Sie Tabellen in JSON, um komplexe Werte zu speichern.

Kostenlos starten

Lerne Lua mit einem KI-Tutor — kostenlos

Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.

Kurse
40
Lektionen
159

Häufig gestellte Fragen

Ist die Lektion „Shared-Memory-Dictionaries“ kostenlos?

Ja — der vollständige Text von „Shared-Memory-Dictionaries“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Lua Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Shared-Memory-Dictionaries“?

Cachen Sie Daten mit ngx.shared.DICT für latenzarme Zugriffe über mehrere Worker hinweg Du übst Lua Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Lua Academy zu starten?

Keine Vorkenntnisse erforderlich. Lua Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Shared-Memory-Dictionaries“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Lua Academy-Lektion Code schreiben und ausführen?

Ja. Jede Lua Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. OpenResty-Architektur
  2. HTTP-Anfragen in Lua verarbeiten
  3. Cosockets und nicht blockierendes TCP
  4. Shared-Memory-Dictionaries
← Zurück zu Lua Academy