จัดเรียงแผนที่ความทรงจำ

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

โครงสร้างข้อมูลแผนที่ เรียงลําดับ ของ คลังหน่วยความจํา ช่วยให้คุณสามารถเก็บข้อมูลในหน่วยความจําบ่อยเป็นคู่คีย์-ค่าพร้อมกุญแจเรียงลําดับที่เลือกได้และรักษาลําดับเฉพาะตามกุญแจและกุญแจไว้ไม่เหมือนคิว ลำดับของกุญแจที่เข้าสู่แผนที่ไม่ได้กำหนดลำดับการประมวลผล ทำให้แผนที่ที่จัดเรียงได้มีประโยชน์สำหรับการจัดเรียงข้อมูลที่เกี่ยวข้องสำหรับการดำเนินการในองค์ประกอบในประสบการณ์ เช่น ลีดเดอร์บอร์ดและการประมูลระหว่างเซิร์ฟเวอร์

ข้อจํากัด

นอกจากขีดจํากัดขนาดโครงสร้างข้อมูล แล้วแผนที่ที่จัดเรียงมีขีดจํากัดขนาดคีย์ 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