Die sortierte Kartendatenstruktur von Speicherstätten ermöglicht es Ihnen, häufige In-Memory-Daten als Schlüssel-Wert-Paare mit einem optionalen Sortierschlüssel zu speichern und eine bestimmte Reihenfolge basierend auf den Sortierschlüssen und Schlüsseln aufrechtzuerhalten.Im Gegensatz zu Schlangen bestimmt die Reihenfolge der Schlüssel, die eine Karte betreten, nicht die Reihenfolge der Verarbeitung, wodurch sortierte Karten für die Sortierung von basierenden Datenorganisationen nützlich sind, um In-Experience-Entitäten für Engagement wie Ranglisten und Cross-Server-Auktionen zu implementieren.
Grenzen
Zusätzlich zu den Datenstrukturgrößengrenzen, sortierte Karten haben eine Schlüsselgrößenbegrenzung von 128 Zeichen, eine Wertegrößenbegrenzung von 32 KB und eine Sortierschlüsselgrößenbegrenzung von 128 Zeichen.
Wenn Sie Daten speichern müssen, die dieses Limit für Ihre Erlebnisüberschreiten, können Sie die Scherentechnik anwenden, um sie durch Schlüsselpräfix in mehrere Datenstrukturen aufzuteilen und zu verteilen.Zerfallsspeicher können auch dazu beitragen, die Skalierbarkeit Ihres Systems zu verbessern.
Erhalte eine sortierte Karte
Um eine sortierte Karte 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 du auf jedem Skript mit dem Namen auf die gleiche sortierte Karte zugreifen kannst.
Eine sortierte Karte erhalten
local MemoryStoreService = game:GetService("MemoryStoreService")local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")
Nachdem du eine sortierte Karte erhalten hast, rufe eine der folgenden Funktionen auf, um Daten darin zu lesen oder zu schreiben:
Funktion | Aktion |
---|---|
MemoryStoreSortedMap:SetAsync() | Füge einen neuen Schlüssel hinzu oder überschreibe den Wert und/oder sortiere den Schlüssel, wenn der Schlüssel bereits existiert. |
MemoryStoreSortedMap:GetAsync() | Lesen einen bestimmten Schlüssel. |
MemoryStoreSortedMap:GetRangeAsync() | Lesen alle vorhandenen Schlüssel oder eine bestimmte Reihe von ihnen. |
MemoryStoreSortedMap:UpdateAsync() | Aktualisieren den Wert eines Schlüssels und/oder Sortierschlüssels nach dessen Abruf aus einer sortierten Karte. |
MemoryStoreSortedMap:RemoveAsync() | Entferne einen Schlüssel aus der sortierten Karte. |
Daten hinzufügen oder überschreiben
Um einen neuen Schlüssel hinzuzufügen oder den Wert oder Sortierschlüssel eines Schlüssels in der sortierten Karte zu überschreiben, rufe MemoryStoreSortedMap:SetAsync() mit dem Schlüssel name , seinem Wert , einer Verfallszeit in Sekunden und einem optionalen Sortierschlüssel auf.Die Speicher wird automatisch gereinigt, sobald der Schlüssel abläuft.Die maximale Verfallszeit beträgt 3,888,000 Sekunden (45 Tage).Der Sortierschlüssel, wenn er bereitgestellt wird, muss eine gültige Zahl (Ganzzahl oder Bruchzeichen) oder eine Stringsein.
In der Sortierreihenfolge deiner Schlüssel hat ein Sortierschlüssel Vorrang vor einem Schlüssel.Zum Beispiel werden bei Sortierung in aufsteigender Reihenfolge numerische Sortierschlüssel zuerst sortiert, gefolgt von Zeichenfolgesortierschlüsseln und dann von Artikeln ohne Sortierschlüssel.Alle Artikel mit numerischen Sortierschlüsseln werden nach Sortierschlüssel sortiert, wenn der Sortierschlüssel für zwei Artikel gleich ist, werden sie nach Schlüssel sortiert.Ebenso werden alle Elemente mit Sternensortierungs Schlüsseln nach Sternensortierungs-Schlüssel sortiert, wenn der Sternensortierungs-Schlüssel für zwei Elemente gleich ist, werden sie nach Schlüssel sortiert.Alle Elemente ohne Sortierschlüssel werden nur nach dem Schlüssel sortiert.
Beispiel für einige 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 nach allen Schlüsseln mit einem Sortierschlüssel sortiert wird.player6 sortiert nach allen Schlüsseln mit einem numerischen Sortierschlüssel.player4 und player5 haben den gleichen Sortierschlüssel, so dass sie in aufsteigender Reihenfolge nach Schlüssel sortiert werden.
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 abrufen
Du kannst entweder einen Datenwert und einen Sortierschlüssel mit einem bestimmten Schlüssel erhalten oder mehrere Werte und Sortierschlüssel für Schlüssel innerhalb eines Bereichs erhalten.
Erhalte Daten mit einem Schlüssel
Um einen Wert und einen Sortierschlüssel mit einem Schlüssel aus der sortierten Karte zu erhalten, rufe MemoryStoreSortedMap:GetAsync() mit dem Schlüssel Namen auf.
Einen bestimmten Schlüssel aus einer sortierten Karte erhalten
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
Erhalte Daten mit mehreren Schlüsseln
Um Daten für mehrere Schlüssel aus der sortierten Karte als einzelne Operation zu erhalten, rufen Sie MemoryStoreSortedMap:GetRangeAsync() auf.Diese Funktion listet alle vorhandenen Schlüssel standardmäßig auf, aber du kannst die oberen und unteren Grenzen für die Schlüsselreichweite festlegen.Zum Beispiel ruft das folgende Codebeispiel bis zu 20 Elemente ab, die am Beginn der sortierten Karte beginnen, mit Schlüsseln größer als oder gleich 10 , Sortierschlüsseln größer als oder gleich 100 und Schlüsseln weniger als oder gleich 50 , Sortierschlüsseln weniger als oder gleich 500 .
Eine Reihe von Schlüsseln aus einer sortierten Karte erhalten
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
-- Hole 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 Sortierschlüssel eines Schlüssels aus einer sortierten Karte abzurufen und zu aktualisieren, rufe MemoryStoreSortedMap:UpdateAsync() mit dem Schlüssel name , eine Rückruffunktion zum Aktualisieren des Werts und der Sortierschlüssel für diesen Schlüssel und eine Verfallszeit in Sekunden auf.Die maximale Verfallszeit beträgt 3,888,000 Sekunden (45 Tage).
Für die meisten Erlebnisse können mehrere Server gleichzeitig denselben Schlüssel aktualisieren und den Wert ändern.Da UpdateAsync() der neueste Wert immer vor der Aktualisierung modifiziert wird, solltest du ihn verwenden, um den neuesten Wert als Eingabe für deine Rückruffunktion zu lesen.
Zum Beispiel aktualisiert das folgende Codebeispiel die Punktzahl in einer Rangliste für einen Spieler in einem Spiel.Die Punktzahl wird berechnet als Tötungen / Todesfälle.UpdateAsync() stellt sicher, dass die Tötungen und Todesfälle für die jüngsten Werte aktualisiert werden, auch wenn mehrere Spielserver dasselbe Element gleichzeitig aktualisieren.Tötungen und Todesfälle eines Spieler:insteigen monoton und somit nur in einem Sitzungswert an.
Aktualisierung der Ranglistenpunktzahl 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 Sortierschlüssel, der verwendet wird, um Elemente 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 Verzögerung für UpdateAsync() ist ähnlich wie GetAsync() und SetAsync() es sei denn, es gibt einen Wettbewerb.
Wenn ein Streitfall auftritt, versucht das System automatisch, die Operation erneut durchzuführen, bis einer dieser drei Fälle auftritt: die Operation gelingt, die Rückruffunktion gibt nil zurück oder die maximale Anzahl an Wiederholungen erreicht wird.Wenn das System die maximale Anzahl an Wiederholungen erreicht, gibt es einen Konflikt zurück.
Daten löschen
Du kannst MemoryStoreSortedMap:RemoveAsync() für beide verwenden, um einen Schlüssel von der sortierten Karte zu entfernen und alle Daten in einer sortierten Speicherdatenbank zu löschen.
Schlüssel entfernen
Um einen Schlüssel von der sortierten Karte zu entfernen, rufe MemoryStoreSortedMap:RemoveAsync() mit einem Schlüssel Namen auf.
Entferne einen 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, "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 Speicher in sortierten Karten zu löschen, listen Sie alle Ihre Schlüssel mit MemoryStoreSortedMap:GetRangeAsync() auf und entfernen Sie sie dann mit MemoryStoreSortedMap:RemoveAsync().
Speicher in einer sortierten Karte löschen
local MemoryStoreService = game:GetService("MemoryStoreService")
local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")
-- Die ursprüngliche untere Grenze von Null beginnt mit dem ersten Artikel
local exclusiveLowerBound = nil
while true do
-- Holen Sie sich bis zu hundert Artikel, beginnend mit dem aktuellen unteren Limit
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 es einen Fehler gab, beim Entfernen von Elementen, versuchen Sie es erneut mit derselben exklusiven unteren Grenze
if not removeSuccess then
warn(removeError)
-- Wenn die Reichweite weniger als hundert Elemente beträgt, wird das Ende der Karte erreicht
elseif #items < 100 then
break
else
-- Der zuletzt abgerufene Schlüssel ist die exklusive untere Grenze für die nächste Iteration
exclusiveLowerBound = {}
exclusiveLowerBound["key"] = items[#items].key
exclusiveLowerBound["sortKey"] = items[#items].sortKey
end
end
end