Diccionarios de memoria compartida
Almacene datos en caché entre workers con ngx.shared.DICT para obtener búsquedas de baja latencia.
Diccionarios de memoria compartida es una lección gratuita de Lua Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Lua Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Lua Academy incluye 4 lecciones en total.
¿Qué es ngx.shared.DICT?
ngx.shared.DICT es una zona de memoria compartida accesible para todos los procesos worker de Nginx. Proporciona operaciones get/set/incr O(1) para el almacenamiento en caché y la coordinación.
Declaración de memoria compartida en nginx.conf
Asigne diccionarios compartidos con un nombre y un tamaño en el bloque http.
# nginx.conf
http {
lua_shared_dict rate_limit 10m;
lua_shared_dict cache 50m;
lua_shared_dict locks 1m;
}Obtención y asignación básicas
Almacene y recupere valores con un TTL opcional (tiempo de vida en segundos).
-- 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 atómico
dict:incr(key, delta, init, expiry) incrementa un contador de forma atómica. Lo inicializa con init si la clave no existe.
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
endLimitación de tasa con memoria compartida
El patrón incr implementa un limitador de tasa de ventana deslizante, uno de los patrones más habituales de OpenResty.
delete y flush
dict:delete(key) elimina una sola clave. dict:flush_all() marca todas las claves como caducadas (eliminación diferida). dict:flush_expired(n) elimina activamente las claves caducadas.
Adición atómica
dict:add(key, val, expiry) establece una clave solo si aún no existe, lo que resulta útil para los bloqueos distribuidos.
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") -- releasePlanificación del tamaño de la memoria compartida
Cada par clave-valor tiene una sobrecarga de aproximadamente 100 bytes. Estimación: size_mb * 1024^2 / avg_entry_size = max entries. Supervise el uso mediante dict:capacity() y dict:free_space().
Expulsión de memoria
Cuando el diccionario está lleno, OpenResty expulsa las entradas más antiguas para hacer espacio. Establezca TTL adecuados para controlar el comportamiento de expulsión.
Coordinación entre workers
Como todos los workers comparten el mismo diccionario, utilice :add para la elección del líder y :incr para los contadores globales entre todos los procesos worker.
Limitaciones
Los diccionarios compartidos solo admiten valores escalares (string, number, boolean). Almacene las tablas serializándolas a JSON con cjson.
Pregunta sobre la memoria compartida
¿Qué hace dict:incr(key, 1, 0, 60)?
Resumen: diccionarios de memoria compartida
ngx.shared.DICT proporciona operaciones atómicas O(1) de get/set/incr entre todos los workers. Utilícelo para la limitación de tasa, el almacenamiento en caché y los bloqueos distribuidos. Establezca TTL para controlar la expulsión. Serialice las tablas a JSON para los valores complejos.
Preguntas frecuentes
¿La lección «Diccionarios de memoria compartida» es gratis?
Sí — el texto completo de «Diccionarios de memoria compartida» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Lua Academy, actualiza a CoddyKit PRO. El curso de Lua Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Diccionarios de memoria compartida»?
Almacene datos en caché entre workers con ngx.shared.DICT para obtener búsquedas de baja latencia. Practicas Lua Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Lua Academy?
No se requiere experiencia previa. Lua Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Diccionarios de memoria compartida»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Lua Academy?
Sí. Cada lección de Lua Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Arquitectura de OpenResty
- Gestión de solicitudes HTTP en Lua
- Cosockets y TCP no bloqueante
- Diccionarios de memoria compartida