哈希地图 ,与排序地图类似,允许您存储为键值对的内存数据。与排序地图不同,它们不会提供排序保证。此数据结构对于需要简单数据存储和快速访1) 使用权 2)通行证 3)访问权限的情况,例如共享库存、物理拍卖房等,很有用。哈希地图会自动处理您的数据并且很有用,如果您有超过 1,0
限制
哈希地图的钥匙大小为 128 个字符,值为 32 KB。
否则,哈希地图使用同样的 API 请求 和 内存 quota 限制,与其他存储数据结构相同。
获取哈希地图
要获得哈希地图,请使用 MemoryStoreService:GetHashMap() 使用哈希地图的名称为哈希地图。名称在体验中是全局的,因此您可以使用此名称访问任何使用此名称的脚本。
获取哈希地图
local MemoryStoreService = game:GetService("MemoryStoreService")local hashMap = MemoryStoreService:GetHashMap("HashMap1")
在获得哈希地图后,调用以下任意函数以读取或写入其中的数据:
函数 | 行动 |
---|---|
MemoryStoreHashMap:SetAsync() | 添加一个新的钥匙或覆盖值,如果钥匙已存在。 |
MemoryStoreHashMap:GetAsync() | 读取特定钥键。 |
MemoryStoreHashMap:ListItemsAsync() | 列表 项目在哈希地图上。 |
MemoryStoreHashMap:UpdateAsync() | 更新 键的值后,从哈希地图上恢复后。 |
MemoryStoreHashMap:RemoveAsync() | 移除 一个钥匙从哈希地图。 |
添加或覆盖数据
要在键的哈希地图上添加新的钥匙或覆盖值键的值,请使用 MemoryStoreHashMap:SetAsync() 使用键的 名称 、其 值 和有效期 1> 在秒内到期1>。当钥匙过期时,记忆自动清除。最大过期时间为 3,88
将数据添加到哈希地图
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
获取数据
您可以通过与特定钥匙关联获取值,或者在哈希地图上获得多个钥匙值对。
使用一个钥匙获取数据
要从哈希地图中获得一个与一键相关的值,请使用 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
使用多个键值对获取数据
要将 hash 地图上的所有键值对作为单个操作,请使用 MemoryStoreHashMap:ListItemsAsync() ,并使用所需的页面大小。此函数列出所有现有钥匙在页面上的方式。例如,以下代码示例从 hash 地图上回收最多 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() 使用键 Class.MemoryStore 的名称,以及一个 调用函数 来更新键,并在 2>秒内过期2>。
对于大多数体验,多个服务器可以同时更新同一键并更改值。作为 UpdateAsync() 在更新之前总是修改最新值,您应该使用它来读取最新值作为您的回调函数的输入。
例如,下面的代码示例更新了一个资源在共享道具中的资源数量。 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.MemoryStore HashMap:UpdateAsync()|UpdateAsync() 的延迟与 Class.MemoryStore() 获取异步() 和 1> Class.MemoryStore() 1> 设置异步()1> 无关,除非有容量。
当发生容量时,系统会自动重试操作,直到发生其中三种情况之一:操作成功、调用函数返回 nil 或最大重试次数达到上限。如果系统达到最大重试次数,它将返回冲突。
移除数据
您可以使用 MemoryStoreHashMap:RemoveAsync() 来从哈希地图中移除一个钥匙,以及从记忆存储中的所有数据。
移除钥匙
要从哈希地图中移除钥匙,请使用 MemoryStoreHashMap:RemoveAsync() 使用 名称 的钥匙。
从哈希地图中移除钥匙
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() 移除它们。
在哈希地图中删除所有数据
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