Hash-Karten ähnlich wie sortierte Karten lassen dich Informationsspeicher als Schlüssel-Wert-Paare speichern.Im Gegensatz zu sortierten Karten enthalten sie keine Ordnungsgarantien.Diese Datenstruktur ist nützlich für Fälle, die einfache Datenkennzeichnungen und schnellen Zugriff erfordern, wie z. B. gemeinsame Inventare, physische Auktionshäuser und mehr.Hash-Karten verwalten automatisch die Partitionierung Ihrer Daten und sind sehr nützlich, wenn Sie mehr als 1.000 Schlüssel haben.Für kleinere Schlüsselräume empfehlen wir sortierte Karten.
Grenzen
Hash-Karten haben ein Schlüsselgrößenlimit von 128 Zeichen und ein Wertegrößenlimit von 32 KB.
Ansonsten verwenden Hash-Karten die gleiche API-Anforderung und Speicherlimit wie die anderen Speicherdatenstrukturen.
Holen Sie sich eine Hash-Karte
Um eine Hash-Karte zu erhalten, rufe MemoryStoreService:GetHashMap() mit einem Namen für die Hash-Karte auf.Der Name ist global innerhalb der Erlebnis, sodass du auf jedem Skript mit diesem Namen auf die gleiche Hash-Karte zugreifen kannst.
Eine Hash-Karte erhalten
local MemoryStoreService = game:GetService("MemoryStoreService")local hashMap = MemoryStoreService:GetHashMap("HashMap1")
Nachdem du eine Hash-Karte erhalten hast, rufe eine der folgenden Funktionen auf, um Daten darin zu lesen oder zu schreiben:
Funktion | Aktion |
---|---|
MemoryStoreHashMap:SetAsync() | Füge einen neuen Schlüssel hinzu oder überschreibe den Wert, wenn der Schlüssel bereits existiert. |
MemoryStoreHashMap:GetAsync() | Lesen einen bestimmten Schlüssel. |
MemoryStoreHashMap:ListItemsAsync() | Liste Artikel in einer Hash-Karte auf. |
MemoryStoreHashMap:UpdateAsync() | Aktualisieren den Wert eines Schlüssels nach dessen Abruf aus einer Hash-Karte. |
MemoryStoreHashMap:RemoveAsync() | Entferne einen Schlüssel aus der Hash-Karte. |
Für eine detaillierte Dokumentation über jede Funktion siehe MemoryStoreHashMap.
Daten hinzufügen oder überschreiben
Um einen neuen Schlüssel hinzuzufügen oder den Wert eines Schlüssels in der Hash-Map zu überschreiben, rufe MemoryStoreHashMap:SetAsync() mit dem Schlüssel name , seinem Wert und einer Ablaufzeit in Sekunden auf.Die Speicher wird automatisch gereinigt, sobald der Schlüssel abläuft.Die maximale Verfallszeit beträgt 3,888,000 Sekunden (45 Tage).
Daten zu einer Hash-Map hinzufügen
local MemoryStoreService = game:GetService("MemoryStoreService")
local hashMap = MemoryStoreService:GetHashMap("HashMap1")
local setSuccess, _ = pcall(function()
return hashMap:SetAsync("User_1234", 1000, 30)
end)
if setSuccess then
print("Set succeeded.")
end
Daten abrufen
Du kannst entweder einen Wert mit einem bestimmten Schlüssel verknüpfen oder mehrere Schlüssel-Wert-Paare in der Hash-Karte erhalten.
Erhalte Daten mit einem Schlüssel
Um einen Wert mit einem Schlüssel aus der Hash-Karte zu erhalten, rufen Sie MemoryStoreHashMap:GetAsync() mit dem Schlüssel Namen auf.
Einen bestimmten Schlüssel aus einer Hash-Karte erhalten
local MemoryStoreService = game:GetService("MemoryStoreService")
local hashMap = MemoryStoreService:GetHashMap("HashMap1")
local setSuccess, _ = pcall(function()
return hashMap:SetAsync("User_1234", 1000, 30)
end)
if setSuccess then
print("Set succeeded.")
end
local item
local getSuccess, getError = pcall(function()
item = hashMap:GetAsync("User_1234")
end)
if getSuccess then
print(item)
else
warn(getError)
end
Erhalte Daten mit mehreren Schlüssel-Wert-Paaren
Um alle Schlüssel-Wert-Paare aus der Hash-Karte als einzelne Operation zu erhalten, rufen Sie MemoryStoreHashMap:ListItemsAsync() mit der gewünschten Seitengröße auf.Diese Funktion listet alle vorhandenen Schlüssel in einer pagierten Weise auf.Zum Beispiel ruft das folgende Codebeispiel bis zu 32 Elemente aus der Hash-Karte ab.
Gegenstände in einer Hash-Karte listen
local MemoryStoreService = game:GetService("MemoryStoreService")
local hashMap = MemoryStoreService:GetHashMap("HashMap1")
-- Erhalte eine Liste von Artikeln, 32 Artikel auf einmal
local success, pages = pcall(function()
return hashMap:ListItemsAsync(32)
end)
if success then
while true do
-- Aktuelle Seite abrufen
local entries = pages:GetCurrentPage()
-- Durch alle Schlüssel-Wert-Paare auf der Seite durchlaufen
for _, entry in ipairs(entries) do
print(entry.key .. " : " .. tostring(entry.value))
end
-- Überprüfe, ob die letzte Seite erreicht wurde
if pages.IsFinished then
break
else
print("----------")
-- Weiter zum nächsten Seite
pages:AdvanceToNextPageAsync()
end
end
end
Daten aktualisieren
Um den Wert eines Schlüssels aus einer Hash-Karte abzurufen und zu aktualisieren, rufe MemoryStoreHashMap:UpdateAsync() mit dem Schlüssel name auf, eine Rückruffunktion zum Aktualisieren des Schlüssels und eine Verfallszeit in Sekunden.
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 Ressourcenanzahl einer Ressource in einem gemeinsamen Inventar.UpdateAsync() stellt sicher, dass alle Spielerbeiträge ihren Weg in dieses gemeinsame Inventar finden, auch wenn diese Beiträge gleichzeitig erfolgen.In dieser Funktion wird auch eine maximale Ressourcenanzahl von 500 durchgesetzt.
Ressourcenanzahl aktualisieren für eine Ressource in einem gemeinsamen Inventar
local MemoryStoreService = game:GetService("MemoryStoreService")
local hashMap = MemoryStoreService:GetHashMap("ResourceInventory")
local function contributeResources(itemResource, addedCount)
local success, newResourceCount = pcall(function()
return hashMap:UpdateAsync(itemResource, function(resource)
resource = resource or {count = 0}
resource.count = resource.count + addedCount
-- stellen sicher, dass wir die maximale ressourcenanzahl nicht überschreiten
if resource.count > 500 then
resource.count = 500
end
return resource
end, 1200)
end)
if success then
print(newResourceCount)
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 MemoryStoreHashMap:RemoveAsync() verwenden, um einen Schlüssel aus der Hash-Karte zu entfernen und alle Daten in einer Speicherstandskarte zu löschen.
Schlüssel entfernen
Um einen Schlüssel aus der Hash-Karte zu entfernen, rufe MemoryStoreHashMap:RemoveAsync() mit einem Schlüssel Namen auf.
Entferne einen Schlüssel aus einer Hash-Karte
local MemoryStoreService = game:GetService("MemoryStoreService")
local hashMap = MemoryStoreService:GetHashMap("HashMap1")
local setSuccess, _ = pcall(function()
return hashMap:SetAsync("User_1234", 1000, 30)
end)
if setSuccess then
print("Set succeeded.")
end
local removeSuccess, removeError = pcall(function()
hashMap:RemoveAsync("User_1234")
end)
if not removeSuccess then
warn(removeError)
end
Alle Daten löschen
Um alle Daten in einer Hash-Karte zu löschen, listen Sie alle Ihre Artikel mit MemoryStoreHashMap:ListItemsAsync() auf und entfernen Sie sie dann mit MemoryStoreHashMap:RemoveAsync().
Lösche alle Daten in einer Hash-Karte
local MemoryStoreService = game:GetService("MemoryStoreService")
local hashMap = MemoryStoreService:GetHashMap("HashMap1")
-- Erhalte eine Liste von Artikeln, 32 Artikel auf einmal
local success, pages = pcall(function()
return hashMap:ListItemsAsync(32)
end)
if success then
while true do
-- Aktuelle Seite abrufen
local entries = pages:GetCurrentPage()
local removeSuccess = true
local removeError = nil
-- Durch alle Schlüssel-Wert-Paare auf der Seite durchlaufen
for _, entry in ipairs(entries) do
print(entry.key .. " : " .. tostring(entry.value))
removeSuccess, removeError = pcall(function()
hashMap:RemoveAsync(entry.key)
end)
if not removeSuccess then
warn(removeError)
end
end
-- Überprüfe, ob die letzte Seite erreicht wurde
if pages.IsFinished then
print("Finished deleting all data.")
break
else
print("----------")
-- Weiter zum nächsten Seite
pages:AdvanceToNextPageAsync()
end
end
end