โครงสร้างข้อมูลแผนที่ เรียงลําดับ ของ คลังหน่วยความจํา ช่วยให้คุณสามารถเก็บข้อมูลในหน่วยความจําบ่อยเป็นคู่คีย์-ค่าพร้อมกุญแจเรียงลําดับที่เลือกได้และรักษาลําดับเฉพาะตามกุญแจและกุญแจไว้ไม่เหมือนคิว ลำดับของกุญแจที่เข้าสู่แผนที่ไม่ได้กำหนดลำดับการประมวลผล ทำให้แผนที่ที่จัดเรียงได้มีประโยชน์สำหรับการจัดเรียงข้อมูลที่เกี่ยวข้องสำหรับการดำเนินการในองค์ประกอบในประสบการณ์ เช่น ลีดเดอร์บอร์ดและการประมูลระหว่างเซิร์ฟเวอร์
ข้อจํากัด
นอกจากขีดจํากัดขนาดโครงสร้างข้อมูล แล้วแผนที่ที่จัดเรียงมีขีดจํากัดขนาดคีย์ 128 ตัว ขีดจํากัดขนาดของค่า 32 KB และขีดจํากัดขนาดคีย์จัดเรียง 128 ตัว
หากต้องการเก็บข้อมูลที่เกินขีดจํากัดสําหรับประสบการณ์ของคุณ คุณสามารถใช้เทคนิคการแยกและจัดจําหน่ายผ่าน คีย์คํานําหน้า เพื่อแบ่งและจัดส่งข้อมูลไปยังหลายโครงสร้างข้อมูลคลังหน่วยความจําแบบแยกส่วนยังสามารถช่วยปรับปรุงความสามารถในการขยายระบบของคุณได้
รับแผนที่ที่จัดเรียงแล้ว
เพื่อรับแผนที่จัดเรียง โทร ด้วยชื่อ ที่คุณต้องการกำหนดสำหรับแผนที่ชื่อเป็นทั่วถึงภายในประสบการณ์ดังนั้นคุณสามารถเข้าถึงแผนที่เรียงลําดับเดียวกันบนสคริปต์ใดก็ได้โดยใช้ชื่อ
รับแผนที่จัดเรียง
local MemoryStoreService = game:GetService("MemoryStoreService")local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")
หลังจากที่คุณได้แผนที่จัดเรียงแล้ว โทรไปที่ฟังก์ชันใดก็ได้ต่อไปนี้เพื่ออ่านหรือเขียนข้อมูลในนั้น:
ฟังก์ชัน | การดำเนินการ |
---|---|
MemoryStoreSortedMap:SetAsync() | เพิ่ม กุญแจใหม่หรือเขียนค่าใหม่และ/หรือเรียงลําดับกุญแจหากกุญแจมีอยู่แล้ว |
MemoryStoreSortedMap:GetAsync() | อ่าน กุญแจเฉพาะ |
MemoryStoreSortedMap:GetRangeAsync() | อ่าน กุญแจทั้งหมดที่มีอยู่หรือช่วงเฉพาะของพวกเขา |
MemoryStoreSortedMap:UpdateAsync() | ปรับปรุง ค่าของกุญแจและ/หรือกุญแจเรียงลําดับหลังจากดึงมันออกจากแผนที่เรียงลําดับ |
MemoryStoreSortedMap:RemoveAsync() | ลบ กุญแจจากแผนที่เรียงลําดับ |
เพิ่มหรือเขียนทับข้อมูล
เพื่อเพิ่มกุญแจใหม่หรือเขียนค่าหรือเรียงลําดับกุญแจในแผนที่เรียงลําดับใหม่ โทร ด้วยกุญแจ ชื่อ , ค่า ของมัน , เวลาหมดอายุ ในวินาทีและกุญแจเรียงลําดับ ทางเลือก หน่วยความจําจะทำความสะอาดโดยอัตโนมัติเมื่อกุญแจหมดอายุเวลาหมดอายุสูงสุดคือ 3,888,000 วินาที (45 วัน)คีย์การจัดเรียง ถ้ามี ต้องเป็นตัวเลขที่ถูกต้อง (ตัวเลขหรือจุลภาพ) หรือเป็นข้อความ
ในลำดับการจัดเรียงของกุญแจของคุณ กุญแจจัดเรียงจะมีลําดับความสําคัญสูงกว่ากุญแจหนึ่งตัวอย่างเช่น เมื่อจัดเรียงตามลำดับเพิ่มขึ้น คีย์จัดเรียงตามตัวเลขจะจัดเรียงก่อน ตามด้วยคีย์จัดเรียงตามตัวอักษร และตามด้วยไอเทมที่ไม่มีคีย์จัดเรียงรายการทั้งหมดที่มีคีย์เรียงลําดับตามตัวเลขจะจัดเรียงตามคีย์เรียงลําดับหากคีย์เรียงลําดับสําหรับสองรายการเท่ากันพวกเขาจะจัดเรียงตามคีย์เช่นเดียวกัน, รายการทั้งหมดที่มีคีย์เรียงลําดับด้วยสตริงจะจัดเรียงตามคีย์เรียงลําดับ, หากคีย์เรียงลําดับสําหรับสองรายการเท่ากัน, พวกเขาจะจัดเรียงตามคีย์รายการทั้งหมดที่ไม่มีคีย์จัดเรียงจะจัดเรียงเพียงโดยคีย์เท่านั้น
ตัวอย่างข้อมูลบางอย่างจัดเรียงตามลำดับเพิ่มขึ้น -
{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 และ player5 มีคีย์ประเภทเดียวกันดังนั้นพวกเขาจะถูกจัดเรียงตามลําดับเพิ่มขึ้นตามคีย์
เพิ่มข้อมูลในแผนที่ที่เรียงลําดับ
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
รับข้อมูล
คุณสามารถรับค่าข้อมูลและเรียงลําดับกุญแจที่เกี่ยวข้องกับกุญแจเฉพาะหรือรับค่าหลายรายการและเรียงลําดับกุญแจสําหรับกุญแจภายในช่วง
คีย์
เพื่อรับค่าและเรียงลําดับกุญแจที่เกี่ยวข้องกับกุญแจหนึ่งจากแผนที่เรียงลําดับ โทร 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()ฟังก์ชันนี้แสดงรายการคีย์ทั้งหมดที่มีอยู่โดยค่าเริ่มต้น แต่คุณสามารถกำหนดขอบเขตสูงสุดและต่ำสุดสำหรับช่วงคีย์ได้ตัวอย่างโค้ดต่อไปนี้ดึงได้ถึง 20 รายการตั้งแต่ต้นของแผนที่ที่เรียงลําดับ ด้วยกุญแจที่มากกว่าหรือเท่ากับ 10 และกุญแจเรียงลําดับที่มากกว่าหรือเท่ากับ 100 และกุญแจน้อยกว่าหรือเท่ากับ 50 และกุญแจน้อยกว่าหรือเท่ากับ 500
รับช่วงของกุญแจจากแผนที่เรียงลําดับ
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
อัปเดตข้อมูล
เพื่อดึงค่าและเรียงลําดับกุญแจของกุญแจจากแผนที่เรียงลําดับและอัปเดต โทร ด้วยกุญแจ ชื่อ ฟังก์ชันการโทรกลับ เพื่ออัปเดตค่าและเรียงลําดับกุญแจสําหรับกุญแจนี้ และเวลาหมดอายุใน วินาทีเวลาหมดอายุสูงสุดคือ 3,888,000 วินาที (45 วัน)
สำหรับประสบการณ์ส่วนใหญ่ หลายเซิร์ฟเวอร์สามารถอัปเดตคีย์เดียวพร้อมกันและเปลี่ยนค่าได้เนื่องจาก UpdateAsync() เสมอแก้ไขค่าล่าสุดก่อนอัปเดตคุณควรใช้เพื่ออ่านค่าล่าสุดเป็นอินพุตสําหรับฟังก์ชัน callback ของคุณ
เซสชัน มั่นใจว่าการฆ่าและการตายจะได้รับการอัปเดตสำหรับมูลค่าล่าสุดเมื่อมีการอัปเดตหลายเซิร์ฟเวอร์เกมพร้อมกันสำหรับไอเทมเดียวกันการฆ่าและการตายของผู้เล่นเพิ่มขึ้นอย่างต่อเนื่องและสามารถเพิ่มค่าได้เฉพาะในเซสชั่นเท่านั้น
การอัปเดตคะแนนลีดเดอร์บอร์ดสำหรับผู้เล่นในแผนที่ที่เรียงลําดับ
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
ความแลคสำหรับ UpdateAsync() คล้ายกับ GetAsync() และ SetAsync() เว้นแต่จะมีการแข่งขัน
เมื่อเกิดการแข่งขันขึ้น ระบบจะพยายามทำการดำเนินการอีกครั้งจนกว่าหนึ่งในสามเหตุการณ์เหล่านี้จะเกิดขึ้น: การดำเนินการประสบความสำเร็จ, ฟังก์ชัน callback จะกลับมา nil หรือจำนวนความพยายามสูงสุดถูกถึงหากระบบถึงจํานวนความพยายามสูงสุดแล้ว มันจะส่งคืนความขัดแย้ง
ลบข้อมูล
คุณสามารถใช้ MemoryStoreSortedMap:RemoveAsync() สําหรับทั้งการลบกุญแจหนึ่งออกจากแผนที่เรียงลําดับและลบข้อมูลทั้งหมดในแผนที่เก็บข้อมูลเรียงลําดับ
คีย์
เพื่อลบกุญแจออกจากแผนที่เรียงลําดับ โทร 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")
-- ขีดจำกัดล่างสุดเริ่มต้นของ nil ไอเท็ม
local exclusiveLowerBound = nil
while true do
-- รับได้ถึงหนึ่งร้อยรายการเริ่มจากขีดจำกัดด้านล่างปัจจุบัน
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)
-- หากระยะน้อยกว่าร้อยรายการจุดสิ้นสุดของแผนที่จะถูกถึง
elseif #items < 100 then
break
else
-- กุญแจล่าสุดที่ดึงมาคือขีดจำกัดล่างสุดสำหรับการต่อยอดในรอบต่อไป
exclusiveLowerBound = {}
exclusiveLowerBound["key"] = items[#items].key
exclusiveLowerBound["sortKey"] = items[#items].sortKey
end
end
end