โครงสร้างข้อมูล แผนที่เรียงลำดับ ของ หน่วยความจำ ช่วยให้คุณสามารถเก็บข้อมูลในหน่วยความจำที่มีการเข้าถึงบ่อยในรูปแบบคู่คีย์-ค่าพร้อมคีย์เรียงลำดับโดยไม่บังคับและรักษาความสั่งซึ่งขึ้นอยู่กับคีย์เรียงลำดับและคีย์ที่กำหนดไว้ แตกต่างจากคิว ลำดับของคีย์ที่เข้ามาในแผนที่ไม่กำหนดลำดับการประมวลผล ทำให้แผนที่เรียงลำดับมีประโยชน์สำหรับการจัดระเบียบข้อมูลที่เป็นไปตามการจัดเรียงเพื่อการนำไปใช้ในเกม เช่น กระดานผู้นำ และการประมูลข้ามเซิร์ฟเวอร์
ข้อจำกัด
นอกจากนี้ยังมี ข้อจำกัดขนาดโครงสร้างข้อมูล แผนที่เรียงลำดับมีข้อจำกัดขนาดคีย์ที่ 128 ตัวอักษร, ข้อจำกัดขนาดค่า 32 KB และข้อจำกัดขนาดคีย์เรียงลำดับที่ 128 ตัวอักษร
หากคุณต้องการเก็บข้อมูลที่เกินข้อจำกัดนี้สำหรับเกมของคุณ คุณสามารถนำเทคนิคการแบ่งส่วน (sharding) มาใช้เพื่อแยกและกระจายข้อมูลผ่าน คีย์พรีฟิก ไปยังโครงสร้างข้อมูลหลายตัว การแบ่งส่วนของหน่วยความจำยังสามารถช่วยปรับปรุงความสามารถในการขยายระบบของคุณ
ดึงแผนที่เรียงลำดับ
ในการดึงแผนที่เรียงลำดับ ให้เรียกใช้ MemoryStoreService:GetSortedMap() พร้อมกับ ชื่อ ที่คุณต้องการกำหนดสำหรับแผนที่ ชื่อนี้เป็นแบบเครือข่ายภายในเกม ซึ่งหมายความว่าคุณสามารถเข้าถึงแผนที่เรียงลำดับเดียวกันในสคริปต์ใดก็ได้โดยใช้ชื่อนั้น
local 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 มีคีย์เรียงลำดับเหมือนกัน ดังนั้นพวกเขาจึงถูกจัดเรียงในลำดับที่เพิ่มขึ้นตามคีย์
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() พร้อมกับ ชื่อ คีย์
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
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() พร้อมกับ ชื่อ คีย์, ฟังก์ชันการเรียกกลับ เพื่ออัปเดตค่าและคีย์เรียงลำดับสำหรับคีย์นี้ และ เวลาหมดอายุ เป็นวินาที เวลาหมดอายุสูงสุดคือ 3,888,000 วินาที (45 วัน)
สำหรับเกมส่วนใหญ่ เซิร์ฟเวอร์หลายตัวสามารถอัปเดตคีย์เดียวกันได้พร้อมกันและเปลี่ยนค่า ในฐานะที่ UpdateAsync() จะทำการแก้ไขค่าที่อัปเดตล่าสุดก่อนที่จะทำการอัปเดต คุณควรใช้มันเพื่ออ่านค่าล่าสุดเป็นค่าข้อมูลเข้าของฟังก์ชันเรียกกลับของคุณ
ตัวอย่างเช่น ตัวอย่างโค้ดด้านล่างนี้ทำการอัปเดตคะแนนในกระดานผู้นำสำหรับผู้เล่น คะแนนคำนวณจากจำนวนการฆ่า / จำนวนการตาย UpdateAsync() จะทำให้แน่ใจว่าการฆ่าและการตายถูกอัปเดตให้เป็นค่าล่าสุด แม้ว่าหลายเซิร์ฟเวอร์เกมอัปเดตข้อมูลเดียวกันในเวลาเดียวกัน ค่าการฆ่าของผู้เล่นและการตายมีมูลค่าเพิ่มขึ้นเรื่อย ๆ และสามารถเพิ่มจำนวนขึ้นในเซสชันได้เท่านั้น
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() เว้นแต่จะมีการประนีประนอม
เมื่อเกิดการประนีประนอม ระบบจะพยายามทำการประมวลผลซ้ำโดยอัตโนมัติจนกว่าจะเกิดหนึ่งในสามสิ่งนี้: การดำเนินการประสบความสำเร็จ, ฟังก์ชันการเรียกกลับคืนค่า nil หรือจำนวนครั้งสูงสุดที่ทำการ.retry ถูกทำซ้ำ เมื่อระบบถึงจำนวนครั้งสูงสุด มันจะส่งคืนความขัดแย้ง
ลบข้อมูล
คุณสามารถใช้ 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("การตั้งค่าประสบความสำเร็จ")
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
-- ดึงสูงสุด 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()
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