Gestisci i tuoi dati usando la versioning, la lista e la cache.
Versione
La versionizzazione avviene quando impostate set, aggiornate e incrementate i dati. Le funzioni 1> Class.GlobalDataStore:SetAsync()|SetAsync()1> , 4> Class.GlobalDataStore:Update
I backup versionati scadono 30 giorni dopo un nuovo write overwrzes them. The latest version never expires.
Le seguenti funzioni eseguono operazioni di versionamento:
Funzione | Descrizione |
---|---|
Elenca tutte le versioni per una chiave restituendo un'istanza DataStoreVersionPages che puoi utilizzare per contare tutti i numeri di versione. Puoi filtrare le versioni utilizzando un intervallo di tempo. | |
Recupera una versione specifica di una chiave utilizzando il suo numero di versione. | |
Elimina una versione specifica di una chiave. Questa funzione crea anche una versione tombstone mentre si mantiene la versione precedente. Ad esempio, se chiami RemoveAsync("User_1234") e poi provi a chiamare GetAsync("User_1234"), ottieni nil</ |
Puoi usare la versionizzazione per gestire le richieste dell'utente. Se un utente segnala che un problema si è verificato il 2020-10-09T01:42, puoi ripristinare i dati a una versione precedente usando il seguente esempio:
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)
-- Ottiene la versione più vicina al tempo specificato
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
-- Legge la versione più recente
local closestEntry = items[1]
local success, value, info = pcall(function()
return experienceStore:GetVersionAsync(DATA_STORE_KEY, closestEntry.Version)
end)
-- Ripristina il valore corrente sovrascrivendolo con la versione più recente
if success then
local setOptions = Instance.new("DataStoreSetOptions")
setOptions:SetMetadata(info:GetMetadata())
experienceStore:SetAsync(DATA_STORE_KEY, value, nil, setOptions)
end
else
-- Nessun risultato trovato
end
end
Raccolta
Il Snapshot Data Stores Open Cloud API ti consente di fare uno screenshot di tutti i datastore in un'esperienza una volta al giorno. Prima di pubblicare qualsiasi aggiornamento dell'esperienza che cambia la tua logica di archiviazione dei dati, assicurati di fare uno screenshot. Prendendo uno screenshot garantisce che tu abbia l'ultima versione disponibile dei datastore dalla versione precedente dell'esperienza.
Ad esempio, senza uno screenshot, se pubblichi un aggiornamento alle 3:30 UTC che causa la corruzione dei dati, i dati corrotti sovrascrive i dati scritti tra 3:00-3:30 UTC. Se prendi uno screenshot alle 3:29 UTC, tuttavia, i dati corrotti non sovrascrive nulla scritto prima di 3:29 UTC, e i dati più recenti per tutte le chiavi scritte tra
Liste e Prefissi
I magazzini di dati ti consentono di elencare in base al prefisso. Ad esempio, elencare in base ai primi n caratteri di un nome, come "d" , "do" o "dog" per qualsiasi key o magazzino di dati con un prefisso di "dog".
Puoi specificare un prefisso quando elencare tutti i datastore o chiavi, e ottenere solo oggetti che corrispondono a quel prefisso. Entrambi ListDataStoresAsync() e ListKeysAsync() funzioni restituiscono un oggetto DataStoreListingPages che puoi utilizzare
Funzione | Descrizione |
---|---|
ListDataStoresAsync() | Elenca tutti i negozi di dati. |
ListKeysAsync() | Elenca tutte le chiavi in un Negoziodi dati. |
Campi di visione
Ogni chiave in un data store ha uno scope globale predefinito. Puoi organizzare le chiavi ulteriormente impostando una stringa unica come uno scope per il secondo parametro di GetDataStore() . Questo attacca automaticamente lo scope all'inizio di tutte le operazioni eseguite sul data Negozio.
Chiave | Scopo |
---|---|
houses/User_1234 | case |
pets/User_1234 | animale domestico |
inventory/User_1234 | inventario, reportorio |
La combinazione di nome del magazzino dati, scala e chiave identifica unica e distinta una chiave. Tutti e tre i valori sono richiesti per identificare una chiave con una scala. Ad esempio, puoi leggere una chiave globale chiamata User_1234 come:
local DataStoreService = game:GetService("DataStoreService")
local inventoryStore = DataStoreService:GetDataStore("PlayerInventory")
local success, currentGold = pcall(function()
return inventoryStore:GetAsync("User_1234")
end)
Se la chiave User_1234 ha uno scopo d'oro, però, puoi leggere solo come:
local DataStoreService = game:GetService("DataStoreService")
local inventoryStore = DataStoreService:GetDataStore("PlayerInventory", "gold")
local success, currentGold = pcall(function()
return inventoryStore:GetAsync("User_1234")
end)
Proprietà di tutti gli scope
DataStoreOptions contiene una proprietà AllScopes che ti consente di restituire le chiavi da tutti gli <
Quando si utilizza la ProprietàAllScopes, il secondo parametro di GetDataStore() deve essere una stringa vuota ( "" ).
local DataStoreService = game:GetService("DataStoreService")local options = Instance.new("DataStoreOptions")options.AllScopes = truelocal ds = DataStoreService:GetDataStore("DS1", "", options)
Se abiliti la proprietà AllScopes e crei una nuova chiave nel data Negozio, devi sempre specificare uno scopo per quella chiave nel formato di uno scopo/keyname. Se non lo fai, le API mostreranno un errore. Ad esempio, gold/player_34545 è accettabile con l'oro
global/K1 | house/K1 |
global/L2 | house/L2 |
global/M3 | house/M3 |
Caching
Usa il cache per memorizzare temporaneamente i dati dai magazzini di dati per migliorare le prestazioni e ridurre il numero di richieste fatte al Server. Ad esempio, un'esperienza può memorizzare una copia dei suoi dati in modo che possa accedervi rapidamente senza dover fare un'altra chiamata al data Negozio.
Il cache si applica alle modifiche che apporti alle chiavi del magazzino dei dati usando:
- GetAsync() per leggere i dati .
- SetAsync() per creare dati .
- RemoveAsync() per rimuovi i dati .
GetVersionAsync() , ListVersionsAsync() , ListKeysAsync() e 0> Class.DataStoreService:ListDataStoresAsync()|ListDataStoresAsync()0> non implementano la cache e ottengono sempre i dat
Per impostazione predefinita, il motore utilizza GetAsync() per memorizzare i valori che recuperi dal backend in una cache locale per quattro secondi. Inoltre, GetAsync() richiede le
Tutti GetAsync() chiamate che recuperano un valore non memorizzato dall'aggiornamento del backend aggiornano immediatamente la cache e riavviano il timer di quattro secondi.
Disattivare la cache
Per disabilitare la cache e ottenere l'ultimo valore aggiornato dai server, aggiungi il parametro DataStoreGetOptions al tuo Class.GlobalDataStore:GetAsync()|GetAsync() chiamata e imposta la proprietà Class.DataStoreGetOptions su 2>2>
Disabilitare la cache è utile se hai più server che scrivono a una chiave con una frequenza elevata e devi ottenere il valore più recente dai server. Tuttavia, può causarti di consumare più dei tuoi limiti e quotazioni dei dati , poiché le richieste Class.GlobalDataStore:GetAsync()|GetAsync() scavalcano sempre la cache, contando sempre il tuo flusso di dati e i limiti dei server.
Serializzazione
Il DataStoreService memorizza i dati in formato JSON. Quando salvi i dati in Lua in Studio, Roblox usa un processo chiamato serializzazione per convertire quei dati in JSON per salvarli negli archivi dei dati. Roblox poi converte i tuoi dati in Lua e li restituisce in un altro processo chiamato deserializzazione.
La serializzazione e la deserializzazione supportano i seguenti tipi di dati Lua:
- Numeri
- Non dovresti memorizzare i valori numerici speciali inf , -inf e nan, poiché questi valori non sono conformi agli standard JSON. Non puoi accedere ai chiavi che contengono questi valori con Open Cloud.
- Tabelle
- Le tabelle devono contenere solo altri tipi di dati supportati
- Le chiavi numeriche vengono tradotte in stringhe se la lunghezza della tabella è 0
Se tenti di memorizzare un tipo di dati che la serializzazione non Assistenza, devi:
- Falliti nel memorizzare quel tipo di dati e ottieni un Messaggiodi errore.
- Riusci a memorizzare quel tipo di dati come nil .
Per debuggare il motivo per cui il tuo tipo di dati viene archiviato come nil, puoi usare la funzione JSONEncode. Quando passi il tuo tipo di dati in questa funzione, ricevi il suo ritorno nel formato Roblox che memorizza i dati, in modo da poter visualizzare e investigare i dati restituiti.