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:
Funktion | Aktion |
---|---|
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