버전 관리, 목록 관리 및 캐싱을 사용하여 데이터를 관리하십시오.
버전
버전은 다음을 수행할 때 발생합니다. set, update 및 증가 데이터를 설정할 때 버전이 생성됩니다. 함수 2> Class.GlobalDataStore:
백업은 새로운 쓰기가 이전 백업을 덮어쓸 때 30일 후에 만료됩니다. 최신 버전은 만료되지 않습니다.
다음 함수는 버전 관리 작업을 수행합니다.
함수 | 설명 |
---|---|
모든 버전을 열거하려면 사용할 수 있는 DataStoreVersionPages 인스턴스를 반환하여 모든 버전 번호를 열거할 수 있습니다. 버전을 필터링하려면 시간 범위를 사용할 수 있습니다. | |
키의 버전 번호를 사용하여 특정 버전의 키를 검색합니다. | |
특정 버전의 키를 삭제합니다. 이 함수는 이전 버전을 유지하면서 톰버 스톤 버전을 만듭니다. 예를 들어, RemoveAsync("User_1234") 를 호출한 다음 GetAsync("User |
버전 관리를 사용하여 사용자 요청을 처리할 수 있습니다. 2020-10-09T01:42에 문제가 발생했다고 보고한 사용자가 다음 예를 사용하여 데이터를 이전 버전으로 되돌릴 수 있습니다.
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)
-- 지정된 시간에 가장 가까운 버전을 가져옵니다.
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
-- 가장 최근의 버전을 읽습니다.
local closestEntry = items[1]
local success, value, info = pcall(function()
return experienceStore:GetVersionAsync(DATA_STORE_KEY, closestEntry.Version)
end)
-- 가장 최근의 값을 가장 가까운 버전으로 덮어씁니다.
if success then
local setOptions = Instance.new("DataStoreSetOptions")
setOptions:SetMetadata(info:GetMetadata())
experienceStore:SetAsync(DATA_STORE_KEY, value, nil, setOptions)
end
else
-- 입력 항목 없음
end
end
스냅샷
스냅샷 데이터 스토어 오픈 클라우드 API를 사용하면 경험에서 모든 데이터 저장소의 스냅샷을 하루에 한 번 가져올 수 있습니다. 데이터 저장소 로직을 변경하는 경험 업데이트를 게시하기 전에 스냅샷을 찍는 것이 좋습니다. 스냅샷을 �
예를 들어, 스냅샷이 없으면 3:30 UTC에 업데이트를 게시하여 데이터 손상을 일으키면 손상된 데이터가 3:00-3:30 UTC 사이에 쓰여진 모든 데이터를 덮어씁니다. 스냅샷을 3:29 UTC에 가져가면 손
목록 및 접두사
데이터 저장소를 사용하면 이름의 첫 번째 n 자를 기준으로 목록을 나열할 수 있습니다. 예를 들어, 이름의 첫 번째 "d"자, "do"자 또는 "dog"자를 위한 키 또는 데이터 저장소의 프리픽스를 사용하여 목록을 나열할 수 있습니다.
모든 데이터 저장소 또는 키를 나열할 때 접두사를 지정하고 해당 접두사에 일치하는 개체만 가져옵니다. 모든 ListDataStoresAsync() 및 ListKeysAsync() 함수는 Class
함수 | 설명 |
---|---|
ListDataStoresAsync() | 모든 데이터 저장소를 나열합니다. |
ListKeysAsync() | 데이터 상점있는 모든 키를 나열합니다. |
범위
데이터 스토어의 모든 키에는 기본 글로벌 범위가 있습니다. 고유한 문자열을 범위로 설정하여 GetDataStore() 의 두 번째 매개 변수에 범위를 조직할 수 있습니다. 이렇게 하면 모든 키에 대한 모든 작업에 대해 범위를 시작으로 설정합니다.
키 | 범위 |
---|---|
houses/User_1234 | 하우스 |
pets/User_1234 | 애완 동물 |
inventory/User_1234 | 인벤토리 |
데이터 저장소 이름, 범위 및 키가 결합된 키는 고유한 키를 식별합니다. 범위가 있는 키를 식별하려면 세 가지 값 모두 필요합니다. 예를 들어, 전역 키인 User_1234를 다음과 같이 읽을 수 있습니다.
local DataStoreService = game:GetService("DataStoreService")
local inventoryStore = DataStoreService:GetDataStore("PlayerInventory")
local success, currentGold = pcall(function()
return inventoryStore:GetAsync("User_1234")
end)
그러나 키 User_1234 가 골드 범위를 가지고 있다면, 다음과 같이만 읽을 수 있습니다.
local DataStoreService = game:GetService("DataStoreService")
local inventoryStore = DataStoreService:GetDataStore("PlayerInventory", "gold")
local success, currentGold = pcall(function()
return inventoryStore:GetAsync("User_1234")
end)
모든 스코프 속성
DataStoreOptions 에는 AllScopes 속성이 포함되어 있으므로 목록에
Class.DataStoreService:GetDataStore()|GetDataStore() 속성에서 두 번째 매개 변수는 비어 있는 문자열(GetDataStore())이어야 합니다.
local DataStoreService = game:GetService("DataStoreService")local options = Instance.new("DataStoreOptions")options.AllScopes = truelocal ds = DataStoreService:GetDataStore("DS1", "", options)
Class.DataStoreOptions.AllScopes|AllScopes 속성을 활성화하고 데이터 상점새로운 키를 만들면 항상 키에 대한 범위를 지정해야 합니다. 그렇지 않으면 API가 오류를 표시합니다. 예를 들어,
global/K1 | house/K1 |
global/L2 | house/L2 |
global/M3 | house/M3 |
캐싱
캐싱을 사용하여 데이터 스토어에서 데이터를 임시로 저장하여 성능을 향상하고 서버에 요청을 더 적게 하는 데 도움이 됩니다. 예를 들어, 경험은 데이터 스토어의 복사본을 캐시하여 데이터에 액세스할 수 있으므로 데이터 상점다시 호출할 필요 없이 데이터에 액세스할 수 있습니다.
캐싱은 다음을 사용하여 데이터 저장소 키에 수행하는 수정에 적용됩니다.
- GetAsync() 에 대한 데이터 읽기 .
- SetAsync() 를 데이터 생성을 위해 사용합니다.
- UpdateAsync() 를 데이터 업데이트 에 사용합니다.
- IncrementAsync() 에 대한 데이터 증가 잠금.
- RemoveAsync() 에 대한 데이터 제거 .
GetVersionAsync() , ListVersionsAsync() , ListKeysAsync() 및 0> Class.DataStoreService:ListDataStoresAsync()|ListDataStoresAsync()0> 은 캐싱을
기본적으로 엔진은 GetAsync() 를 사용하여 백엔드에서 검색한 값을 로컬 캐시에 저장하기 위해 4초 동안 값을 로컬 �
캐시되지 않은 값을 검색하는 모든 GetAsync() 호출은 즉시 캐시를 업데이트하고 4초 타이머를 다시 시작합니다.
캐싱 비활성화
캐시를 비활성화하고 서버에서 가장 최근 값을 검색하려는 캐시를 사용하지 않도록 하려면 DataStoreGetOptions 매개 변수를 Class.GlobalDataStore:GetAsync()|GetAsync() 호출에 추가하고 Class.DataStoreGetOptions.UseCache|UseCache
캐싱을 비활성화하면 키에 높은 주파수를 가진 여러 서버가 있으면 서버에서 가장 최근의 값을 가져오는 데 도움이 됩니다. 그러나 이로 인해 데이터 저장소 한도 및 쿼터를 초과하는 Class.GlobalDataStore:GetAsync()|GetAsync() 요청이 항상 서
serialization
Class.DataStoreService 는 데이터를 JSON 형식으로 저장합니다. Studio에서 Lua 데이터를 저장하면 Roblox는 데이터를 JSON으로 변환하기 위해 프로세스를 시작하고 데이터 스토어에 저장합니다. Roblox는 데이터를 다시 Lua로 변환하고 데이터 스토어에 저장하는 프로세스를 다시 시작합니다.
serialization 및 deserialization은 Lua 데이터 형식을 다음과 같이 지원합니다.
- 숫자
- 특수 숫자 값 inf, -inf 및 nan 을 저장하지 마십시오, 왜냐하면 이 값은 JSON 표준에 부합하지 않습니다. Open Cloud에서 키에 액세스할 수 없습니다.
- 테이블
- 테이블에는 다른 지원 데이터 형식만 포함될 수 있습니다.
- 테이블 길이가 0인 경우 숫자 열이 문자열로 번역됩니다.Numeric keys are translated into strings if the length of the table is 0
직렬화가 지원하지 않는 데이터 형식을 저장하려면 다음 중 하나를 수행합니다.If you try to store a data type that serialization doesn't support, you either:
- 데이터 유형을 저장하지 못하고 오류 메시지를 표시합니다.
- 데이터 유형을 nil 으로 저장하세요.
데이터 형식이 nil 로 저장되는 이유를 디버그하려면 JSONEncode 함수를 사용할 수 있습니다. Lua 데이터 형식을 이 함수에 전송하면 Roblox가 데이터 스토어에 저장하는 것과 같은 형식으로 결과를 반환합니다. 이를 미리 보고 조사할 수 있