메모리 스토어의 데이터 구조는 옵션 정렬 키와 함께 빈번한 메모리 데이터를 키 값 쌍으로 저장하고 키 값 순으로 정렬하고 키 값 순으로 유지하여 메모리 데이터 조직을 구현하는 데 유용합니다. 대기열과
제한
데이터 구조 크기 제한 외에도, 정렬된 맵에는 키 크기 제한 128자, 값 크기 제한 32KB, 정렬 키 크기 제한 128자가 있습니다.
경험에 대한 데이터를 이 한도를 초과하는 경우 분할 기술을 채택하여 키 접두어로 분할하고 다중 데이터 구조로 배포할 수 있습니다. 분할 메모리 스토어는 또한 시스템의 확장성을 개선할 수 있습니다.
정렬된 맵 가져오기
정렬된 맵을 가져오려면 MemoryStoreService:GetSortedMap() 에 이름 을 지정하여 맵을 정렬합니다. 이름은 경험 내에서 글로벌이므로 이름을 사용하여 모든 스크립트에서 동일한 정렬된 맵에 액세스할 수 있습니다.
정렬된 맵 가져오기
local MemoryStoreService = game:GetService("MemoryStoreService")local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")
정렬된 맵을 받은 후 다음 함수 중 하나를 호출하여 데이터를 읽거나 쓸 수 있습니다.After you get a sorted map, call any of the following functions to read or write data in it:
함수 | 액션 |
---|---|
MemoryStoreSortedMap:SetAsync() | 새로운 키를 추가하거나 기존 키를 덮어쓰거나 키를 정렬하십시오. |
MemoryStoreSortedMap:GetAsync() | Read 특정 키를 읽습니다. |
MemoryStoreSortedMap:GetRangeAsync() | Read 모든 기존 키 또는 특정 범위의 키를 읽습니다. |
MemoryStoreSortedMap:UpdateAsync() | 업데이트 키의 값을 검색 맵에서 검색한 후 업데이트합니다. |
MemoryStoreSortedMap:RemoveAsync() | 키를 제거하십시오. 정렬된 맵에서 키를 제거합니다. |
데이터 추가 또는 덮어쓰기
새로운 키를 추가하거나 정렬된 맵의 키의 값을 변경하거나 키의 만료 시간을 초과하는 키의 순위를 정렬하려면 MemoryStoreSortedMap:SetAsync()
열의 정렬 순서에서 키의 순위가 높은 순위로 정렬되면 키가 우선 순위를 차지합니다. 예를 들어, 순위가 높은 순서로 정렬하면 숫자 정렬 키가 먼저 정렬되고, 다음에 문자열 정렬 키가
일부 데이터 정렬의 예 (
{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 은 모든 키를 정렬하고 2>player52> 은 모든 키를 정렬하고 있습니다. 키를 정렬하는 방식으로 5>player45> 은 모든 키를 정렬하고
정렬된 맵에 데이터 추가
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
데이터 가져오기
특정 키와 관련된 데이터 값을 가져오거나 범위 내의 키에 대해 여러 값을 정렬하거나 키를 정렬할 수 있습니다.You can either get a data value and sort key associates with a specific key or get multiple values and sort keys for keys within a range.
키 하나로 데이터 가져오기
정렬된 맵의 하나의 키와 값을 가진 키를 가져오려면 MemoryStoreSortedMap:GetAsync() 를 호출하여 Class.MemoryStoreSortedMap:GetAsync() 키의 이름과 함께 키를 Class.MemoryStoreSortedMap:Sort 합니다.
정렬된 맵에서 특정 키 가져오기
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() 를 호출합니다. 이
정렬된 맵에서 키 범위 가져오기
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() 를 호출하여 값을 정렬하고 키의 키를 업데이트하고, 키의 이름을 가진 콜백 함수를 업데이트하고, 경과 시간을 초과
대부분의 경험에서 여러 서버가 동시에 키를 업데이트하고 값을 변경할 수 있습니다. 작성 시 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
Class.MemoryStoreSortedMap: UpdateAsync()|UpdateAsync()의 대기 시간은 GetAsync() 및 SetAsync() 이외의 경우 유지됩니다.
콘텐션이 발생하면 시스템이 이 세 가지 중 하나가 발생할 때까지 작업을 자동으로 다시 시도합니다. 작업이 성공하거나 콜백 함수가 일반으로 반환하거나 최대 재시도 수에 도달하면 콜콘트가 발생합니다. 콜콘트가 발생하면 콜 콘트가 발생합니다.
데이터 제거
Class.MemoryStoreSortedMap:RemoveAsync()를 사용하여 정렬된 맵에서 하나의 키를 제거하고 메모리 스토어 정렬된 맵에서 모든 데이터를 삭제할 수 있습니다.
키 제거
정렬된 맵에서 키를 제거하려면 MemoryStoreSortedMap:RemoveAsync() 키와 함께 name 이름의 키를 호출합니다.
정렬된 맵에서 키 제거
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")
-- 첫 번째 항목부터 초기 하위 바인드의 길이가 최대 길이의 절반으로 깔끔하게 시작합니다.Initial lower bound of nil starts flush from first 아이템
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)
-- 범위가 100개 이하인 경우 맵 끝에 도달합니다.If range is less than a hundred items, end of map is reached
elseif #items < 100 then
break
else
-- 마지막으로 검색된 키는 다음 반복에 대한 독점 하위 범위입니다.
exclusiveLowerBound = {}
exclusiveLowerBound["key"] = items[#items].key
exclusiveLowerBound["sortKey"] = items[#items].sortKey
end
end
end