Mapy haszu , podobne do sortowanych map, pozwalają przechowywać dane w pamięci jako pary klucz-wartość.W przeciwieństwie do sortowanych map nie zapewniają żadnych gwarancji kolejności.Ta struktura danych jest przydatna w przypadkach, które wymagają prostego przechowywania danych i szybkiego dostępu, takich jak wspólne magazyny, fizyczne domy aukcyjne i więcej.Mapy hasz automatycznie obsługują rozdzielanie danych i są bardzo przydatne, jeśli masz więcej niż 1000 kluczy.Dla mniejszych przestrzeni kluczy polecamy sortowane mapy.
Greny
Mapy hasz mają ograniczenie rozmiaru klucza do 128 znaków i ograniczenie rozmiaru wartości do 32 KB.
W przeciwnym razie mapy haszu używają tej samej prośby o API i ograniczeń pamięci jak inne struktury danych przechowywania pamięci.
Zdobądź mapę haszu
Aby uzyskać mapę haszu, wezwij MemoryStoreService:GetHashMap() z nazwą mapy haszu.Nazwa jest globalna w doświadczeniu, więc możesz uzyskać dostęp do tej samej mapy haszy za pomocą dowolnego skryptu za pomocą tej nazwy.
Zdobywanie mapy haszy
local MemoryStoreService = game:GetService("MemoryStoreService")local hashMap = MemoryStoreService:GetHashMap("HashMap1")
Po otrzymaniu mapy haszu wezwij którąkolwiek z następujących funkcji, aby przeczytać lub zapisać dane w niej:
Funkcja | Akcja |
---|---|
MemoryStoreHashMap:SetAsync() | Dodaj nowy klucz lub zastąp wartość, jeśli klucz już istnieje. |
MemoryStoreHashMap:GetAsync() | Przeczytaj konkretny klucz. |
MemoryStoreHashMap:ListItemsAsync() | Lista przedmiotów w mapie haszu. |
MemoryStoreHashMap:UpdateAsync() | Aktualizacja wartości klucza po jego odzyskaniu z mapy haszy. |
MemoryStoreHashMap:RemoveAsync() | Usuń klucz z mapy haszy. |
Aby uzyskać szczegółową dokumentację na temat każdej funkcji, zobacz MemoryStoreHashMap.
Dodaj lub zastąp dane
Aby dodać nowy klucz lub zastąpić wartość klucza w mapie haszu, wezwij z kluczem nazwa , jego wartością i czasem wygaśnięcia w sekundach.Pamięć automatycznie sprząta się po wygaśnięciu klucza.Maksymalny czas wygaśnięcia wynosi 3 888 000 sekund (45 dni).
Dodawanie danych do mapy haszu
local MemoryStoreService = game:GetService("MemoryStoreService")
local hashMap = MemoryStoreService:GetHashMap("HashMap1")
local setSuccess, _ = pcall(function()
return hashMap:SetAsync("User_1234", 1000, 30)
end)
if setSuccess then
print("Set succeeded.")
end
Zdobądź dane
Możesz albo uzyskać wartość związaną z określonym kluczem, albo uzyskać wiele par klucz-wartość w mapie haszu.
Zdobądź dane za pomocą jednego klucza
Aby uzyskać wartość powiązaną z jednym kluczem z mapy haszy, wezwij MemoryStoreHashMap:GetAsync() z kluczem nazwa .
Zdobycie szczególnego klucza z mapy haszy
local MemoryStoreService = game:GetService("MemoryStoreService")
local hashMap = MemoryStoreService:GetHashMap("HashMap1")
local setSuccess, _ = pcall(function()
return hashMap:SetAsync("User_1234", 1000, 30)
end)
if setSuccess then
print("Set succeeded.")
end
local item
local getSuccess, getError = pcall(function()
item = hashMap:GetAsync("User_1234")
end)
if getSuccess then
print(item)
else
warn(getError)
end
Zdobądź dane z wieloma parami kluczowo-wartościowymi
Aby uzyskać wszystkie pary klucz-wartość z mapy haszu jako pojedynczą operację, wezwij MemoryStoreHashMap:ListItemsAsync() z żądanym rozmiarem strony.Funkcja ta wymienia wszystkie istniejące klucze w sposób uporządkowany.Na przykład następujący przykład kodu odzyskuje do 32 przedmiotów z mapy haszu.
Wyświetlanie elementów w mapie Hash
local MemoryStoreService = game:GetService("MemoryStoreService")
local hashMap = MemoryStoreService:GetHashMap("HashMap1")
-- Zdobądź listę przedmiotów, 32 przedmioty na raz
local success, pages = pcall(function()
return hashMap:ListItemsAsync(32)
end)
if success then
while true do
-- Zdobądź aktualną stronę
local entries = pages:GetCurrentPage()
-- Powtarzaj przez wszystkie pary kluczowo-wartościowe na stronie
for _, entry in ipairs(entries) do
print(entry.key .. " : " .. tostring(entry.value))
end
-- Sprawdź, czy ostatnia strona została osiągnięta
if pages.IsFinished then
break
else
print("----------")
-- Przejdź do następnej strony
pages:AdvanceToNextPageAsync()
end
end
end
Aktualizuj dane
Aby odzyskać wartość klucza z mapy haszy i ją zaktualizować, wezwij z kluczem nazwa , funkcję powrotu wezwania do aktualizacji klucza i czas wygaśnięcia w sekundach.
W przypadku większości doświadczeń wiele serwerów może jednocześnie aktualizować ten sam klucz i zmieniać wartość.Ponieważ UpdateAsync() zawsze modyfikuje najnowszą wartość przed aktualizacją, powinieneś używać jej do odczytu najnowszej wartości jako wejścia do funkcji callback.
Na przykład następujący przykład kodu aktualizuje liczbę zasobów zasobu w wspólnym wyposażenie.UpdateAsync() zapewnia, że wszystkie wkłady graczy znajdą się w tym wyposażenie, nawet jeśli te wkłady są dokonywane jednocześnie.W tej funkcji egzekwuje również maksymalną liczbę zasobów 500.
Aktualizowanie liczby zasobów dla zasobu w wspólnym ekwipunku
local MemoryStoreService = game:GetService("MemoryStoreService")
local hashMap = MemoryStoreService:GetHashMap("ResourceInventory")
local function contributeResources(itemResource, addedCount)
local success, newResourceCount = pcall(function()
return hashMap:UpdateAsync(itemResource, function(resource)
resource = resource or {count = 0}
resource.count = resource.count + addedCount
-- zapewnij, że nie przekroczymy maksymalnej liczby zasobów
if resource.count > 500 then
resource.count = 500
end
return resource
end, 1200)
end)
if success then
print(newResourceCount)
end
end
Opóźnienie dla UpdateAsync() jest podobne do GetAsync() i SetAsync() chyba że występuje konkurencja.
Kiedy występuje konflikt, system automatycznie ponownie wykonuje operację, dopóki jedna z tych trzech nie nastąpi: operacja powiedzie się, funkcja powrotu zostanie zwrócona nil lub osiągnięto maksymalną liczbę prób.Jeśli system osiągnie maksymalną liczbę prób, zwraca konflikt.
Usuń dane
Możesz użyć MemoryStoreHashMap:RemoveAsync() do usuwania jednego klucza z mapy haszu i usuwania wszystkich danych w mapie haszu pamięci.
Usuń klucz
Aby usunąć klucz z mapy haszy, wezwij MemoryStoreHashMap:RemoveAsync() z kluczem nazwy .
Usuń klucz z mapy haszy
local MemoryStoreService = game:GetService("MemoryStoreService")
local hashMap = MemoryStoreService:GetHashMap("HashMap1")
local setSuccess, _ = pcall(function()
return hashMap:SetAsync("User_1234", 1000, 30)
end)
if setSuccess then
print("Set succeeded.")
end
local removeSuccess, removeError = pcall(function()
hashMap:RemoveAsync("User_1234")
end)
if not removeSuccess then
warn(removeError)
end
Usuń wszystkie dane
Aby usunąć wszystkie dane w mapie haszu, wymień wszystkie swoje przedmioty za pomocą MemoryStoreHashMap:ListItemsAsync(), a następnie usuń je za pomocą MemoryStoreHashMap:RemoveAsync().
Usuń wszystkie dane w mapie haszu
local MemoryStoreService = game:GetService("MemoryStoreService")
local hashMap = MemoryStoreService:GetHashMap("HashMap1")
-- Zdobądź listę przedmiotów, 32 przedmioty na raz
local success, pages = pcall(function()
return hashMap:ListItemsAsync(32)
end)
if success then
while true do
-- Zdobądź aktualną stronę
local entries = pages:GetCurrentPage()
local removeSuccess = true
local removeError = nil
-- Powtarzaj przez wszystkie pary kluczowo-wartościowe na stronie
for _, entry in ipairs(entries) do
print(entry.key .. " : " .. tostring(entry.value))
removeSuccess, removeError = pcall(function()
hashMap:RemoveAsync(entry.key)
end)
if not removeSuccess then
warn(removeError)
end
end
-- Sprawdź, czy ostatnia strona została osiągnięta
if pages.IsFinished then
print("Finished deleting all data.")
break
else
print("----------")
-- Przejdź do następnej strony
pages:AdvanceToNextPageAsync()
end
end
end