記憶體存儲排序映射

*此內容是使用 AI(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:GetSizeAsync()獲取排序映射中的項目數量。

新增或覆蓋數據

要在排序映射中新增一個鍵或覆蓋某個鍵的值或排序鍵,請使用鍵的名稱、其過期時間(以秒為單位)和可選的排序鍵調用MemoryStoreSortedMap:SetAsync()。一旦鍵過期,記憶體會自動清除。最大過期時間為3,888,000秒(45天)。如果提供排序鍵,則必須是有效的數字(整數或浮點數)或字符串。

在鍵的排序順序中,排序鍵比鍵具有優先權。例如,在升序排序時,數字排序鍵首先排序,然後是字符串排序鍵,最後是沒有排序鍵的項目。所有具有數字排序鍵的項目按排序鍵排序,如果兩個項目的排序鍵相等,則按鍵排序。類似地,所有具有字符串排序鍵的項目按排序鍵排序,如果兩個項目的排序鍵相等,則按鍵排序。所有沒有排序鍵的項目僅按鍵排序。

以下是一些按升序排序的數據示例 -


{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在所有帶有數字排序鍵的鍵之後排序。player4player5具有相同的排序鍵,因此它們按鍵的升序排序。

向排序映射添加數據

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("設置成功。")
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("設置成功。")
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()。此函數默認列出所有現有鍵,但您可以設置鍵範圍的上限和下限。例如,以下代碼示例檢索從排序映射的起始位置開始的最多20個項目,鍵大於或等於10,排序鍵大於或等於100,以及鍵小於或等於50,排序鍵小於或等於500

從排序映射獲取鍵範圍

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()。最大過期時間為3,888,000秒(45天)。

對於大多數遊戲,多個伺服器可以同時更新相同的鍵並更改值。由於MemoryStoreSortedMap:UpdateAsync()始終在更新之前修改最新值,因此您應該使用它來閱讀最新值作為回調函數的輸入。

例如,以下代碼示例為玩家的排行榜更新分數。該分數計算為殺敵數/死亡數。MemoryStoreSortedMap: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`是用於對映射中項目進行排序的sortKey
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

MemoryStoreSortedMap:UpdateAsync()的延遲與MemoryStoreSortedMap:GetAsync()MemoryStoreSortedMap: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("設置成功。")
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")
-- 初始下邊界為nil從第一個項目開始清除
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)
-- 如果範圍少於一百個項目,則已達到映射的結束
elseif #items < 100 then
break
else
-- 最後檢索到的鍵是下一次迭代的獨佔下邊界
exclusiveLowerBound = {}
exclusiveLowerBound["key"] = items[#items].key
exclusiveLowerBound["sortKey"] = items[#items].sortKey
end
end
end

獲取大小

要獲取排序映射中的項目數量,請調用MemoryStoreSortedMap:GetSizeAsync()

獲取排序映射的大小

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("設置成功。")
end
local size
local success, sizError = pcall(function()
size = sortedMap:GetSizeAsync()
end)
if success then
print(size)
else
warn(sizeError)
end
©2026 Roblox Corporation、Roblox、Roblox 標誌及 Powering Imagination 是我們在美國及其他國家地區的部分註冊與未註冊商標。