Zarządzaj danymi za pomocą wersji, listy i zapisu.
Wersjonowanie
Aktualizacja wersji zdarza się, gdy ustawisz set, aktualizuj i zwiększ dane. Funkcje 2> Class.GlobalDataStore:SetAsync()|SetAsync()2> , 5>
Zarchiwizowane zapiski wygasają po 30 dniach od ponownego zapisu. Nowsza wersja zapisków nigdy się nie wygasa.
Następujące funkcje wykonują operacje wersji:
Funkcja | Opis |
---|---|
Lista wszystkich wersji dla klucza, zwracając instancję DataStoreVersionPages, którą możesz użyć do liczenia wszystkich liczb wersji. Możesz filtrować wersje używając zakresu czasowego. | |
Odzyskuje określoną wersję klucza używając numery wersji klucza. | |
Usuwa określoną wersję klucza. Funkcja ta tworzy również wersję nagrobka, gdy utrzymuje poprzednią wersję. Na przykład, jeśli nazwiesz RemoveAsync("User_1234") i następnie spróbujesz nazwać GetAsync("User_12 |
Możesz użyć wersji, aby zarządzać wnioskami użytkowników. Jeśli użytkownik zgłasza, że problem nastąpił w dniu 2020-10-09T01:42, możesz przywrócić dane do poprzedniej wersji używając następuющеgo przykładu:
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)
-- Dostaje najbliższą datę wersji
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
-- Czyta najbliższą wersję
local closestEntry = items[1]
local success, value, info = pcall(function()
return experienceStore:GetVersionAsync(DATA_STORE_KEY, closestEntry.Version)
end)
-- Przywraca bieżącą wartość poprzez przeciągnięcie jej do najbliższej wersji
if success then
local setOptions = Instance.new("DataStoreSetOptions")
setOptions:SetMetadata(info:GetMetadata())
experienceStore:SetAsync(DATA_STORE_KEY, value, nil, setOptions)
end
else
-- Nie znaleziono wyników
end
end
Zdjęcia
Snapshot Data Stores Open Cloud API umożliwia cię zrobienie zdjęcia ekranu wszystkich przechowywanych danych w doświadczeniu raz dzien. Przed opublikowaniem dowolnej aktualizacji przechowywania danych, która zmienia twoją logikę przechowywania danych, upewnij się, że zrobiłeś zdjęcie ekranu. Zdjęcie ekranu gwarantuje, że masz najnowsze dane dostępne z poprzedniego wersji
Na przykład, bez zdjęcia wersji, jeśli opublikujesz aktualizację o 3:30 UTC, która powoduje uszkodzenie danych, uszkodzone dane piszą wszystkie dane napisane między 3:00-3:30 UTC. Jeśli jednak zrobisz zdjęcie wersji w 3:29 UTC, to uszkodzone dane nie piszą nic napisanych między 3:00-
Listy i prefiksy
Magazyny danych pozwalają na listowanie według prefiksu. Na przykład, listowanie według pierwszych n znaków imienia, takich jak "d" lub "do" dla dowolnego klucza lub magazynu danych z prefixem "dog".
Możesz określić prefiks, gdy wymieniasz wszystkie magazyny danych lub klucze, i wrócić tylko do obiektów, które odpowiadają temu prefiksowi. Zarówno ListDataStoresAsync() i ListKeysAsync() funkcje zwracają obie
Funkcja | Opis |
---|---|
ListDataStoresAsync() | Listuje wszystkie magazyny danych. |
ListKeysAsync() | Listuje wszystkie klucze w sklepdanych. |
Zakresy
Każdy klucz w magazynie danych ma domyślną globalną skalę. Możesz zorganizować klucze dalej poprzez ustawienie unikalnej wartości jako skalę dla drugiego parametru GetDataStore() . To automatycznie przywiązuje skalę na początek wszystkich kluczy w wszystkich operacjach wykonanych na danych.
Klucz | Zakres |
---|---|
houses/User_1234 | domy |
pets/User_1234 | zwierzęta |
inventory/User_1234 | wyposażenie |
Kompozycja nazwy magazynu danych, zakresu i klucza unikalnie identyfikuje klucz. Wszystkie trzy wartości są wymagane do identyfikacji klucza z zakresem. Na przykład, możesz czytać globalny klucz nazyający się User_1234 jako:
local DataStoreService = game:GetService("DataStoreService")
local inventoryStore = DataStoreService:GetDataStore("PlayerInventory")
local success, currentGold = pcall(function()
return inventoryStore:GetAsync("User_1234")
end)
Jeśli klucz User_1234 ma zakres złota, możesz go czytać tylko jako:
local DataStoreService = game:GetService("DataStoreService")
local inventoryStore = DataStoreService:GetDataStore("PlayerInventory", "gold")
local success, currentGold = pcall(function()
return inventoryStore:GetAsync("User_1234")
end)
Wszystkie oskopowe właściwości
DataStoreOptions zawiera właściwość AllScopes, która pozwala na zwracanie kluczy z wsz
Gdy używasz właściwości AllScopes, drugi parametr Class.DataStoreService:GetDataStore()|GetDataStore() musi być pustą wartością ( "" ).
local DataStoreService = game:GetService("DataStoreService")local options = Instance.new("DataStoreOptions")options.AllScopes = truelocal ds = DataStoreService:GetDataStore("DS1", "", options)
Jeśli włączysz właściwość AllScopes i utworzysz nowy klucz w magazynie danych, musisz zawsze określić zakres dla tej wartości w formie scope/keyname. Jeśli nie, API wyświetla błąd. Na przykład, gold/player_34545
global/K1 | house/K1 |
global/L2 | house/L2 |
global/M3 | house/M3 |
Cacheowanie
Użyj kachingu, aby tymczasowo przechowywać dane z magazynów danych, aby poprawić wydajność i zmniejszyć liczbę wniosków wysyłanych na serwer. Na przykład doświadczenie może przechować kopię swoich danych, aby móc szybko uzyskać dostęp do tych danych bez konieczności ponownego wezwania do sklepdanych.
Kaching stosuje się do zmian, które dokonujesz w kluczach magazynu danych przy użyciu:
GetVersionAsync() , ListVersionsAsync() , ListKeysAsync() i 0> Class.DataStoreService:ListDataStoresAsync()|ListDataStoresAsync()0> nie wdrożone wtyczki pamię
Domyślnie silnik używa GetAsync() , aby przechować wartości, które odzyskujesz z boku serwera w lokalnej pamięci, przez cztery sekundy. Również domyślnie, Class.Global
Wszystkie GetAsync() wezwania, które odczytują wartość nieprzechowywanych z aktualizacji back-end, natychmiastowo odczytują pamięć i ponownie uruchomują czteromiesięczny odliczacz czasu.
Wyłączanie podszycia
Aby wyłączyć kaching i zrezygnować z używania cache, aby odzyskać najnowszą wartość z serwerów, dodaj parametr DataStoreGetOptions do swojego wezwania GetAsync() i ustaw właściwość UseCache na
Wyłączenie kachingu jest użyteczne, jeśli masz wiele serwerów, które pisać do klucza z dużą częstotliwością i potrzebujesz uzyskać najnowszą wartość z serwerów. Jest to jednak może powodować, że konsumujesz więcej swoich przechowywanie danych limity i kwoty, ponieważ Class.GlobalDataStore:GetAsync()|GetAsync() zawsze omiń k
Serializacja
Class.DataStoreService przechowuje dane w formacie JSON. Gdy zapiszesz dane Lua w Studio, Roblox używa procesu zwanego serializacją, aby przekonwertować te dane w JSON, aby zapisać je w magazynach danych. Następnie Roblox konwertuje twoje dane z powrotem do Lua i wysyła je do ciebie w innym procesie zwanym deseryralizacją.
Serializacja i odseryalizacja wspierają następujące rodzaje danych Lua:
- Liczby
- Nie powinieneś przechowywać specjalnych wartości liczbowych inf, -inf i nan, ponieważ te wartości nie zgodzą się z wymaganiami JSON. Nie możesz uzyskać dostępu do kluczy, które zawierają te wartości z Open Cloud.
- Tabela
- Tabela musi zawierać tylko inne wymaganymi typy danych
- Liczby kluczy są przetłumaczane na struny, jeśli długość tabeli wynosi 0
Jeśli próbujesz przechować dany typ danych, którego nie wspiera serweryzacja, to:
- Nie udało się zapisać tego typu danych i otrzymano wiadomość.
- Udane jest zapisanie tego typu danych jako nil .
Aby debugować, dlaczego twój typ danych jest zapisywany jako nil, możesz użyć funkcji JSONEncode. Gdy przekażesz swoje dane typu Lua w tę funkcję, otrzymasz je w formie, jaką Roblox miałby zapisane z dostawcami danych, co umożliwia zapowiedź i zbadanie zwróconych danych.