メモリーストアソートマップ

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

メモリストアの マップソート データ構造は、オプションのソートキーを含むキーバリューペアをインメモリに格納し、メモリに格納されたデータを順番に処理するためのキーを保持します。キューとは異なり、マップに入るキーの順序は処理順序を決定しま

制限

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

エクスペリエンスのためにこの制限を超えるデータをストアする必要がある場合は、データを分割して配信するための キープレフィックス を通じて、複数のデータ構造に分散して配信することができます。データストアのシャーディングメモリを使用すると、システムのスケールアビリティを向上することもできます。

ソートされたマップを取得する

ソートされたマップを取得するには、MemoryStoreService:GetSortedMap() に 名前 を与えて、マップに定義したい名前を持つ名前を持つ名前を持つ名前を持つ名前を持つ名前を持つ名前を持つ名前を持つ名前を持つ名前を持つ名前を持つ名前を持つ名前を持つ名前を持つ名前を持つ名前を持つ名前を持つ名前を持つ名前を持つ名前を持つ名前

ソートされたマップを取得する

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

ソートされたマップを取得した後、次の機能の 1 つを呼び出して、その中のデータを読み込んだり書き込んだりします:

データを追加/上書きする

To add a new key or overwrite the value or sort key of a key in the sorted map, call MemoryStoreSortedMap:SetAsync() with the key name , its value , an 1> expiration time1> in second文字列 and an

キーのソート順序で、ソートキーは、ソートキーの前にあります。たとえば、ソートキーを上昇させてソートすると、数字のソートキーが最初にソートされ、次にストリングソートキー、次にアイテムにソートキーがありません。すべ

データをアセンダンス順にソートした例 -


{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

データを取得する

特定のキーに関連するデータ値を取得するか、複数の値を取得し、範囲内のキーに関連するソートキーをソートすることができます。

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

ソートされたマップから 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() を呼び

ソートされたマップからキーの範囲を取得する

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

データの更新

To retrieve the value and sort key of a key from a sorted map and update it, call MemoryStoreSortedMap:UpdateAsync() with the key name , a callback function to update the value and sort key for this key, and an 1> expiration time1> in seconds. The maximum expiration time is 3,888,000 seconds (45 days).

ほとんどのエクスペリエンスでは、複数のサーバーが同時に同じキーを更新し、値を変更できます。For most experiences, multiple servers can update the same key concurrently and change the value. As UpdateAsync() always modifies the latest value before updating, you should use it to read the latest value as the input for your callback function.

たとえば、次のコードサンプルは、ゲーム中のプレイヤーのリーダーボードでスコアを更新します。スコアはキル/死亡として計算されます。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() の遅延と似ています。ただし、1>Class.MemoryStoreSortedMap:UpdateAsync()|UpdateAsync()1> の遅延は、4>Class.MemoryStoreSortedMap:SetAsync()|SetAsync()4>

コンテンションが発生すると、システムはこれらの 3つのうちの 1つが発生するまで自動的にオペレーションを再試行します: オペレーションが成功する、コールバック関数が nil を返す、または最大数の再試行に到達する。 コンテンションが最大数の再試行に到達すると、コンフリクトが返されます。

データを削除する

Class.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")
-- 最初のアイテムから、ゼロの初期下限が満たされる
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