Speicher-Store-Sortierungs-Karte

*Dieser Inhalt wurde mit KI (Beta) übersetzt und kann Fehler enthalten. Um diese Seite auf Englisch zu sehen, klicke hier.

Die sortierte Map-Datenstruktur von Memory-Stores ermöglicht es Ihnen, häufige In-Memory-Daten als Schlüssel-Wert-Paare mit einem optionalen Sort-Schlüssel zu speichern und eine bestimmte Reihenfolge basierend auf den Sort-Schlüssel und -Schlüssel zu wahren. Im Gegensatz zu Warteschlangen ermöglicht die Reihenfolge der Schlüss

Beschränkungen

Zusätzlich zu den Daten strukturgrößen-限制 , sortierte Karten haben ein Schlüssel-Größe-Limit von 128 Zeichen, einen Wert-Limit von 32 KB und ein Sort-Schlüssel-Limit von 128 Zeichen.

Wenn Sie Daten, die diese Grenze für Ihr Erlebnis überschreiten, speichern müssen, können Sie die Splitting-Technik annehmen, um sie über Key-Präfix in mehrere Datenstrukturen zu teilen und zu verteilen. Splitting-Speicherstores können auch dazu beitragen, die Skalierbarkeit Ihres Systems zu verbessern.

Eine sortierte Karte erhalten

Um eine sortierte Liste zu erhalten, rufen Sie MemoryStoreService:GetSortedMap() mit einem Namen auf, den Sie für die Karte definieren möchten. Der Name ist global innerhalb der Erlebnis, sodass Sie auf jedem Skript, das den Namen verwendet, auf die gleiche sortierte Liste zugreifen können.

Eine sortierte Karte erhalten

local MemoryStoreService = game:GetService("MemoryStoreService")
local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")

Nachdem Sie eine sortierte Karte erhalten haben, rufen Sie eine der folgenden Funktionen auf, um Daten darin zu lesen oder zu schreiben:

FunktionAktion
MemoryStoreSortedMap:SetAsync()Füge einem neuen Schlüssel hinzu einen neuen Schlüssel oder überschreiben Sie den Wert und/oder sortieren Sie den Schlüssel, wenn der Schlüssel bereits existiert.
MemoryStoreSortedMap:GetAsync()Lesen Sie einen bestimmten Schlüssel.
MemoryStoreSortedMap:GetRangeAsync()Lesen Sie alle bestehenden Schlüssel oder eine bestimmte Reihe von ihnen.
MemoryStoreSortedMap:UpdateAsync()Aktualisieren der Wert eines Schlüssels und/oder Sort Schlüssel nach dem Abrufen einer sortierten Karte.
MemoryStoreSortedMap:RemoveAsync()Entferne einen Schlüssel von der sortierten Karte.

Daten hinzufügen oder überschreiben

Um einen neuen Schlüssel hinzuzufügen oder den Wert eines Schlüssels in der sortierten Karte zu überschreiben, rufen Sie MemoryStoreSortedMap:SetAsync() mit dem Schlüssel name , seinem wert Im Sortierungsorder Ihrer Schlüssel übersteht ein Sortierungskey über einen Schlüssel. Zum Beispiel, wenn Sie in aufsteigender Reihenfolge sortieren, sortiert der numerische Sortierschlüssel zuerst, gefolgt von Zeichen-Sortierschlüsseln, gefolgt von Elementen mit keinem Sortierschlüssel. Alle Elemente mit Zeichen-Sortierschlüsseln werden sortiert

Beispiel einiger Daten, die in aufsteigender Reihenfolge sortiert sind -


{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}

Beachten Sie, wie player0 Sortiert nach allen Schlüssen mit einem Schlüssel. player6 Sortiert nach allen Schlüssen mit einem numerischen Schlüssel. player4 und 1> player51> haben den gleichen Schlüssel, so dass sie in aufsteigender Schlüsselsortiert sind.

Daten zu einer sortierten Karte hinzufügen

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

Daten erhalten

Du kannst entweder einen Datenwert erhalten und einen bestimmten Schlüssel mit einem Schlüssel-Attribut zuordnen oder mehrere Werte und Schlüssel für Schlüssel innerhalb eines Bereichs sortieren.

Ermittle Daten mit einem Schlüssel

