记忆存储排序地图

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

排序地图数据结构的存储器可以存储频繁的内存数据,例如键值对,并且带有可选的排序键,以便在排序键和键的基础上进行特定顺序的数据组合,而不是队列。排序地图的键入顺序不会决定处理顺序,因此排序地图对于排序基础数据组织实施在体验中

限制

除了数据结构大小限制,排序的地图有一个钥匙大小限制为 128 个字符,一个值大小限制为 32 KB,一个排序键大小限制为 128 个字符。

如果您需要为您的体验存储超出此限制的数据,您可以采用碎片技术将它们拆分并分配到多个数据结构中。碎片存储也可以帮助提高您的系统可扩展性。

获取排序地图

要获得排序地图,请使用 MemoryStoreService:GetSortedMap() 与一个 名称 您想要为地图定义。名称在体验中是全局的,因此您可以使用任何使用名称的脚本访问相同的排序地图。

获取排序地图

local MemoryStoreService = game:GetService("MemoryStoreService")
local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")

在您获得排序地图后,调用以下任意函数以读取或写入数据:

函数行动
MemoryStoreSortedMap:SetAsync()添加一个新的钥匙或覆盖值和/或排序键,如果钥匙已存在。
MemoryStoreSortedMap:GetAsync()读取特定钥键。
MemoryStoreSortedMap:GetRangeAsync()读取所有现有钥匙或特定范围。
MemoryStoreSortedMap:UpdateAsync()更新 键的值和/或排序键在从排序地图中恢复后。
MemoryStoreSortedMap:RemoveAsync()移除 排序地图中的钥匙。

添加或覆盖数据

要在排序地图中添加新钥匙或覆盖值或排序键的钥匙,调用 MemoryStoreSortedMap:SetAsync() 使用钥匙 name ,其 value ,以及一个

在钥匙的排序顺序中,排序键取先于钥匙。例如,在上升的排序顺序中,数字排序键排先,然后是串排序键,然后是项目无排序键。所有排序键排先,如果排键两项相等,它们就排基于钥匙。相同的,所有排序键排先,如果排键两项

一些数据的例子 -


{Key: "player1", Value: someValue1, SortKey: -1}
{Key: "player2", Value: someValue2, SortKey: 0}
{Key: "player4", Value: someValue3, SortKey: 1}
{Key: "player5", Value: someValue4, SortKey: 1}
{Key: "player3", Value: someValue5, SortKey: 3.14}
{Key: "player6", Value: someValue6, SortKey: "someString"}
{Key: "player0", Value: someValue7}
{Key: "player7", Value: someValue8}

注意如何 player0 排序所有键用排序键。 player6 排序所有键用数字排序键。 player4 和 1> player51> 有相同的排序键,因此它们按键顺序排序。

将数据添加到排序地图

local MemoryStoreService = game:GetService("MemoryStoreService")
local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")
local setSuccess, _ = pcall(function()
return sortedMap:SetAsync("User_1234", 1000, 30, 3.14152)
end)
if setSuccess then
print("Set succeeded.")
end

获取数据

您可以获取与特定钥匙关联的数据值和排序键,或者获得多个值和排序键以对范围内的钥匙进行排序。

使用一个钥匙获取数据

要从排序地图中获取一个值并排序键与一个钥匙相关,请调用 MemoryStoreSortedMap:GetAsync() 使用钥匙 name

从排序地图上获取特定钥匙

local MemoryStoreService = game:GetService("MemoryStoreService")
local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")
local setSuccess, _ = pcall(function()
return sortedMap:SetAsync("User_1234", 1000, 30, 3.14152)
end)
if setSuccess then
print("Set succeeded.")
end
local item
local getSuccess, getError = pcall(function()
item = sortedMap:GetAsync("User_1234")
end)
if getSuccess then
print(item)
else
warn(getError)
end

使用多个钥匙获取数据

要从排序地图中获得多个钥匙的数据作为单个操作,请调用 MemoryStoreSortedMap:GetRangeAsync() 。此函数列出所有现有钥匙默认开始

从排序地图中获取一组钥匙

