خريطة مرتبة في ذاكرة التخزين

*This content is translated using AI (Beta) and may contain errors. To view this page in English, click here.

تتيح لك بنية بيانات الخريطة المرتبة في مخازن الذاكرة تخزين البيانات المتكررة في الذاكرة كأزواج من المفتاح والقيمة مع مفتاح فرز اختياري والحفاظ على ترتيب معين بناءً على مفاتيح الفرز والمفاتيح. على عكس الطوابير، فإن ترتيب المفاتيح عند دخولها إلى الخريطة لا يحدد ترتيب المعالجة، مما يجعل الخرائط المرتبة مفيدة لتنظيم البيانات القابلة للفرز لتنفيذ كيانات داخل اللعبة من أجل التفاعل مثل قوائم المتصدرين والمزادات عبر الخوادم.

الحدود

بالإضافة إلى حدود حجم بنية البيانات، تحتوي الخرائط المرتبة على حد لحجم المفتاح قدره 128 حرفًا، وحد حجم القيمة قدره 32 كيلوبايت، وحد حجم مفتاح الفرز قدره 128 حرفًا.

إذا كنت بحاجة إلى تخزين بيانات تتجاوز هذا الحد للعبتك، يمكنك اعتماد تقنية التقسيم لتقسيمها وتوزيعها عبر بادئة المفتاح في عدة هياكل بيانات. يمكن أن تساعد مخازن الذاكرة المقسمة أيضًا في تحسين قابلية التوسع لنظامك.

الحصول على خريطة مرتبة

للحصول على خريطة مرتبة، قم باستدعاء 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، أو يتم الوصول إلى الحد الأقصى لعدد المحاولات. إذا وصل النظام إلى الحد الأقصى لعدد المحاولات، فإنه يُرجع تعارضًا.

إزالة البيانات

يمكنك استخدام 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
-- احصل على ما يصل إلى مائة عنصر بدءًا من الحد الأدنى الحالي
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
©2026 شركة Roblox Corporation. تُعد منصّة Roblox، وشعار Roblox وشعار "توسيع حدود المخيلة"، من ضمن علاماتنا التجارية المسجّلة وغير المسجّلة في الولايات المتحدة وبلدان أخرى.