Kolejka to linowa struktura danych, która zawiera zbiór elementów, które przestrzegają zasady pierwsze przybycie, pierwsze wyjście (FIFO) lub priorytetyzuje elementy na podstawie zdefiniowanych kryteriów. Pamięć obsługuje dwa typy kolejek: FIFO kolejki regularne oraz kolejki priorytetowe. Oba typy dzielą ten sam zestaw funkcji do inicjowania pustej kolejki, dodawania danych do kolejki, odczytywania danych z kolejki i usuwania danych z kolejki.
Kolejki pamięci są przydatne w przetwarzaniu opartym na kolejności i przechowywaniu informacji o użytkownikach, takich jak poziomy umiejętności, aby ułatwić dobieranie graczy na podstawie Twoich kryteriów. Na przykład możesz dodać miejsce lobby jako miejsce startowe swojej gry, używać kolejek pamięci jako scentralizowanego systemu przechowywania informacji o użytkownikach dostępnego dla wielu serwerów, zarządzać kolejnością umiejscowienia użytkowników za pomocą kolejek oraz teleportować użytkowników, którzy ukończyli dopasowywanie, do głównego miejsca Twojej gry.
Uzyskaj kolejkę
Aby uzyskać kolejkę, wywołaj MemoryStoreService:GetQueue() z nazwą, która jest globalna w grze, aby każda skrypt mogła uzyskać do niej dostęp, oraz opcjonalnym czasem niewidoczności w sekundach, który zapobiega duplikacji przetwarzania tego samego elementu kolejki. Czas niewidoczności domyślnie wynosi 30 sekund, jeśli pozostawisz go pustym, jak w poniższym przykładzie kodu.
Uzyskiwanie pustej kolejkilocal MemoryStoreService = game:GetService("MemoryStoreService")local queue = MemoryStoreService:GetQueue("Queue1")
Gdy kolejka przetwarza element, czas niewidoczności ma zastosowanie do tego elementu, czyniąc go niewidocznym dla przetwarzania przez inne serwery, ponieważ wiele serwerów może aktualizować kolejkę równocześnie. Choć oczekuje się, że zakończysz zarówno operacje odczytu, jak i usuwania dla elementu w czasie trwania niewidoczności, jeśli wystąpi błąd, który spowoduje, że element pozostanie w kolejce po upływie czasu, elementy stają się ponownie widoczne do przetwarzania. Dzięki temu czas niewidoczności gwarantuje, że wszystkie elementy w kolejce można nadal przetwarzać, nawet jeśli wystąpią nieprzewidziane problemy.
Po uzyskaniu kolejki wywołaj dowolną z poniższych funkcji:
| Funkcja | Akcja |
|---|---|
| MemoryStoreQueue:AddAsync() | Dodaj nowy element do kolejki. |
| MemoryStoreQueue:ReadAsync() | Odczytaj jeden lub więcej elementów z kolejki jako jedną operację. |
| MemoryStoreQueue:RemoveAsync() | Usuń jeden lub więcej wcześniej odczytanych elementów z kolejki. |
| MemoryStoreQueue:GetSizeAsync() | Uzyskaj liczbę elementów w kolejce. |
Dodaj dane
Aby dodać nowy element do kolejki, wywołaj MemoryStoreQueue:AddAsync() z wartością elementu, czasem wygaśnięcia w sekundach i opcjonalnym priorytetem elementu. Jeśli chcesz zachować kolejkę w sekwencji FIFO, możesz pozostawić priorytet pusty lub przekazać 0.
Dodawanie danych do kolejki
local MemoryStoreService = game:GetService("MemoryStoreService")
local queue = MemoryStoreService:GetQueue("Queue1")
local addSuccess, addError = pcall(function()
queue:AddAsync("Użytkownik_1234", 30, 1)
end)
if not addSuccess then
warn(addError)
end
Odczytywanie i usuwanie danych
Aby odczytać jeden lub więcej elementów z kolejki jednocześnie, wywołaj MemoryStoreQueue:ReadAsync(), która zwraca id reprezentujące odczytany element. Kiedy skończysz przetwarzać elementy, natychmiast wywołaj MemoryStoreQueue:RemoveAsync(), aby usunąć je z kolejki za pomocą id. Zapewnia to, że nigdy nie przetwarzisz jednego elementu więcej niż raz. Aby uchwycić i zareagować na wszystkie elementy, które są ciągle dodawane do kolejki, dołącz pętlę jak w poniższym przykładzie kodu:
Odczytywanie i usuwanie danych z kolejki z pętlą
local MemoryStoreService = game:GetService("MemoryStoreService")
local queue = MemoryStoreService:GetQueue("Queue1")
local addSuccess, addError = pcall(function()
queue:AddAsync("Użytkownik_1234", 30, 1)
end)
if not addSuccess then
warn(addError)
end
-- Pętla przetwarzania kolejki
while true do
local readSuccess, items, id = pcall(function()
return queue:ReadAsync(1, false, 30)
end)
if not readSuccess then
task.wait(1)
elseif #items > 0 then
print(items, id)
local removeSuccess, removeError = pcall(function()
queue:RemoveAsync(id)
end)
if not removeSuccess then
warn(removeError)
end
end
end
Uzyskaj rozmiar
Aby uzyskać liczbę elementów w kolejce, wywołaj MemoryStoreQueue:GetSizeAsync(). Ta metoda przyjmuje opcjonalny boolean excludeInvisible. Gdy jest true, niewidoczne elementy są wykluczane z zwracanej liczby. Ten boolean domyślnie wynosi false.
Uzyskiwanie rozmiaru kolejki
local MemoryStoreService = game:GetService("MemoryStoreService")
local queue = MemoryStoreService:GetQueue("Queue1")
local addSuccess, addError = pcall(function()
return queue:AddAsync("Użytkownik_1234", 30, 1)
end)
if not addSuccess then
warn(addError)
end
local size
local success, sizError = pcall(function()
size = queue:GetSizeAsync(true)
end)
if success then
print(size)
else
warn(sizeError)
end