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

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

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

ข้อจำกัด

นอกเหนือจาก ข้อจำกัดของขนาดโครงสร้างข้อมูล แผนที่ที่เรียงลำดับจะมีข้อจำกัดขนาดของคีย์ที่ 128 ตัวอักษร ข้อจำกัดขนาดของค่า 32 KB และข้อจำกัดขนาดของคีย์สำหรับการเรียงลำดับที่ 128 ตัวอักษร

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

รับแผนที่ที่เรียงลำดับ

เพื่อรับแผนที่ที่เรียงลำดับ ให้เรียกใช้ MemoryStoreService:GetSortedMap() โดยมี ชื่อ ที่คุณต้องการกำหนดสำหรับแผนที่ ชื่อนี้จะเป็นชื่อทั่วทั้งเกม ดังนั้นคุณจึงสามารถเข้าถึงแผนที่ที่เรียงลำดับเดียวกันในสคริปต์ใดก็ได้โดยใช้ชื่อ

Getting a Sorted Map

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 มีคีย์สำหรับการเรียงลำดับเดียวกัน จึงถูกจัดเรียงในลำดับที่เพิ่มขึ้นตามคีย์

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
©2026 Roblox Corporation. Roblox, โลโก้ Roblox และ Powering Imagination เป็นส่วนหนึ่งของเครื่องหมายการค้าที่จดทะเบียน และไม่ได้จดทะเบียนของเราในสหรัฐฯ และประเทศอื่นๆ