0Pricing
Lua Academy · Lección

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
end

Limitació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")  -- release

Planificació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

  1. Arquitectura de OpenResty
  2. Gestión de solicitudes HTTP en Lua
  3. Cosockets y TCP no bloqueante
  4. Diccionarios de memoria compartida
← Volver a Lua Academy