구조 데이터베이스 데이터 구조 데이터 구조 데이터 구조 데이터 구조 데이터 구조 데이터 구조 데이터 구조 데이터 구조 데이터 구조 데이터 구조 데이터 구조 데이터 구조 데이터 구조 데이터 구조 데이터 구조 데이터 구조 데
Ograniczenia
Oprócz ograniczeń wielkości struktury danych , sortowane mapy mają limit rozmiaru klucza 128 znaków, limit wielkości wartości 32 KB i limit rozmiaru klucza sortowania 128 znaków.
Jeśli musisz przechować dane, które przekraczają ten limit dla swojego doświadczenia, możesz zastosować technikę rozdziału, aby podzielić je i rozdystrybować je poprzez przypisek klucza do wielu struktur danych. Stoły pamięci rozdziału mogą również pomóc poprawić skalowalność Twojego systemu.
Zdobywanie sortowanej mapy
Aby uzyskać sortowaną mapę, wezwij MemoryStoreService:GetSortedMap() z imieniem, które chcesz zdefiniować dla mapy. Imię jest globalne w doświadczeniu, więc możesz uzyskać dostęp do tej samej sortowanej mapy na każdym skrypcie używając imienia.
Zdobywanie sortowanej mapy
local MemoryStoreService = game:GetService("MemoryStoreService")local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")
Po uzyskaniu sortowanej mapy wezwij jedną z następujących funkcji, aby czytać lub zapisać dane w niej:
Funkcja | Akcja |
---|---|
MemoryStoreSortedMap:SetAsync() | Dodaj nowy klucz lub zastąp wartość i/lub sortuj klucz, jeśli klucz już istnieje. |
MemoryStoreSortedMap:GetAsync() | Przeczytaj określony klucz. |
MemoryStoreSortedMap:GetRangeAsync() | Przeczytaj wszystkie istniejące klucze lub określony zasięg z nich. |
MemoryStoreSortedMap:UpdateAsync() | Aktualizuj wartość klucza i/lub sortuj klucz po jego odzyskaniu z sortowanej mapy. |
MemoryStoreSortedMap:RemoveAsync() | Usuń klucz z sortowanej mapy. |
Dodawanie lub Zastępowanie Danych
Aby dodać nowy klucz lub zmienić wartość lub sort klucza w sortowanej mapie, wezwij MemoryStoreSortedMap:SetAsync() z kluczem imię , jego wartość i 1> ciąg
W porządku sortowania kluczy, klucz sortowania ma pierwszeństwo nad kluczem. Na przykład, podczas sortowania w rosnąco mieszającym porządku, klucze Sortuj według liczby sortują pierwsze, następnie klucze Sortuj według kształtu, a następnie klucze Sortuj według treści. Wszystkie klucze Sortuj
Przykład niektórych danych sortowanych w rosnąco miesięcznym porządku -
{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}
Zauważ, jak player0 sortuje wszystkie klucze za pomocą klucza sortującego. player6 sortuje wszystkie klucze za pomocą klucza sortującego numerowego. player4 i 2>player52> mają ten sam klucz sortujący, więc są sortowane rosnąco według klucza.
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
Otrzymywanie danych
Możesz uzyskać wartość danych i sortować klucz związany z określonym kluczem lub uzyskać wiele wartości i sortować klucze w zasięgu.
Zdobywanie danych za jeden klucz
Aby uzyskać wartość i sortuj klucz z jednego klucza z sortowanej mapy, wezwij MemoryStoreSortedMap:GetAsync() z kluczem imię .
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
Otrzymywanie danych z wieloma kluczami
Aby uzyskać dane dla wielu kluczy z sortowanej mapy jako jedną operację, wezwij MemoryStoreSortedMap:GetRangeAsync() . Ta funkcja wymienia wszystkie istnie
Zdobycie zestawu 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
Aktualizowanie danych
Aby odzyskać wartość i sortuj klucz z sortowanej mapy i aktualizować go, wezwij MemoryStoreSortedMap:UpdateAsync() z kluczem imię i funkcją zwrotu do aktualizowania wartości i sortuj klucz dla tej klucz, a czas wygasania to 1>3,888,00
Dla większości doświadczeń, wiele serwerów może aktualizować ten sam klucz równocześnie i zmieniać wartość. Jako UpdateAsync() zawsze modyfikuje najnowszą wartość przed aktualizacją, powinieneś ją używać do czytania najnowszej wartości jako wejścia dla twojej funkcji zwrotnej.
Na przykład poniższy kod przykładu kodu aktualizuje wynik na liście 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 gry aktualiz
Aktualizowanie wyniku排行榜 dla gracza w Sortowanej Mapie
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 sortowania używany do sortowania pozycji 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 istnieje kontener.
Gdy dojdzie do kontenerzenia, system automatycznie ponownie próbuje operacji, aż jedno z tych trzech się stanie: operacja zakończy się sukcesem, funkcja zwrotu wzwrotu zwraca nil lub osiągnięto maksymalną liczbę prób. Jeśli system osiągnie maksymalną liczbę prób, zwraca konflikt.
Usuwanie danych
Możesz użyć MemoryStoreSortedMap:RemoveAsync() dla obu usuwania jednego klucza z sortowanej mapy i usuwania wszystkich danych w pamięci sortowanej mapy.
Usuwanie klucza
Aby usunąć klucz z sortowanej mapy, wezwij MemoryStoreSortedMap:RemoveAsync() z imieniem klucza.
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
Usuwanie wszystkich danych
Aby usunąć pamięć w sortowanych mapach, wymień wszystkie swoje 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ątkowy niższy limit nil zaczyna się od pierwszego przedmiotu
local exclusiveLowerBound = nil
while true do
-- Zdobądź do 100 pozycji zaczynając od obecnego niższego limitu
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 pojawił się błąd usuwania pozycji, spróbuj ponownie z tą samą ekskluzywną niższą granicą
if not removeSuccess then
warn(removeError)
-- Jeśli zasięg jest mniejszy niż sto jednostek, końcowy punkt mapy zostanie osiągnięty
elseif #items < 100 then
break
else
-- Ostatnim odczytanym kluczem jest ekskluzywny niższy limit dla następnej wersji
exclusiveLowerBound = {}
exclusiveLowerBound["key"] = items[#items].key
exclusiveLowerBound["sortKey"] = items[#items].sortKey
end
end
end