0Pricing
Lua Academy · Lezione

Dizionari in memoria condivisa

Metta in cache i dati tra i worker con ngx.shared.DICT per ricerche a bassa latenza.

Dizionari in memoria condivisa è una lezione Lua Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Lua Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Lua Academy include 4 lezioni in totale.

Che cos'è ngx.shared.DICT?

ngx.shared.DICT è una zona di memoria condivisa accessibile da tutti i processi worker di Nginx. Fornisce operazioni get/set/incr O(1) per il caching e il coordinamento.

Dichiarazione della memoria condivisa in nginx.conf

Allochi dizionari condivisi specificandone nome e dimensione nel blocco http.

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

Operazioni get e set di base

Memorizzi e recuperi valori con un TTL facoltativo (time-to-live, in secondi).

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

Incremento atomico

dict:incr(key, delta, init, expiry) incrementa atomicamente un contatore. Lo inizializza a init se la chiave non esiste.

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 con memoria condivisa

Il pattern incr implementa un semplice rate limiter a finestra scorrevole — uno dei pattern OpenResty più comuni.

delete e flush

dict:delete(key) rimuove una singola chiave. dict:flush_all() contrassegna tutte le chiavi come scadute (eliminazione lazy). dict:flush_expired(n) rimuove attivamente le chiavi scadute.

Add atomico

dict:add(key, val, expiry) imposta una chiave solo se non esiste già — utile per il locking distribuito.

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

Pianificazione delle dimensioni della memoria condivisa

Ogni coppia chiave-valore ha un overhead (~100 byte). Stima: size_mb * 1024^2 / avg_entry_size = numero massimo di elementi. Monitori con dict:capacity() e dict:free_space().

Espulsione dalla memoria

Quando il dizionario è pieno, OpenResty espelle le voci più vecchie per fare spazio. Imposti TTL appropriati per controllare il comportamento di espulsione.

Coordinamento tra worker

Poiché tutti i worker condividono lo stesso dizionario, utilizzi :add per l'elezione del leader e :incr per i contatori globali tra tutti i processi worker.

Limitazioni

I dizionari condivisi supportano solo valori scalari (stringhe, numeri, booleani). Memorizzi le tabelle serializzandole in JSON con cjson.

Domanda sulla memoria condivisa

Che cosa fa dict:incr(key, 1, 0, 60)?

Riepilogo: dizionari di memoria condivisa

ngx.shared.DICT fornisce operazioni atomiche O(1) di get/set/incr tra tutti i worker. Lo utilizzi per rate limiting, caching e locking distribuito. Imposti i TTL per controllare l'espulsione. Serializzi le tabelle in JSON per i valori complessi.

Domande Frequenti

La lezione «Dizionari in memoria condivisa» è gratuita?

Sì — il testo completo di «Dizionari in memoria condivisa» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Lua Academy, passa a CoddyKit PRO. Il corso Lua Academy include 4 lezioni in totale.

Cosa imparerò in «Dizionari in memoria condivisa»?

Metta in cache i dati tra i worker con ngx.shared.DICT per ricerche a bassa latenza. Eserciti Lua Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Lua Academy?

Non è richiesta alcuna esperienza precedente. Lua Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Dizionari in memoria condivisa»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Lua Academy?

Sì. Ogni lezione Lua Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Architettura di OpenResty
  2. Gestione delle richieste HTTP in Lua
  3. Cosocket e TCP non bloccante
  4. Dizionari in memoria condivisa
← Torna a Lua Academy