Struktura danych mapy sortowanej przechowywania pamięci, pozwala przechowywać częste dane w pamięci jako pary klucz-wartość z opcjonalnym kluczem sortowania i utrzymywać określony porządek w oparciu o klucze sortowania i klucze.W przeciwieństwie do kolejek kolejność kluczy wchodzących na mapę nie określa kolejności przetwarzania, co czyni sortowane mapy użytecznymi do sortowania zorganizowanej danych w celu wdrożenia w doświadczeniu jednostek takich jak tabele liderów i aukcje na serwerach krzyżowych.
Greny
Oprócz ograniczeń wielkości struktury danych , sortowane mapy mają ograniczenie wielkości klucza do 128 znaków, ograniczenie wielkości wartości do 32 KB i ograniczenie wielkości klucza sortowania do 128 znaków.
Jeśli musisz przechować dane przekraczające ten limit dla swojego doświadczenia, możesz przyjąć technikę rozdzielania, aby rozdzielić je i rozprowadzić przez prefiks klucza w wielu strukturach danych.Magazyny pamięci rozdzielające mogą również pomóc poprawić skalowalność twojego systemu.
Zdobądź uporządkowaną mapę
Aby uzyskać sortowaną mapę, wezwij MemoryStoreService:GetSortedMap() z nazwą nazwy , którą chcesz zdefiniować dla mapy.Nazwa jest globalna w doświadczeniu, więc możesz uzyskać dostęp do tej samej sortowanej mapy na każdym skrypcie za pomocą nazwy.
Zdobycie sortowanej mapy
local MemoryStoreService = game:GetService("MemoryStoreService")local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")
Po otrzymaniu sortowanej mapy wezwij którąkolwiek z poniższych funkcji, aby przeczytać lub zapisać dane w niej:
Funkcja | Akcja |
---|---|
MemoryStoreSortedMap:SetAsync() | Dodaj nowy klucz lub zastąp wartość i/lub klucz sortowania, jeśli klucz już istnieje. |
MemoryStoreSortedMap:GetAsync() | Przeczytaj konkretny klucz. |
MemoryStoreSortedMap:GetRangeAsync() | Przeczytaj wszystkie istniejące klucze lub konkretny zakres z nich. |
MemoryStoreSortedMap:UpdateAsync() | Aktualizacja wartości klucza i/lub klucza sortowania po jego odzyskaniu z sortowanej mapy. |
MemoryStoreSortedMap:RemoveAsync() | Usuń klucz z sortowanej mapy. |
Dodaj lub zastąp dane
Aby dodać nowy klucz lub zastąpić wartość lub klucz sortowania klucza w uporządkowanej mapie, wezwij z kluczem nazwa , jego wartością , czasem wygaśnięcia w sekundach i kluczem opcjonalnym sortowania .Pamięć automatycznie sprząta się po wygaśnięciu klucza.Maksymalny czas wygaśnięcia wynosi 3 888 000 sekund (45 dni).Klucz sortowania, jeśli zostanie podany, musi być ważną liczbą (całkowitą lub zmienną pływającą) lub ciągiem.
W kolejności sortowania kluczy, klucz sortujący ma pierwszeństwo przed kluczem.Na przykład, podczas sortowania w kolejności rosnącej, klucze sortujące liczbowe są sortowane jako pierwsze, a następnie klucze sortujące ciągi znaków, a następnie przedmioty bez klucza sortowania.Wszystkie przedmioty z kluczami sortowania liczbowymi są sortowane według klucza sortowania, jeśli klucz sortowania dla dwóch przedmiotów jest taki sam, są sortowane według klucza.Podobnie wszystkie przedmioty z kluczami sortowania strun są sortowane według klucza sortowania, jeśli klucz sortowania dla dwóch przedmiotów jest taki sam, są sortowane według klucza.Wszystkie przedmioty bez klucza sortowania są sortowane tylko przez klucz.
Przykład niektórych danych sortowanych w kolejności malejącej -
{Key: "player1", Value: someValue1, SortKey: -1}{Key: "player2", Value: someValue2, SortKey: 0}{Key: "player4", Value: someValue3, SortKey: 1}{Key: "player5", Value: someValue4, SortKey: 1}{Key: "player3", Value: someValue5, SortKey: 3.14}{Key: "player6", Value: someValue6, SortKey: "someString"}{Key: "player0", Value: someValue7}{Key: "player7", Value: someValue8}
Zobacz, jak player0 sortuje po wszystkich kluczach z kluczem sortowania.player6 sortuje po wszystkich kluczach z kluczem sortującym liczbowym.player4 i player5 mają ten sam klucz sortowania, więc są sortowane według klucza w kolejności rosnącej.
Dodawanie danych do sortowanej mapy
local MemoryStoreService = game:GetService("MemoryStoreService")
local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")
local setSuccess, _ = pcall(function()
return sortedMap:SetAsync("User_1234", 1000, 30, 3.14152)
end)
if setSuccess then
print("Set succeeded.")
end
Zdobądź dane
Możesz albo uzyskać wartość danych i sortować klucz związany z określonym kluczem, albo uzyskać wiele wartości i sortować klucze dla kluczy w zakresie.
Zdobądź dane za pomocą jednego klucza
Aby uzyskać wartość i sortować klucz związany z jednym kluczem z sortowanej mapy, wezwij MemoryStoreSortedMap:GetAsync() z kluczem nazwa .
Zdobycie szczególnego klucza z sortowanej mapy
local MemoryStoreService = game:GetService("MemoryStoreService")
local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")
local setSuccess, _ = pcall(function()
return sortedMap:SetAsync("User_1234", 1000, 30, 3.14152)
end)
if setSuccess then
print("Set succeeded.")
end
local item
local getSuccess, getError = pcall(function()
item = sortedMap:GetAsync("User_1234")
end)
if getSuccess then
print(item)
else
warn(getError)
end
Zdobądź dane z wieloma kluczami
Aby uzyskać dane dla wielu kluczy z sortowanej mapy jako pojedynczej operacji, wezwij MemoryStoreSortedMap:GetRangeAsync().Funkcja ta domyślnie wymienia wszystkie istniejące klucze, ale możesz ustawić górną i dolną granicę dla zakresu kluczy.Na przykład następujący przykład kodu odzyskuje do 20 przedmiotów od początku sortowanej mapy, z kluczami większymi niż lub równymi , kluczami sortowania większymi niż lub równymi i kluczami mniejszymi niż lub równymi .
Zdobycie zakresu kluczy z sortowanej mapy
local MemoryStoreService = game:GetService("MemoryStoreService")
local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")
local lowerBound = {}
lowerBound["key"] = "10"
lowerBound["sortKey"] = 100
local upperBound = {}
upperBound["key"] = "50"
upperBound["sortKey"] = 500
-- Zdobądź do 20 przedmiotów od początku
local getSuccess, items = pcall(function()
return sortedMap:GetRangeAsync(
Enum.SortDirection.Ascending, 20, lowerBound, upperBound)
end)
if getSuccess then
for _, item in items do
print(item.key)
print(item.sortKey)
end
end
Aktualizuj dane
Aby odzyskać wartość i sortować klucz z sortowanej mapy i go zaktualizować, wezwij z kluczem nazwa , funkcję wezwania powrotnego do aktualizacji wartości i klucza dla tego klucza oraz czas wygaśnięcia w sekundach.Maksymalny czas wygaśnięcia wynosi 3 888 000 sekund (45 dni).
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 wynik w tabeli wyników dla gracza w grze.Wynik jest obliczany jako zabójstwa / śmierci.UpdateAsync() zapewnia, że zabójstwa i śmierci są aktualizowane dla najnowszych wartości, nawet jeśli wiele serwerów gier aktualizuje ten sam przedmiot jednocześnie.Zabójstwa i śmierci gracza są monotonnie rosnącymi wartościami i dlatego mogą wzrosnąć tylko wartością w sesja.
Aktualizowanie wyniku tabeli liderów dla gracza na mapie sortowanej
local MemoryStoreService = game:GetService("MemoryStoreService")
local sortedMap = MemoryStoreService:GetSortedMap("Leaderboard")
local function updateLeaderboard(itemKey, killsToAdd, deathsToAdd)
local success, newStats, newScore = pcall(function()
return sortedMap:UpdateAsync(itemKey, function(playerStats, playerScore)
playerStats = playerStats or { kills = 0, deaths = 0 }
playerStats.kills += killsToAdd
playerStats.deaths += deathsToAdd
if playerStats then
-- `playerScore` to klucz sortujący używany do sortowania elementów na mapie
playerScore = playerStats.kills / math.max(playerStats.deaths, 1)
return playerStats, playerScore
end
return nil
end, 30)
end)
if success then
print(newStats)
print(newScore)
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ć MemoryStoreSortedMap:RemoveAsync() do usuwania jednego klucza z sortowanej mapy i usuwania wszystkich danych w przeznaczonej do sortowania mapie pamięci.
Usuń klucz
Aby usunąć klucz z sortowanej mapy, wezwij MemoryStoreSortedMap:RemoveAsync() z kluczem nazwy .
Usuń klucz z sortowanej mapy
local MemoryStoreService = game:GetService("MemoryStoreService")
local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")
local setSuccess, _ = pcall(function()
return sortedMap:SetAsync("User_1234", 1000, 30, "someStringSortKey")
end)
if setSuccess then
print("Set succeeded.")
end
local removeSuccess, removeError = pcall(function()
sortedMap:RemoveAsync("User_1234")
end)
if not removeSuccess then
warn(removeError)
end
Usuń wszystkie dane
Aby usunąć pamięć w sortowanych mapach, wymień wszystkie klucze za pomocą MemoryStoreSortedMap:GetRangeAsync(), a następnie usuń je za pomocą MemoryStoreSortedMap:RemoveAsync().
Usuń pamięć w sortowanej mapie
local MemoryStoreService = game:GetService("MemoryStoreService")
local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")
-- Początkowa niższa granica zera zaczyna się od pierwszego przedmiot
local exclusiveLowerBound = nil
while true do
-- Zdobądź do setki elementów zaczynając od obecnego dolnego granic
local getRangeSuccess, items = pcall(function()
return sortedMap:GetRangeAsync(Enum.SortDirection.Ascending, 100, exclusiveLowerBound)
end)
if getRangeSuccess then
local removeSuccess = true
local removeError = nil
for _, item in items do
removeSuccess, removeError = pcall(function()
sortedMap:RemoveAsync(item.key)
end)
end
-- Jeśli wystąpił błąd usuwania przedmiotów, spróbuj ponownie z tym samym wyłącznym dolnym granicą
if not removeSuccess then
warn(removeError)
-- Jeśli zasięg jest mniejszy niż sto przedmiotów, osiągany jest koniec mapy
elseif #items < 100 then
break
else
-- Ostatnio odzyskany klucz jest ekskluzywnym dolnym granicą dla następnej iteracji
exclusiveLowerBound = {}
exclusiveLowerBound["key"] = items[#items].key
exclusiveLowerBound["sortKey"] = items[#items].sortKey
end
end
end