Um einen Wert und eine Sortierungskey mit einem Schlüssel aus der sortierten Karte zu erhalten, rufen Sie MemoryStoreSortedMap:GetAsync() mit dem Schlüssel name .

Besorgen Sie sich einen bestimmten Schlüssel aus einer sortierten Karte

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

Daten mit mehreren Schlüsseln abrufen

Um Daten für mehrere Schlüssel aus der sortierten Karte als einzelne Operation zu erhalten, rufen Sie MemoryStoreSortedMap:GetRangeAsync(). Diese Funktion listet alle bestehenden Schlüssel standardmäßig

Erhalten einer Reihe von Schlüssen von einer sortierten Karte

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
-- Holen Sie sich bis zu 20 Artikel vom Anfang an
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

Daten aktualisieren

Um den Wert und die Sortierung eines Schlüssels aus einer sortierten Karte und das Aktualisieren zu erlangen, rufen Sie MemoryStoreSortedMap:UpdateAsync() mit dem Schlüssel name , einer Rückruf-Funktion zum Aktualisieren des Wertes und der Sortierung des Schlüssels, und einer 1> Verfallszeit1> in Sekunden

Für die meisten Erfahrungen können mehrere Server die gleiche Schlüssel gleichzeitig aktualisieren und den Wert ändern. Als UpdateAsync() immer den neuesten Wert vor dem Upgrade modifiziert, solltest du ihn verwenden, um den neuesten Wert als Eingabe für deine Callback-Funktion zu lesen.

Zum Beispiel aktualisiert der folgende Codebeispiel die Punktzahl in einer Rangliste für einen Spieler in einem Spiel. Die Punktzahl wird als Kills / Tode berechnet. UpdateAsync() stellt sicher, dass die Kills und Tode für die neuesten Werte aktualisiert werden, auch wenn mehrere Spielserver dieselbe Item aktualisieren. Ein Spieler:in's Kills und Tode sind monotonisch steigende Werte

Aktualisieren der Bestenliste für einen Spieler in einer sortierten Karte

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` ist der SortKey, der verwendet wird, um Gegenstände auf der Karte zu sortieren
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

Die Latenz für UpdateAsync() ist ähnlich zu GetAsync() und SetAsync(), es sei denn, es gibt eine Ausnahme.

Wenn Eind?mmung auftritt, versucht das System automatisch erneut, bis eines dieser drei geschehen ist: die Operation erfolgreich ist, die Rückruf-Funktion nil ?ffnet oder die maximale Anzahl an Wiederholungen erreicht ist. Wenn das System die maximale Anzahl an Wiederholungen erreicht, gibt es einen Konflikt zurück.

Daten entfernen

Du kannst MemoryStoreSortedMap:RemoveAsync() für beide verwenden, um einen Schlüssel von der sortierten Karte zu entfernen und alle Daten in einer sortierten Karte-Cache zu löschen.

Den Key entfernen

Um einen Schlüssel von der sortierten Karte zu entfernen, rufen Sie MemoryStoreSortedMap:RemoveAsync() mit einem Schlüssel name .

Entferne einen Schlüssel von einer sortierten Karte

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

Alle Daten löschen

Um in sortierten Karten Speicher zu löschen, listen Sie alle Ihre Schlüssel mit MemoryStoreSortedMap:GetRangeAsync() , dann entfernen Sie sie mit MemoryStoreSortedMap:RemoveAsync() .

Speicher auf einer sortierten Karte löschen

local MemoryStoreService = game:GetService("MemoryStoreService")
local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")
-- Die erste untere Grenze von null beginnt mit dem ArtikelFlush
local exclusiveLowerBound = nil
while true do
-- Holen Sie sich bis zu 100 Artikel vom aktuellen unteren Grenze
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
-- Wenn ein Fehler beim Entfernen von Elementen auftreten sollte, versuche es erneut mit dem gleichen exklusiven Untergrenze
if not removeSuccess then
warn(removeError)
-- Wenn die Reichweite weniger als 100 Elemente beträgt, wird das Ende der Karte erreicht
elseif #items < 100 then
break
else
-- Der letzte abgerufene Schlüssel ist die exklusive Untergrenze für die nächste Iteration
exclusiveLowerBound = {}
exclusiveLowerBound["key"] = items[#items].key
exclusiveLowerBound["sortKey"] = items[#items].sortKey
end
end
end