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
endOgraniczanie 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") -- releasePlanowanie 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
- Architektura OpenResty
- Obsługa żądań HTTP w Lua
- Cosockety i nieblokujący TCP
- Słowniki pamięci współdzielonej