管理数据存储

*此内容使用人工智能(Beta)翻译,可能包含错误。若要查看英文页面,请点按 此处

使用版本管理、列表和缓存来管理您的数据。

版本

版本发生在您 设置 、 更新 和 增量 数据时。 2> Class.GlobalDataStore:SetAsync()|SetAsync()2>、 5> Class.GlobalDataStore:UpdateAsync()|UpdateAsync()

版本的备份在新的写入覆盖它们后,即使30天后也会过期。最新版本永远不会过期。

以下函数执行版本操作:

函数描述

ListVersionsAsync()

返回一个 DataStoreVersionPages 实例,用于列出所有版本。您可以使用时间范围过滤版本。

GetVersionAsync()

使用钥匙的版本号检索特定版本的键匙。

RemoveVersionAsync()

删除特定版本的键匙。

此功能还会在保留以前版本的情况下创建一个墓碑版本。例如,如果您调用 RemoveAsync("User_1234") 然后尝试调用 GetAsync("User_1234") ,您将获得

您可以使用版本管理来处理用户请求。如果用户报告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

快速时刻

Snapshot Data Stores Open Cloud API 允许您每天在体验中打开数据存储库 API。在发布任何更改您的数据存储逻辑的体验更新之前,请确保您取得一个截图。在取得截图时,请确保您使用的数据存储库为最新版本。

例如,没有备份,如果您发布在 3:30 UTC 发布更新,导致数据丢失,那么在 3:00-3:30 UTC 之间写入的数据将覆盖已写入的数据。 如果您在 3:29 UTC 上拍摄备份,那么,覆盖的数据不会覆盖写入之前的任何数据,最新数据对于所有键的最新数据保留。

列表和前缀

数据存储允许您按前缀列出。例如,列出以 “d” 、 “do” 或 “dog” 为名称的任何键或数据存储,以便使用任何带有“dog” 前缀的键或数据存储。

您可以在列出所有数据存储或钥匙时指定一个前缀,并且只能返回与该前缀匹配的对象。 ListDataStoresAsync()ListKeysAsync() 函数都会返回一个 DataStoreListingPages 对象,您可以用它来枚举列表

函数描述
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 属性,可让您在列表中返回所有

当您使用 AllScopes 属性时,GetDataStore() 的第二个参数必须为空 ("")。


local DataStoreService = game:GetService("DataStoreService")
local options = Instance.new("DataStoreOptions")
options.AllScopes = true
local ds = DataStoreService:GetDataStore("DS1", "", options)

如果您启用 AllScopes 属性并在数据存商店中创建一个新钥匙,您必须总是在数据存储中指定该钥匙的范围以该钥匙的格式/键名。 如果您未指定,则会发生错误。 例如, gold/player_34545

global/K1house/K1
global/L2house/L2
global/M3house/M3

正在加速

使用缓存暂时存储数据从数据存储中获取数据,以提高性能并减少服务器的请求数量。例如,体验可以缓存其数据的副本,以便可以快速访问该数据,而无需另一个调用数据存商店。

使用:

GetVersionAsync()ListVersionsAsync()ListKeysAsync(),0> Class.DataStoreService:ListDataStoresAsync()|ListDataStoresAsync()0> 不实现缓存,并且总是从服

默认情况下,引擎使用 GetAsync() 来存储您从后端在本地缓存中获取的值,在四秒内。 您的 Class.GlobalDataStore:GetAsync()|GetAsync() 请求通过返回缓存

所有 GetAsync() 调用,从后端更新中恢复值不被缓存,立即更新缓存,并重新启动四秒后的计时器。

禁用缓存

要禁用缓存并且从服务器上最新获取价值的方式,请在 DataStoreGetOptions 调用中添加 GetAsync() 参数,并将 UseCache 设置为 2>Class.DataStoreGetOptions.UseCache|UseCache2> 属性

禁用缓存有助于您有多个服务器写入一个高频率的钥匙并需要从服务器上获得最新值,但它可能会导致您消耗更多的数据存储限制和 quot;,因为GetAsync() 请求通过“通过服务器限制”直接从您的2>数据存储限制2>上限计算。

serialization

Class.DataStoreService 将数据存储为 JSON 格式。当您在 Studio 中保存 Lua 数据时,Roblox 使用“串行化”过程将数据转换为 JSON 以便保存它在数据存储中。然后,Roblox 将您的数据转换回 Lua 并在另一个过程中称为“解码”。

串化和解码支持以下 Lua 数据类型:

  • 数量
    • 您不应该存储特殊数字值 inf-infnan ,因为这些值不遵守 JSON 标准。您无法使用 Open Cloud 访问包含这些值的钥匙。
  • 桌子
    • 桌子只能包含其他支持的数据类型
    • 如果表长为 0 ,数字键将被翻译为字符串

如果您尝试存储不协助持 serialization 的数据类型,您将要么:

  • 存储该类型的信息据时出错。
  • 成功存储该数据类型为 nil

要调试为什么您的数据类型存储为 nil ,您可以使用 JSONEncode 函数。当您将您的 Lua 数据类型传入此函数时,您将它返回在Roblox的数据存储中,这允许您预览和调查返回的数据。