A キュー は、先着順 (FIFO) 原則に従うアイテムのコレクションか、事前定義された基準に基づいて要素を優先する線形データ構造です。メモリストア は、FIFO 定期的なキュー と 優先順位のキュー の 2種類のキューをサポートします。両方のタイプは、空のキューの初期化、キューにデータを追加、キューからデータを読み込み、キューからデータを削除するという同じセットの機能を共有します。
メモリストアのキューは、指定の基準に基づいたマッチメイキングを容易にするため、スキルレベルなどのユーザー情報を処理し、保存するのに便利です。たとえば、エクスペリエンスの開始場所としてロビー場所を追加し、メモリストアのキューを複数のサーバーにアクセス可能な中央化されたユーザー情報ストレージシステムとして使用し、キューを使用してユーザーの配置順序を管理し、マッチメイキングを完了したユーザーを主な場所にテレポートします。
キューを取得
キューをアクセス, 書き込み権限 (write access)得するには、MemoryStoreService:GetQueue() に 名前 を呼び出し、エクスペリエンス内の任意のスクリプトにアクセスできるグローバルなもの、および秒単位のオプションの 非表示時間制限 で、同じキューアイテムの複製処理を防ぎます。透明化の期限切れは、次のコードサンプルのように空白のままにすると、デフォルトで 30秒です。
空のキューを取得する
local MemoryStoreService = game:GetService("MemoryStoreService")local queue = MemoryStoreService:GetQueue("Queue1")
キューがアイテムを処理しているとき、透明化期限がアイテムに適用され、複数のサーバーが同時にキューを更新できるため、他のサーバーによって処理されなくなります。透明化時間切り替え期間中、アイテムの読み込みと削除操作の両方を完了すると期待されますが、アイテムが期限切れ後にキューに残るエラーが発生した場合、アイテムは再処理のために再び表示されます。これを行うとき、透明化の時間制限は、予期せぬ問題が発生しても、キュー内のすべてのアイテムが処理できることを保証します。
キューを取得した後、次の機能のいずれかを呼び出して、その中でデータを読んだり書いたりします:
機能 | 行動 |
---|---|
MemoryStoreQueue:AddAsync() | 新しいアイテムをキューに追加する |
MemoryStoreQueue:ReadAsync() | 1つまたは複数のアイテムをキューから単一の操作として読み取る |
MemoryStoreQueue:RemoveAsync() | 削除 キューから以前読み込まれた1つまたは複数のアイテムを削除する。 |
データを追加
キューに新しいアイテムを追加するには、アイテム値、秒単位の期限時間、およびオプションのアイテムの優先度を持つ MemoryStoreQueue:AddAsync() を呼び出してください。キューを FIFO シーケンスに保持したい場合は、優先度を空にしたり、0 をパスしたりできます。
キューにデータを追加する
local MemoryStoreService = game:GetService("MemoryStoreService")
local queue = MemoryStoreService:GetQueue("Queue1")
local addSuccess, addError = pcall(function()
queue:AddAsync("User_1234", 30, 1)
end)
if not addSuccess then
warn(addError)
end
データを読み込み、削除する
キューから1つまたは複数のアイテムを一度に読み込みたい場合は、MemoryStoreQueue:ReadAsync() を呼び出し、読み込まれたアイテムを表す id を返します。アイテムの処理が完了したら、MemoryStoreQueue:RemoveAsync() をすぐに呼び出して、キューから削除し、id でそれを削除します。これにより、アイテムを一度以上処理することは決してありません。キューに連続して追加されるすべてのアイテムをキャプチャし、応答するには、次のコードサンプルのような ループ を含めます:
ループでキューからデータを読み込み、削除
local MemoryStoreService = game:GetService("MemoryStoreService")
local queue = MemoryStoreService:GetQueue("Queue1")
local addSuccess, addError = pcall(function()
queue:AddAsync("User_1234", 30, 1)
end)
if not addSuccess then
warn(addError)
end
-- キュー処理ループ
while true do
local readSuccess, items, id = pcall(function()
return queue:ReadAsync(1, false, 30)
end)
if not readSuccess then
task.wait(1)
elseif #items > 0 then
print(items, id)
local removeSuccess, removeError = pcall(function()
queue:RemoveAsync(id)
end)
if not removeSuccess then
warn(removeError)
end
end
end