ハッシュマップ 、ソートされたマップと似ていますが、キーバリューのペアをメモリ内のデータとしてアクセス, 書き込み権限 (write access)存できます。ソートされたマップとは、キーバリューのペアをメモリ内に保存できることができません。このデータ構造は
制限
ハッシュマップには、キーサイズが 128 文字、値サイズが 32 KB の制限があります。
そうでないと、ハッシュマップは他のメモリストアデータ構造と同じ API リクエスト と メモリクオータ の制限を使用します。
ハッシュマップを取得する
ハッシュマップを取得するには、MemoryStoreService:GetHashMap() に名前を付けて、ハッシュマップの名前を入力します。名前はエクスペリエンス内でグローバルなので、この名前を使用しているスクリプトでも同じハッシュマップにアクセスできます。
ハッシュマップを取得する
local MemoryStoreService = game:GetService("MemoryStoreService")local hashMap = MemoryStoreService:GetHashMap("HashMap1")
ハッシュマップを取得した後、次の機能の 1 つを呼び出して、その中のデータを読み込んだり書き込んだりします:
機能 | アクション |
---|---|
MemoryStoreHashMap:SetAsync() | 新しいキーを追加するか、既存のキーを上書きする。 |
MemoryStoreHashMap:GetAsync() | 特定のキーを読む 。 |
MemoryStoreHashMap:ListItemsAsync() | リスト ハッシュマップにアイテムをリストします。 |
MemoryStoreHashMap:UpdateAsync() | 更新 ハッシュマップから取得した後のキーの値を更新します。 |
MemoryStoreHashMap:RemoveAsync() | 削除 ハッシュマップからキーを削除します。 |
データを追加/上書きする
新しいキーを追加するか、ハッシュマップのキーの値を上書きするには、 MemoryStoreHashMap:SetAsync() を呼び出し、キーの名前、value、および有効期限を秒単位で設定します。メモリはキーが有効期限を超えると自動的にクリアされます。最大
ハッシュマップにデータを追加する
local MemoryStoreService = game:GetService("MemoryStoreService")
local hashMap = MemoryStoreService:GetHashMap("HashMap1")
local setSuccess, _ = pcall(function()
return hashMap:SetAsync("User_1234", 1000, 30)
end)
if setSuccess then
print("Set succeeded.")
end
データを取得する
特定のキーに関連付けられた値を取得するか、ハッシュマップで複数のキー値ペアを取得できます。
1つのキーでデータを取得する
ハッシュマップから 1 つのキーに関連する値を取得するには、MemoryStoreHashMap:GetAsync() を呼び出し、キー名 を持つ。
ハッシュマップから特定のキーを取得する
local MemoryStoreService = game:GetService("MemoryStoreService")
local hashMap = MemoryStoreService:GetHashMap("HashMap1")
local setSuccess, _ = pcall(function()
return hashMap:SetAsync("User_1234", 1000, 30)
end)
if setSuccess then
print("Set succeeded.")
end
local item
local getSuccess, getError = pcall(function()
item = hashMap:GetAsync("User_1234")
end)
if getSuccess then
print(item)
else
warn(getError)
end
複数のキー値ペアでデータを取得する
ハッシュマップからのキーバリューペアを単一のオペレーションとして取得するには、MemoryStoreHashMap:ListItemsAsync() を呼び出し、必要なページサイズを指定します。この関数は、すべての既存のキーをページ化された方法でリストします。たとえば、次のコードサンプルは、ハッシュマップから最大 32 個のアイテムを取得しま
ハッシュマップにアイテムをリストする
local MemoryStoreService = game:GetService("MemoryStoreService")
local hashMap = MemoryStoreService:GetHashMap("HashMap1")
-- アイテムのリストを取得する、32 個のアイテムを一度に
local success, pages = pcall(function()
return hashMap:ListItemsAsync(32)
end)
if success then
while true do
-- 現在のページを取得する
local entries = pages:GetCurrentPage()
-- ページ内のすべてのキーバリューペアを反復
for _, entry in ipairs(entries) do
print(entry.key .. " : " .. tostring(entry.value))
end
-- 最後のページに到達したかどうかチェック
if pages.IsFinished then
break
else
print("----------")
-- 次のページに進め
pages:AdvanceToNextPageAsync()
end
end
end
データの更新
ハッシュマップからキーの値を取得し、更新するには、MemoryStoreHashMap:UpdateAsync() を呼び出し、キー名名前、コールバック関数を更新する、および2>有効期限2>を秒単位で更新します。
ほとんどのエクスペリエンスでは、複数のサーバーが同時に同じキーを更新し、値を変更できます。As UpdateAsync() を含む、常に最新の値を更新する前に、Class.MemoryStore を使用して、コールバック関数の入力として最新の値を読み取る必要があります。
たとえば、次のコードサンプルは、共有インベント持ち物リストの資源の数を更新します。 UpdateAsync() は、これらの貢献が同時に行われている場合でも、この共有インベントリにすべてのプレイヤーの貢献があることを確認します。この関数では、最大のリソース数を 500 に制限し
共有インベントリの資源について、リソースカウントを更新する
local MemoryStoreService = game:GetService("MemoryStoreService")
local hashMap = MemoryStoreService:GetHashMap("ResourceInventory")
local function contributeResources(itemResource, addedCount)
local success, newResourceCount = pcall(function()
return hashMap:UpdateAsync(itemResource, function(resource)
resource = resource or {count = 0}
resource.count = resource.count + addedCount
-- 最大リソース数を超えないことを確認してください
if resource.count > 500 then
resource.count = 500
end
return resource
end, 1200)
end)
if success then
print(newResourceCount)
end
end
Class.MemoryStoreIlluminate:UpdateAsync()|UpdateAsync() の遅延は、GetAsync() と SetAsync() の遅延と似ています。ただし、1> Class.MemoryStoreIlluminate:UpdateAsync()|UpdateAsync()1> が含まれていない場合があります。
コンテンションが発生すると、システムはこれらの 3つのうちの 1つが発生するまで自動的にオペレーションを再試行します: オペレーションが成功する、コールバック関数が nil を返す、または最大数の再試行に到達する。 コンテンションが最大数の再試行に到達すると、コンフリクトが返されます。
データを削除する
Class.MemoryStoreheck:RemoveAsync() を使用して、ハッシュマップから 1 つのキーを削除し、メモリストアのハッシュマップですべてのデータを削除できます。
キーを削除する
ハッシュマップからキーを削除するには、MemoryStoreHashMap:RemoveAsync() にキーを持つ Class.MemoryStore を呼び出します。
ハッシュマップからキーを削除する
local MemoryStoreService = game:GetService("MemoryStoreService")
local hashMap = MemoryStoreService:GetHashMap("HashMap1")
local setSuccess, _ = pcall(function()
return hashMap:SetAsync("User_1234", 1000, 30)
end)
if setSuccess then
print("Set succeeded.")
end
local removeSuccess, removeError = pcall(function()
hashMap:RemoveAsync("User_1234")
end)
if not removeSuccess then
warn(removeError)
end
すべてのデータを削除する
ハッシュマップのすべてのデータを削除するには、MemoryStoreHashMap:ListItemsAsync() に、MemoryStoreHashMap:RemoveAsync() のすべてのアイテムをリストし、Class.MemoryStore で削除します。
ハッシュマップのすべてのデータを削除する
local MemoryStoreService = game:GetService("MemoryStoreService")
local hashMap = MemoryStoreService:GetHashMap("HashMap1")
-- アイテムのリストを取得する、32 個のアイテムを一度に
local success, pages = pcall(function()
return hashMap:ListItemsAsync(32)
end)
if success then
while true do
-- 現在のページを取得する
local entries = pages:GetCurrentPage()
local removeSuccess = true
local removeError = nil
-- ページ内のすべてのキーバリューペアを反復
for _, entry in ipairs(entries) do
print(entry.key .. " : " .. tostring(entry.value))
removeSuccess, removeError = pcall(function()
hashMap:RemoveAsync(entry.key)
end)
if not removeSuccess then
warn(removeError)
end
end
-- 最後のページに到達したかどうかチェック
if pages.IsFinished then
print("Finished deleting all data.")
break
else
print("----------")
-- 次のページに進め
pages:AdvanceToNextPageAsync()
end
end
end