Verwalten Sie Ihre Daten mit Versionierung, Liste und Caching.
Versionierung
Die Versionierung wird verwendet, wenn Sie Class.GlobalDataStore:SetAsync()|SetAsync() , Class.GlobalDataStore:UpdateAsync()|UpdateAsync() und Class.GlobalDataStore:IncrementAsync()|IncrementAsync() Daten erhalten. Die Funktionen 2>Class.
Abgesicherte Backups erlöschen 30 Tage nachdem eine neue Schreiben sie überschreibt. Die neueste Version ist niemals abgelaufen.
Die folgenden Funktionen führen Versionierungsoperationen aus:
Funktion | Beschreibung |
---|---|
Listen alle Versionen für einen Schlüssel, indem Sie eine DataStoreVersionPages Instanz zurückgeben, die Sie verwenden können, um alle Versionennummern zu zählen. Sie können Versionen filtern, indem Sie einen Zeitbereich verwenden. | |
Rufe eine bestimmte Version eines Schlüssels mit der Schlüssel-Versionsnummer ab. | |
Löscht eine bestimmte Version eines Schlüssels. Diese Funktion erstellt auch eine Grabsteinversion, während die vorherige Version beibehalten wird. Zum Beispiel, wenn Sie RemoveAsync("User_1234") und dann versuchen, GetAsync("User_1234") zu rufen, er |
Sie können Versionierung verwenden, um Benutzeranfragen zu behandeln. Wenn ein Benutzer berichtet, dass ein Problem am 2020-10-09T01:42 aufgetreten ist, kannst du Daten mit der folgenden Beispielanleitung auf eine frühere Version zurückkehren:
local DataStoreService = game:GetService("DataStoreService")
local experienceStore = DataStoreService:GetDataStore("PlayerExperience")
local DATA_STORE_KEY = "User_1234"
local maxDate = DateTime.fromUniversalTime(2020, 10, 09, 01, 42)
-- Holen Sie sich die Version, die am nächsten der gegebenen Zeit ist
local listSuccess, pages = pcall(function()
return experienceStore:ListVersionsAsync(DATA_STORE_KEY, Enum.SortDirection.Descending, nil, maxDate.UnixTimestampMillis)
end)
if listSuccess then
local items = pages:GetCurrentPage()
if #items > 0 then
-- Lädt die nächste Version
local closestEntry = items[1]
local success, value, info = pcall(function()
return experienceStore:GetVersionAsync(DATA_STORE_KEY, closestEntry.Version)
end)
-- Restauriert den aktuellen Wert, indem er ihn mit der nächsten Version überschreibt
if success then
local setOptions = Instance.new("DataStoreSetOptions")
setOptions:SetMetadata(info:GetMetadata())
experienceStore:SetAsync(DATA_STORE_KEY, value, nil, setOptions)
end
else
-- Keine Einreichungen gefunden
end
end
Schnappschüsse
Die Snapshot-Daten-Stores Open Cloud-API ermöglicht es Ihnen, einen Snapshot aller Daten-Stores in einem Erlebnis einmal pro Tag zu nehmen. Bevor Sie ein Erlebnis-Update veröffentlichen, das Ihre Daten-Storage-Logik ändert, stellen Sie sicher, dass Sie einen Snapshot nehmen. Wenn Sie einen Snapshot nehmen, garantieren Sie, dass Sie die neuesten Daten aus der vorherigen Version des Erlebnisses haben.
Zum Beispiel, ohne einen Snapshot, wenn Sie ein Update um 3:30 UTC veröffentlichen, das Datenkorruption verursacht, überschreibt das korrupte Daten jedes geschriebene Daten zwischen 3:00-3:30 UTC. Wenn Sie jedoch einen Snapshot um 3:29 UTC nehmen, überschreibt das korrupte Daten nichts, was vor 3:29 UTC geschrieben wurde, und die neuesten Daten für alle Schlüssel, die zwischen 3
Listen und Präfixe
Datenspeicherungen ermöglichen es Ihnen, nach dem Präfix zu listen. Zum Beispiel, listen Sie nach den ersten n Zeichen eines Namens, wie "d" , "do" oder "dog" für jeden Schlüssel oder Datenspeicher mit einem Präfix von "dog".
Du kannst ein Präfix angeben, wenn du alle Daten-Stores oder Schlüssel aufzählst, und nur Objekte zurückerhalten, die diesem Präfix entsprechen. Beide ListDataStoresAsync() und ListKeysAsync()-Funktionen geben ein DataStoreListingPages -Obj
Funktion | Beschreibung |
---|---|
ListDataStoresAsync() | Enthält alle Daten-Stores. |
ListKeysAsync() | Enthält alle Schlüssel in einem Daten-Store. |
Scope
Jeder Schlüssel in einem Daten-Store hat ein Standard- globale Zielfeld. Sie können Schlüssel weiter organisieren, indem Sie einen einzigartigen Strung als Zielfeld für den zweiten Parameter von GetDataStore() festlegen. Dies fügt automatisch das Zielfeld am Beginn aller Schlüssel in allen Operationen an.
Schlüssel | Zielfernrohr |
---|---|
houses/User_1234 | häuser |
pets/User_1234 | haustiere |
inventory/User_1234 | inventar |
Die Kombination von Daten-Store-Name, Zoom und Schlüssel-Einzigartigkeit identifiziert ein Schlüssel. Alle drei Werte sind erforderlich, um einen Schlüssel mit einem Zoom zu identifizieren. Zum Beispiel können Sie einen globalen Schlüssel namens User_1234 als Folgendes lesen:
local DataStoreService = game:GetService("DataStoreService")
local inventoryStore = DataStoreService:GetDataStore("PlayerInventory")
local success, currentGold = pcall(function()
return inventoryStore:GetAsync("User_1234")
end)
Wenn der Schlüssel User_1234 jedoch ein Gold-Zielfernrohr hat, kannst du es nur als Folgendes lesen:
local DataStoreService = game:GetService("DataStoreService")
local inventoryStore = DataStoreService:GetDataStore("PlayerInventory", "gold")
local success, currentGold = pcall(function()
return inventoryStore:GetAsync("User_1234")
end)
AllScopes-Eigenschaft
DataStoreOptions enthält eine AllScopes -Eigenschaft, die es Ihnen ermöglicht, Schlüss
Wenn Sie die EigenschaftenAllScopes verwenden, muss der zweite Parameter von GetDataStore() eine leere Zeichenfolge ( "" ) sein.
local DataStoreService = game:GetService("DataStoreService")local options = Instance.new("DataStoreOptions")options.AllScopes = truelocal ds = DataStoreService:GetDataStore("DS1", "", options)
Wenn du die AllScopes Eigenschaft aktivierst und einen neuen Schlüssel im Daten-Store erstellst, musst du immer einen Schlüssel für diesen Schlüssel im Format von Schlüsselname/Schlüsselname angeben. Wenn du nicht, zeigen die APIs einen Fehler an. Zum Beispiel ist gold/player_34
global/K1 | house/K1 |
global/L2 | house/L2 |
global/M3 | house/M3 |
Cache
Verwenden Sie das Caching, um vorübergehend Daten aus Daten-Stores zu speichern, um die Leistung zu verbessern und die Anzahl der Anfragen, die an den Server gemacht werden, zu reduzieren. Zum Beispiel kann ein Erlebnis eine Kopie seiner Daten speichern, damit es auf diesen Daten schnell zugreifen kann, ohne einen weiteren Anruf zum Speichern der Daten zu haben.
Das Caching gilt für Änderungen, die Sie an Datenstoreschlüsseln vornehmen, mit denen Sie:
- GetAsync() zu Daten lesen .
GetVersionAsync() , ListVersionsAsync() , ListKeysAsync() und 0> Class.DataStoreService:ListDataStoresAsync()|ListDataStoresAsync()0> implementieren nicht den Caching und holen immer die neuesten Daten vom Service
Standardmäßig verwendet der Engine GetAsync() , um Werte, die Sie vom Backend in einer lokalenCache für vier Sekunden abrufen, in den lokalenCache zurückzukehren. Standardmäßig fordern die Abrufe von Class.Global
Alle GetAsync() Aufrufe, die einen Wert nicht vomCache abrufen, aktualisieren sofort denCache und starten den vierten Sekunden-Timer neu.
Cache deaktivieren
Um das Caching zu deaktivieren und sich aus dem Caching auszusteigen, um den most up-to-date value from den Servern zu erhalten, fügen Sie den DataStoreGetOptions -Parameter zu Ihrem Class.GlobalDataStore:GetAsync()|GetAsync() -Anruf hinzu und setzen Sie die Class.DataStoreGetOptions.UseCache|UseCache
Die Nichtaktivierung von Caching ist nützlich, wenn Sie mehrere Server haben, die auf eine Schlüssel mit hoher Frequenz schreiben und den neuesten Wert von Servern erhalten müssen. jedoch kann es dazu führen, dass Sie mehr von Ihren Datenspeicher-Limits und Quoten konsumieren, da Class.GlobalDataStore:GetAsync()|GetAsync() -Anfragen immer die Caching-Ansicht zählen, wenn Sie durch Ihre Server-Limits und Quoten.
SerIALisierung
Der DataStoreService speichert Daten im JSON-Format. Wenn Sie Lua-Daten in Studio speichern, verwendet Roblox einen Prozess namens SerIALisierung, um dieses Daten in JSON umzuwandeln, um es in Daten-Stores zu speichern. Roblox verwandelt dann Ihre Daten zurück in Lua und gibt sie in einem anderen Prozess namens Deserialisierung an Sie zurück.
Die Serialisierung und Deserialisierung unterstützt die folgenden Lua-Datentypen:
- Zahlen
- Du solltest die besonderen numerischen Werte nicht inf, -inf und nan speichern, da diese Werte nicht den JSON-Standards entsprechen. Du kannst nicht auf Schlüssel zugreifen, die diese Werte enthalten.
- Tabelle
- Tabelle müssen nur andere unterstützte Datenarten enthalten
- Es werden Zahlentasten in Strings übersetzt, wenn die Länge der Tabelle 0 ist
Wenn du versuchst, einen Datentyp zu speichern, den die SerIALisierung nicht Support, hast du entweder:
- Stoße auf diesen Datentyp und erhalte eine Fehler-Nachricht.
- Erfolgreich speichern Sie diesen Datentyp als nil .
Um zu debuggen, warum deine Daten als nil gespeichert werden, kannst du die JSONEncode Funktion verwenden. Wenn du deinen Lua-Datentyp in diese Funktion übergibst, erhältst du ihn zurück in der Form, wie Roblox ihn mit Daten-Stores gespeichert hätte, damit du die zurückgegebenen Daten voranschauen und untersuchen kannst.