Mapa Sortowana Przechowywania Pamięci

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.

구조 데이터베이스 데이터 구조 데이터 구조 데이터 구조 데이터 구조 데이터 구조 데이터 구조 데이터 구조 데이터 구조 데이터 구조 데이터 구조 데이터 구조 데이터 구조 데이터 구조 데이터 구조 데이터 구조 데이터 구조 데

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:

FunkcjaAkcja
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