โครงสร้างข้อมูล แผนที่ที่เรียงลำดับ ของ หน่วยความจำ ช่วยให้คุณสามารถจัดเก็บข้อมูลที่มีการใช้งานบ่อยในหน่วยความจำในรูปแบบคู่ของคีย์-ค่า โดยมีคีย์สำหรับการเรียงลำดับเป็นตัวเลือกและคงรักษาความเรียงลำดับที่เฉพาะเจาะจงตามคีย์สำหรับการเรียงลำดับและคีย์ โดยต่างจากคิว การเรียงลำดับของคีย์ที่เข้าสู่แผนที่ไม่ได้กำหนดลำดับการประมวลผล ทำให้แผนที่ที่เรียงลำดับเหมาะสำหรับการจัดระเบียบข้อมูลที่จัดเรียงตามการเข้าร่วมเช่นกระดานผู้นำและการประมูลข้ามเซิร์ฟเวอร์
ข้อจำกัด
นอกเหนือจาก ข้อจำกัดของขนาดโครงสร้างข้อมูล แผนที่ที่เรียงลำดับจะมีข้อจำกัดขนาดของคีย์ที่ 128 ตัวอักษร ข้อจำกัดขนาดของค่า 32 KB และข้อจำกัดขนาดของคีย์สำหรับการเรียงลำดับที่ 128 ตัวอักษร
หากคุณต้องการจัดเก็บข้อมูลที่เกินขนาดนี้สำหรับเกมของคุณ คุณสามารถใช้เทคนิคการ shard เพื่อแบ่งและกระจายข้อมูลผ่าน คีย์พรีฟิก ไปยังหลายโครงสร้างข้อมูล การ shard หน่วยความจำจะช่วยเพิ่มความสามารถในการปรับขนาดระบบของคุณ
รับแผนที่ที่เรียงลำดับ
เพื่อรับแผนที่ที่เรียงลำดับ ให้เรียกใช้ MemoryStoreService:GetSortedMap() โดยมี ชื่อ ที่คุณต้องการกำหนดสำหรับแผนที่ ชื่อนี้จะเป็นชื่อทั่วทั้งเกม ดังนั้นคุณจึงสามารถเข้าถึงแผนที่ที่เรียงลำดับเดียวกันในสคริปต์ใดก็ได้โดยใช้ชื่อ
Getting a Sorted Maplocal MemoryStoreService = game:GetService("MemoryStoreService")local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")
หลังจากที่คุณได้รับแผนที่ที่เรียงลำดับแล้ว ให้เรียกใช้ฟังก์ชันใด ๆ ต่อไปนี้:
| ฟังก์ชัน | การดำเนินการ |
|---|---|
| MemoryStoreSortedMap:SetAsync() | เพิ่ม คีย์ใหม่หรือเขียนทับค่าและ/หรือคีย์สำหรับการเรียงลำดับหากคีย์นั้นมีอยู่แล้ว |
| MemoryStoreSortedMap:GetAsync() | อ่าน คีย์เฉพาะ |
| MemoryStoreSortedMap:GetRangeAsync() | อ่าน คีย์ทั้งหมดที่มีอยู่หรือช่วงที่เฉพาะเจาะจง |
| MemoryStoreSortedMap:UpdateAsync() | อัปเดต ค่าในคีย์และ/หรือคีย์สำหรับการเรียงลำดับหลังจากดึงมันจากแผนที่ที่เรียงลำดับ |
| MemoryStoreSortedMap:RemoveAsync() | ลบ คีย์จากแผนที่ที่เรียงลำดับ |
| MemoryStoreSortedMap:GetSizeAsync() | รับ จำนวนรายการในแผนที่ที่เรียงลำดับ |
เพิ่มหรือเขียนทับข้อมูล
เพื่อเพิ่มคีย์ใหม่หรือเขียนทับค่า หรือคีย์สำหรับการเรียงลำดับของคีย์ในแผนที่ที่เรียงลำดับ ให้เรียกใช้ MemoryStoreSortedMap:SetAsync() โดยมี ชื่อ คีย์, ค่า, เวลาหมดอายุ เป็นวินาที และ คีย์สำหรับการเรียงลำดับ (ถ้ามี) หน่วยความจำจะทำความสะอาดโดยอัตโนมัติเมื่อคีย์หมดอายุ เวลาหมดอายุสูงสุดคือ 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 มีคีย์สำหรับการเรียงลำดับเดียวกัน จึงถูกจัดเรียงในลำดับที่เพิ่มขึ้นตามคีย์
Adding Data to a Sorted Map
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("การตั้งค่าประสบความสำเร็จ")
end
รับข้อมูล
คุณสามารถรับค่าข้อมูลและคีย์สำหรับการเรียงลำดับที่เกี่ยวข้องกับคีย์เฉพาะ หรือรับค่าหลายค่าและคีย์สำหรับการเรียงลำดับสำหรับคีย์ในช่วงได้
รับข้อมูลด้วยคีย์เดียว
เพื่อรับค่าและคีย์สำหรับการเรียงลำดับที่เกี่ยวข้องกับคีย์หนึ่งจากแผนที่ที่เรียงลำดับ ให้เรียกใช้ MemoryStoreSortedMap:GetAsync() โดยมี ชื่อ คีย์
Getting a Particular Key from a Sorted Map
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("การตั้งค่าประสบความสำเร็จ")
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
Getting a Range of Keys from a Sorted Map
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
อัปเดตข้อมูล
เพื่อดึงค่าที่เกี่ยวข้องและคีย์สำหรับการเรียงลำดับจากแผนที่ที่เรียงลำดับและอัปเดตมัน ให้เรียกใช้ MemoryStoreSortedMap:UpdateAsync() โดยมี ชื่อ คีย์, ฟังก์ชัน callback เพื่ออัปเดตค่าและคีย์สำหรับการเรียงลำดับสำหรับคีย์นี้ และ เวลาหมดอายุ เป็นวินาที เวลาหมดอายุสูงสุดคือ 3,888,000 วินาที (45 วัน)
สำหรับเกมส่วนใหญ่ เซิร์ฟเวอร์หลายตัวสามารถอัปเดตคีย์เดียวกันได้พร้อมกันและเปลี่ยนค่าดังกล่าว UpdateAsync() จะทำการแก้ไขค่าล่าสุดก่อนทำการอัปเดต คุณควรใช้มันเพื่ออ่านค่าล่าสุดเป็นข้อมูลนำเข้าสำหรับฟังก์ชัน callback ของคุณ
ตัวอย่างเช่น ตัวอย่างโค้ดต่อไปนี้อัปเดตคะแนนในกระดานผู้นำสำหรับผู้เล่น คะแนนจะคำนวณเป็นการฆ่า / การตาย UpdateAsync() จะช่วยให้แน่ใจว่าการฆ่าและการตายในข้อมูลถูกอัปเดตสำหรับค่าล่าสุดแม้ว่าจะมีเซิร์ฟเวอร์เกมหลายแห่งอัปเดตไอเท็มเดียวกันในเวลาเดียวกัน การฆ่าและการตายของผู้เล่นเป็นค่าที่เพิ่มขึ้นอย่างต่อเนื่องและจึงสามารถเพิ่มค่าได้ในเซสชันเท่านั้น
Updating the leaderboard score for a player in a Sorted Map
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() นอกจากจะมีการแย่งชิงกรณี
เมื่อมีการแย่งชิงกรณีเกิดขึ้น ระบบจะทำการ retry อัตโนมัติในการดำเนินการจนกว่าเหตุการณ์ใดเหตุการณ์หนึ่งจะเกิดขึ้น: การดำเนินการประสบความสำเร็จ ฟังก์ชัน callback ส่งคืนค่า nil หรือตรวจสอบจำนวน retry สูงสุด หากระบบถึงจำนวน retry สูงสุด จะส่งคืนข้อขัดแย้ง
ลบข้อมูล
คุณสามารถใช้ MemoryStoreSortedMap:RemoveAsync() ในการลบคีย์หนึ่งจากแผนที่ที่เรียงลำดับและลบข้อมูลทั้งหมดในแผนที่ที่เรียงลำดับของหน่วยความจำ
ลบคีย์
เพื่อระบุการลบคีย์จากแผนที่ที่เรียงลำดับ ให้เรียกใช้ MemoryStoreSortedMap:RemoveAsync() โดยมี ชื่อ คีย์
Remove a Key from a Sorted Map
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("การตั้งค่าประสบความสำเร็จ")
end
local removeSuccess, removeError = pcall(function()
sortedMap:RemoveAsync("User_1234")
end)
if not removeSuccess then
warn(removeError)
end
ลบข้อมูลทั้งหมด
ในการลบหน่วยความจำในแผนที่ที่เรียงลำดับ ให้แสดงรายการคีย์ทั้งหมดของคุณโดยใช้ MemoryStoreSortedMap:GetRangeAsync() จากนั้นลบด้วย MemoryStoreSortedMap:RemoveAsync()
Delete Memory in a Sorted Map
local MemoryStoreService = game:GetService("MemoryStoreService")
local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")
-- ขอบเขตต่ำเริ่มต้นของ nil เริ่มการลบจากรายการแรก
local exclusiveLowerBound = nil
while true do
-- ดึงข้อมูลสูงสุด 100 รายการ โดยเริ่มจากขอบเขตต่ำที่ปัจจุบัน
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
รับขนาด
เพื่อรับจำนวนรายการในแผนที่ที่เรียงลำดับ ให้เรียกใช้ MemoryStoreSortedMap:GetSizeAsync().
Getting the Size of a Sorted Map
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("การตั้งค่าประสบความสำเร็จ")
end
local size
local success, sizError = pcall(function()
size = sortedMap:GetSizeAsync()
end)
if success then
print(size)
else
warn(sizeError)
end