メモリストアのソート済みマップ

*このコンテンツは、ベータ版のAI(人工知能)を使用して翻訳されており、エラーが含まれている可能性があります。このページを英語で表示するには、 こちら をクリックしてください。

ソート済みマップデータ構造はメモリストアのもので、頻繁に使用されるインメモリデータをキーと値のペアとして格納し、オプションのソートキーを持ち、ソートキーとキーに基づいて特定の順序を維持します。キューとは異なり、マップに入るキーの順序は処理の順序を決定しないため、ソート済みマップはリーダーボードやクロスサーバーオークションなどのエンゲージメントのためのゲーム内エンティティの実装において、データの整理に役立ちます。

制限

データ構造のサイズ制限に加えて、ソート済みマップには128文字のキーサイズ制限、32 KBの値サイズ制限、および128文字のソートキーサイズ制限があります。

ゲームのためにこの制限を超えるデータを格納する必要がある場合は、キー接頭辞を使用して複数のデータ構造に分割して配布するシャーディング技術を採用することができます。メモリストアのシャーディングは、システムのスケーラビリティを向上させるのにも役立ちます。

ソート済みマップを取得する

ソート済みマップを取得するには、MemoryStoreService:GetSortedMap()を呼び出し、そのマップに定義したい名前を指定します。この名前はゲーム内でグローバルであるため、どのスクリプトでも同じソート済みマップに名前を使用してアクセスできます。

ソート済みマップを取得する
local MemoryStoreService = game:GetService("MemoryStoreService")
local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")

ソート済みマップを取得した後は、以下のいずれかの関数を呼び出します。

データを追加または上書きする

ソート済みマップに新しいキーを追加するか、キーの値またはソートキーを上書きするには、MemoryStoreSortedMap:SetAsync()を呼び出し、キーの名前有効期限(秒単位)、およびオプションのソートキーを指定します。キーが期限切れになると、メモリは自動的にクリーンアップされます。最大有効期限は3,888,000秒(45日)です。提供される場合、ソートキーは有効な数値(整数または浮動小数点)または文字列でなければなりません。

キーのソート順では、ソートキーがキーよりも優先されます。たとえば、昇順でソートする場合、数値のソートキーが最初にソートされ、その後に文字列のソートキー、さらにソートキーを持たないアイテムが続きます。すべての数値のソートキーを持つアイテムはソートキーによってソートされます。もし2つのアイテムのソートキーが同じ場合は、キーによってソートされます。同様に、すべての文字列のソートキーを持つアイテムもソートキーによってソートされ、もし2つのアイテムのソートキーが同じ場合はキーによってソートされます。ソートキーを持たないすべてのアイテムは単にキーによってソートされます。

昇順でソートされたデータの例 -

{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("Set succeeded.")
end

データを取得する

特定のキーに関連付けられたデータ値とソートキーを取得するか、範囲内の複数の値とソートキーを取得できます。

1つのキーでデータを取得する

ソート済みマップから特定のキーに関連付けられた値とソートキーを取得するには、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()を呼び出します。この関数はデフォルトですべての既存のキーをリストしますが、キー範囲の上限と下限を設定できます。たとえば、次のコードサンプルではソート済みマップの最初から始めて最大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日)です。

ほとんどのゲームでは、複数のサーバーが同じキーを同時に更新して値を変更することができます。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

UpdateAsync()のレイテンシは、GetAsync()およびSetAsync()と同様であり、競合がない限りは同じです。

競合が発生した場合、システムは操作が成功するか、コールバック関数がnilを返すか、最大リトライ回数に達するまで自動的に操作を再試行します。システムが最大リトライ回数に達した場合、競合を返します。

データを削除する

MemoryStoreSortedMap:RemoveAsync()を使用して、ソート済みマップから1つのキーを削除することも、メモリストアのソート済みマップ内のすべてのデータを削除することもできます。

キーを削除する

ソート済みマップからキーを削除するには、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")
-- nilの初期下限は最初のアイテムからフラッシュを開始
local exclusiveLowerBound = nil
while true do
-- 現在の下限から始めて最大100アイテムを取得
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

サイズを取得する

ソート済みマップ内のアイテムの数を取得するには、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("Set succeeded.")
end
local size
local success, sizeError = pcall(function()
size = sortedMap:GetSizeAsync()
end)
if success then
print(size)
else
warn(sizeError)
end
©2026 Roblox Corporation。Roblox(ロブロックス)、RobloxロゴおよびPowering Imaginationは、米国並びにその他の国における登録商標および非登録商標です。