排序地圖 資料結構的 內存存取 可以存儲頻繁的內存資料作為鑰匙值對,並且配有可選的排序鑰匙,以便維持基於排序鑰匙和鑰匙的有序排序基礎。與排隊不同,排序基礎的鑰匙會決
限制
除了資料結構大小限制,排序的地圖具有 128 個字元的鑰匙尺寸限制、 32 KB 的值尺寸限制和 128 個字元的排序鑰匙尺寸限制。
如果您需要儲存超過此限制的資料,您可以採用碎片技術將它們分割並分配到 鑰匙預fix 以便在多個資料結構中。碎片記憶體也可以幫助提高您的系統可用性。
獲取排序的地圖
要取得排序的地圖,請使用 Class.MemoryStoreService:GetSortedMap() 並且在 名稱 與您想要為地圖定義的名稱。名稱在體驗中全部都是全球的,因此您可以使用名稱來存取任何使用名稱的地圖。
獲取排序的地圖
local MemoryStoreService = game:GetService("MemoryStoreService")local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")
在您獲得排序的地圖之後,請使用以下任何一項功能來閱取或寫入它中的資料:
函數 | 行動 |
---|---|
MemoryStoreSortedMap:SetAsync() | 添加新鑰匙,或覆蓋值和/或排序鑰匙,如果鑰匙已存在。 |
MemoryStoreSortedMap:GetAsync() | 閱讀特定鑰鍵。 |
MemoryStoreSortedMap:GetRangeAsync() | 閱讀所有現有鑰匙或特定範圍。 |
MemoryStoreSortedMap:UpdateAsync() | 更新 值的鑰匙和/或排序鑰匙後,從排序樹狀圖取回後。 |
MemoryStoreSortedMap:RemoveAsync() | 從排序的地圖中移除 一個鑰匙。 |
添加或覆蓋資料
要在排序樹中新增新的鑰匙,或覆蓋鑰匙的值或排序鑰匙的排序順序,請使用 MemoryStoreSortedMap:SetAsync() 使用鑰鍵 <
在鑰匙的排序順序中,鑰匙的排序鍵取先於一個鑰匙。例如,在上升排序順序中,數字排鍵排先,然後是字串排鍵,再後是項目沒有排鍵的項目。所有數字排鍵的項目都會按排鍵排列,如
一些資料排序在上升的順序 -
{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() 並使用 鑰匙名稱 來呼叫。
從排序地圖獲取特定鑰匙
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
更新資料
要從排序的地圖中取回值和排序鑰匙的鑰匙的值和排序鑰匙的鑰匙並更新它,請使用 Class.MemoryStoreSortedMap:UpdateAsync() 使用鑰匙 名稱 ,一個 回撥函 更新鍵匙的值和排序
對於大多數體驗,多個伺服器可以同時更新相同的鑰匙並且變更值。作為 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