local MemoryStoreService = game:GetService("MemoryStoreService")
local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")
local lowerBound = {}
lowerBound["key"] = "10"
lowerBound["sortKey"] = 100
local upperBound = {}
upperBound["key"] = "50"
upperBound["sortKey"] = 500
-- 从开始时获得最多 20 个物品
local getSuccess, items = pcall(function()
return sortedMap:GetRangeAsync(
Enum.SortDirection.Ascending, 20, lowerBound, upperBound)
end)
if getSuccess then
for _, item in items do
print(item.key)
print(item.sortKey)
end
end

更新数据

要从排序地图中恢复值并排序键,并更新它,请使用 MemoryStoreSortedMap:UpdateAsync() 使用键 名称 ,一个 回调函数 更新值和排序键为此键,以及一个 1> 秒的过期时间1> 在秒内。最大过期时间为 3,888,0

对于大多数体验,多个服务器可以同时更新同一键并更改值。作为 UpdateAsync() 在更新时总是修改最新值前,您应该使用它来读取最新值作为输入函数的输入。

例如,以下代码示例更新了玩家在游戏中的排行榜得分。得分由击杀/死亡计算。 UpdateAsync() 确保击杀和死亡的最新值仍然更新,即使多个游戏服务器同时更新相同的项目。玩家的击杀和死亡是一种单调的增量值,因此在一次会话中最多只能增加

更新排行榜得分以便在排序地图中的玩家

local MemoryStoreService = game:GetService("MemoryStoreService")
local sortedMap = MemoryStoreService:GetSortedMap("Leaderboard")
local function updateLeaderboard(itemKey, killsToAdd, deathsToAdd)
local success, newStats, newScore = pcall(function()
return sortedMap:UpdateAsync(itemKey, function(playerStats, playerScore)
playerStats = playerStats or { kills = 0, deaths = 0 }
playerStats.kills += killsToAdd
playerStats.deaths += deathsToAdd
if playerStats then
-- “playerScore” 是用于排序地图上的物品的排序键
playerScore = playerStats.kills / math.max(playerStats.deaths, 1)
return playerStats, playerScore
end
return nil
end, 30)
end)
if success then
print(newStats)
print(newScore)
end
end

Class.MemoryStoreSortedMap:UpdateAsync()|UpdateAsync() 的延迟与 GetAsync()SetAsync() 无论是否包含在容量中。

当发生容量时,系统会自动重试操作,直到发生其中三种情况之一:操作成功、调用函数返回 nil 或最大重试次数达到上限。如果系统达到最大重试次数,它将返回冲突。

移除数据

您可以使用 MemoryStoreSortedMap:RemoveAsync() 来从排序地图中移除一个钥匙,并且在排序地图中的所有数据都被删除。

移除钥匙

要从排序地图中移除钥匙,请使用 MemoryStoreSortedMap:RemoveAsync() 使用钥匙 名称

从排序地图中移除钥匙

local MemoryStoreService = game:GetService("MemoryStoreService")
local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")
local setSuccess, _ = pcall(function()
return sortedMap:SetAsync("User_1234", 1000, 30, "someStringSortKey")
end)
if setSuccess then
print("Set succeeded.")
end
local removeSuccess, removeError = pcall(function()
sortedMap:RemoveAsync("User_1234")
end)
if not removeSuccess then
warn(removeError)
end

删除所有数据

要在排序地图中删除内存,请使用 MemoryStoreSortedMap:GetRangeAsync() 列出所有键,然后使用 MemoryStoreSortedMap:RemoveAsync() 移除它们。

在排序地图中删除内存

local MemoryStoreService = game:GetService("MemoryStoreService")
local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")
-- 零的初始最低限制从第一个物品开始
local exclusiveLowerBound = nil
while true do
-- 从当前的最低边界上升级到最多一百个物品
local getRangeSuccess, items = pcall(function()
return sortedMap:GetRangeAsync(Enum.SortDirection.Ascending, 100, exclusiveLowerBound)
end)
if getRangeSuccess then
local removeSuccess = true
local removeError = nil
for _, item in items do
removeSuccess, removeError = pcall(function()
sortedMap:RemoveAsync(item.key)
end)
end
-- 如果有错误移除项目,请使用相同的独家最低限制重试
if not removeSuccess then
warn(removeError)
-- 如果范围小于 100 个物品,已达到地图的尽头
elseif #items < 100 then
break
else
-- 上一个被检索的钥匙是下一次递归的独家下限
exclusiveLowerBound = {}
exclusiveLowerBound["key"] = items[#items].key
exclusiveLowerBound["sortKey"] = items[#items].sortKey
end
end
end