0Pricing
Lua Academy · Lekcja

Słowniki pamięci współdzielonej

Proszę buforować dane między workerami za pomocą ngx.shared.DICT, aby uzyskiwać dostęp z małymi opóźnieniami.

Słowniki pamięci współdzielonej to bezpłatna lekcja Lua Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Lua Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Lua Academy zawiera 4 lekcji w sumie.

Czym jest ngx.shared.DICT?

ngx.shared.DICT to strefa pamięci współdzielonej dostępna dla wszystkich procesów roboczych Nginx. Zapewnia operacje get/set/incr o złożoności O(1), które można wykorzystywać do buforowania i koordynacji.

Deklarowanie pamięci współdzielonej w nginx.conf

Współdzielone słowniki należy przydzielić, podając ich nazwę i rozmiar w bloku http.

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

Podstawowe operacje pobierania i ustawiania

Wartości można przechowywać i pobierać z opcjonalnym TTL (czasem życia w sekundach).

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

Atomowe zwiększanie

dict:incr(key, delta, init, expiry) atomowo zwiększa licznik. Jeśli klucz nie istnieje, inicjuje go wartością init.

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

Ograniczanie liczby żądań za pomocą pamięci współdzielonej

Wzorzec incr implementuje prosty mechanizm ograniczania liczby żądań w oknie przesuwnym — jeden z najczęściej stosowanych wzorców OpenResty.

delete i flush

dict:delete(key) usuwa pojedynczy klucz. dict:flush_all() oznacza wszystkie klucze jako wygasłe (usuwanie opóźnione). dict:flush_expired(n) aktywnie usuwa wygasłe klucze.

Atomowe dodawanie

dict:add(key, val, expiry) ustawia klucz tylko wtedy, gdy jeszcze nie istnieje — jest to przydatne do implementowania blokad rozproszonych.

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

Planowanie rozmiaru pamięci współdzielonej

Każda para klucz-wartość ma narzut (~100 bajtów). Szacowanie: size_mb * 1024^2 / avg_entry_size = maksymalna liczba wpisów. Zużycie pamięci można monitorować za pomocą dict:capacity() i dict:free_space().

Usuwanie wpisów z pamięci

Gdy słownik jest pełny, OpenResty usuwa najstarsze wpisy, aby zrobić miejsce. Należy ustawić odpowiednie wartości TTL, aby kontrolować sposób usuwania wpisów.

Koordynacja między procesami roboczymi

Ponieważ wszystkie procesy robocze współdzielą ten sam słownik, należy używać :add do wyboru lidera i :incr do obsługi globalnych liczników we wszystkich procesach roboczych.

Ograniczenia

Słowniki współdzielone obsługują wyłącznie wartości skalarne (ciągi znaków, liczby, wartości logiczne). Tabele należy przechowywać po serializacji do JSON za pomocą cjson.

Pytanie dotyczące pamięci współdzielonej

Co robi dict:incr(key, 1, 0, 60)?

Podsumowanie: słowniki pamięci współdzielonej

ngx.shared.DICT zapewnia atomowe operacje get/set/incr o złożoności O(1) we wszystkich procesach roboczych. Należy go używać do ograniczania liczby żądań, buforowania i blokowania rozproszonego. Ustawienie TTL pozwala kontrolować usuwanie wpisów. W przypadku złożonych wartości tabele należy serializować do JSON.

Często zadawane pytania

Czy lekcja „Słowniki pamięci współdzielonej” jest bezpłatna?

Tak — pełny tekst „Słowniki pamięci współdzielonej” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Lua Academy, przejdź na CoddyKit PRO. Kurs Lua Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Słowniki pamięci współdzielonej”?

Proszę buforować dane między workerami za pomocą ngx.shared.DICT, aby uzyskiwać dostęp z małymi opóźnieniami. Ćwiczysz Lua Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Lua Academy?

Nie wymagamy żadnego doświadczenia. Lua Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Słowniki pamięci współdzielonej”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Lua Academy?

Tak. Każda lekcja Lua Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Architektura OpenResty
  2. Obsługa żądań HTTP w Lua
  3. Cosockety i nieblokujący TCP
  4. Słowniki pamięci współdzielonej
← Powrót do Lua Academy