แฮชแมพ คล้ายกับแผนที่ที่จัดระเบียบช่วยให้คุณเก็บข้อมูลในหน่วยความจำเป็นคู่ของคีย์-ค่า ต่างจากแผนที่ที่จัดระเบียบ แฮชแมพไม่มีการรับรองการจัดลำดับ โครงสร้างข้อมูลนี้มีประโยชน์สำหรับกรณีที่ต้องการบัฟเฟอร์ข้อมูลที่เรียบง่ายและการเข้าถึงอย่างรวดเร็ว เช่น สินค้าคงคลังที่แชร์ บ้านประมูลจริง และอื่นๆ แฮชแมพจัดการการแบ่งพาร์ติชันข้อมูลของคุณโดยอัตโนมัติและมีประโยชน์มากหากคุณมีคีย์มากกว่า 1,000 คีย์ สำหรับพื้นที่คีย์ที่เล็กกว่า เราขอแนะนำ แผนที่ที่จัดระเบียบ.
ข้อจำกัด
แฮชแมพมีขีดจำกัดขนาดคีย์ที่ 128 อักขระ และขีดจำกัดขนาดค่าที่ 32 KB.
โดยทั่วไปแล้ว แฮชแมพจะใช้ ข้อจำกัดการเรียก API และ โควต้าหน่วยความจำ เช่นเดียวกับโครงสร้างข้อมูลหน่วยความจำอื่นๆ.
รับแฮชแมพ
เพื่อให้ได้แฮชแมพ ให้เรียกใช้ MemoryStoreService:GetHashMap() โดยใช้ชื่อสำหรับแฮชแมพ ชื่อนี้เป็นแบบทั่วโลกภายในเกม ดังนั้นคุณสามารถเข้าถึงแฮชแมพเดียวกันในสคริปต์ใดๆ โดยใช้ชื่อนี้
การรับแฮชแมพlocal MemoryStoreService = game:GetService("MemoryStoreService")local hashMap = MemoryStoreService:GetHashMap("HashMap1")
หลังจากคุณได้รับแฮชแมพแล้ว เรียกใช้ฟังก์ชันใดๆ ต่อไปนี้เพื่ออ่านหรือเขียนข้อมูลในนั้น:
| ฟังก์ชัน | การกระทำ |
|---|---|
| MemoryStoreHashMap:SetAsync() | เพิ่ม คีย์ใหม่หรือเขียนทับค่าหากคีย์มีอยู่แล้ว. |
| MemoryStoreHashMap:GetAsync() | อ่าน คีย์เฉพาะ. |
| MemoryStoreHashMap:ListItemsAsync() | แสดงรายการ รายการในแฮชแมพ. |
| MemoryStoreHashMap:UpdateAsync() | ปรับปรุง ค่าของคีย์หลังจากดึงมันจากแฮชแมพ. |
| MemoryStoreHashMap:RemoveAsync() | ลบ คีย์จากแฮชแมพ. |
สำหรับเอกสารประกอบเชิงลึกเกี่ยวกับแต่ละฟังก์ชัน ดูที่ MemoryStoreHashMap.
เพิ่มหรือลบข้อมูล
เพื่อเพิ่มคีย์ใหม่หรือลบค่าของคีย์ในแฮชแมพ ให้เรียกใช้ MemoryStoreHashMap:SetAsync() โดยใช้คีย์ ชื่อ, ค่า, และ เวลาในการหมดอายุเป็นวินาที แรมจะทำการทำความสะอาดโดยอัตโนมัติหลังจากที่คีย์หมดอายุ เวลาหมดอายุสูงสุดคือ 3,888,000 วินาที (45 วัน)
การเพิ่มข้อมูลในแฮชแมพ
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("การตั้งค่าเสร็จสิ้น.")
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("การตั้งค่าเสร็จสิ้น.")
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() โดยใช้คีย์ ชื่อ, ฟังก์ชันย้อนกลับในการปรับปรุงคีย์, และ เวลาในการหมดอายุในวินาที
สำหรับเกมส่วนใหญ่ เซิร์ฟเวอร์หลายตัวสามารถปรับปรุงคีย์เดียวกันพร้อมกันและเปลี่ยนค่าได้ เนื่องจาก 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
ความหน่วงสำหรับ UpdateAsync() จะคล้ายกับ GetAsync() และ SetAsync() เว้นแต่ว่าจะมีการแข่งขันเกิดขึ้น
เมื่อเกิดการแข่งกัน ระบบจะลองทำงานอัตโนมัติเสมอจนกว่าจะเกิดเหตุการณ์หนึ่งในสามเหตุการณ์นี้: การดำเนินการประสบความสำเร็จ, ฟังก์ชันย้อนกลับคืนค่า 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("การตั้งค่าเสร็จสิ้น.")
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("เสร็จสิ้นการลบข้อมูลทั้งหมด.")
break
else
print("----------")
-- ไปยังหน้าถัดไป
pages:AdvanceToNextPageAsync()
end
end
end