Kho lưu trí nhớ

*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.

MemoryStoreService là một dịch vụ lưu trữ dữ liệu có tốc độ cao và thời gian trễ thấp cung cấp khả năng lưu trữ dữ liệu trong bộ nhớ nhanh chóng truy cập từ tất cả các máy chủ trong phiên trực tiếp. Kho lưu trữ bộ nhớ thích hợp cho dữ liệu thay đổi thường xuyên và tạm thời mà không cần phải bền vững, bởi vì chúng nhanh hơn để truy cập và biến mất khi đạt đến tuổi thọ tối đa.Đối với dữ liệu cần duy trì qua các phiên, sử dụng cửa hàng dữ liệu.

Cấu trúc dữ liệu

Thay vì truy cập trực tiếp vào dữ liệu thô, các kho nhớ có ba cấu trúc dữ liệu thô sơ được chia sẻ giữa các máy chủ để xử lý nhanh: bản đồ sắp xếp , hàng đợibản đồ hash .Mỗi cấu trúc dữ liệu là một phù hợp tốt cho một số trường hợp sử dụng:

  • Kết hợp dựa trên kỹ năng - Lưu thông tin người dùng, chẳng hạn như cấp độ kỹ năng, trong một hàng đợi chung giữa các máy chủ, và sử dụng máy chủ sảnh để chạy kết hợp hàng tuần.
  • Giao dịch và đấu thầu giữa các máy chủ - Bật giao dịch toàn diện giữa các máy chủ khác nhau, nơi người dùng có thể đấu thầu các mặt hàng có giá thay đổi theo thời gian thực, với một bản đồ chìa khóa-giá trị được sắp xếp.
  • Bảng xếp hạng toàn cầu - Lưu và cập nhật xếp hạng người dùng trên một bảng xếp hạng chung bên trong một bản đồ được sắp xếp theo thứ tự .
  • Túi đồ chung - Lưu các mục tồn kho và thống kê trong một bản đồ hash chung , nơi người dùng có thể sử dụng các mục tồn kho cùng lúc với nhau.
  • Lưu trữ bộ nhớ cho dữ liệu vĩnh viễn - Sao lưu và sao chép dữ liệu vĩnh viễn của bạn vào kho lưu trữ dữ liệu thành một bản đồ bộ nhớ có thể hoạt động như một bộ nhớ và cải thiện hiệu lựcsuất trải nghiệm của bạn.

Nói phổ quát, nếu bạn cần truy cập dữ liệu dựa trên một chìa khóa cụ thể, hãy sử dụng bản đồ hash.Nếu bạn cần dữ liệu được đặt hàng, hãy sử dụng bản đồ được sắp xếp.Nếu bạn cần xử lý dữ liệu theo một trật tự cụ thể, hãy sử dụng hàng đợi.

Giới hạn và quota

Để duy trì khả năng mở rộng và hiệu hiệu lựchệ thống, các kho lưu trữ bộ nhớ có quota sử dụng dữ liệu cho kích thước bộ nhớ, yêu cầu API và kích thước cấu trúc dữ liệu.

Kho lưu trữ bộ nhớ có chính sách thu hồi dựa trên thời gian hết hạn, cũng được gọi là thời gian sống (TTL).Các mục bị trục xuất sau khi hết hạn và quota bộ nhớ được giải phóng cho các lượt truy cập mới.Khi bạn đạt đến giới hạn bộ nhớ, tất cả các yêu cầu ghi tiếp theo sẽ thất bại cho đến khi các mục hết hạn hoặc bạn thủ công xóa chúng.

Giới hạn kích thước bộ nhớ

Giới hạn quota bộ nhớ giới hạn tổng số bộ nhớ mà một trải nghiệm có thể tiêu thụ.Nó không phải là một giá trị cố định.Thay vào đó, nó thay đổi theo thời gian tùy thuộc vào số lượng người dùng trong trải nghiệm theo công thức sau: 64KB + 1KB * [số lượng người dùng] .Quota áp dụng trên cấp độ trải nghiệm thay vì cấp độ máy chủ.

Khi người dùng tham gia trải nghiệm, quota bộ nhớ bổ sung sẵn ngay lập tức.Khi người dùng rời khỏi trải nghiệm, quota không giảm ngay lập tức.Có một khoảng thời gian truy xuất lại trong vòng tám ngày trước khi quota đánh giá lại với giá trị thấp hơn.

Sau khi trải nghiệm của bạn đạt đến giới hạn kích thước bộ nhớ, bất kỳ yêu cầu API nào tăng kích thước bộ nhớ luôn thất bại.Yêu cầu giảm hoặc không thay đổi kích thước bộ nhớ vẫn thành công.

Với bảng điều khiển quan sát thời gian thực, bạn có thể xem quota kích thước bộ nhớ của trải nghiệm của bạn trong thời gian thực bằng biểu đồ Sử dụng bộ nhớ .

Giới hạn yêu cầu API

Đối với giới hạn yêu cầu API, có một quota yêu cầu đơn vị áp dụng cho tất cả các cuộc gọi API MemoryStoreService.Quota là 1000 + 100* [number of concurrent users] đơn vị yêu cầu mỗi phút.

Hầu hết các cuộc gọi API chỉ tiêu thụ một đơn vị yêu cầu, với một vài ngoại lệ:

  • MemoryStoreSortedMap:GetRangeAsync()

    Tiêu thụ các đơn vị dựa trên số lượng vật phẩm trả về.Ví dụ, nếu phương pháp này trả về 10 vật phẩm, cuộc gọi được tính là 10 đơn vị yêu cầu.Nếu nó trả lại một phản hồi trống, nó được tính là một đơn vị yêu cầu.

  • MemoryStoreQueue:ReadAsync()

    Tiêu thụ các đơn vị dựa trên số lượng vật phẩm được trả về, giống như MemoryStoreSortedMap:GetRangeAsync() , nhưng tiêu thụ thêm một đơn vị mỗi hai giây trong lúc đọc.Xác định thời gian đọc tối đa với tham số waitTimeout.

  • MemoryStoreHashMap:UpdateAsync()

    Tiêu thụ tối thiểu hai đơn vị.

  • MemoryStoreHashMap:ListItemsAsync()

    Tiêu thụ [number of partitions scanned] + [items returned] đơn vị.

Tiêu chuẩn yêu cầu cũng được áp dụng trên cấp trải nghiệm thay vì cấp máy chủ.Điều này cung cấp sự linh hoạt để phân bổ các yêu cầu giữa các máy chủ miễn là tỷ lệ yêu cầu tổng không vượt quá giới hạn.Nếu bạn vượt quá giới hạn, bạn nhận được một phản hồi lỗi khi dịch vụ giới hạn các yêu cầu của bạn.

Với tính năng quan sát có sẵn, bạn có thể xem quota yêu cầu của trải nghiệm của bạn trong thời gian thực.

Giới hạn kích thước cấu trúc dữ liệu

Đối với một bản đồ hoặc hàng đợi duy nhất được sắp xếp, các giới hạn kích thước và số lượng vật phẩm sau đây áp dụng:

  • Số lượng tối đa của các mục: 1,000,000
  • Kích cỡ tổng lớn nhất (bao gồm cả chìa khóa cho bản đồ được sắp xếp): 100 MB

Giới hạn cho mỗi phân vùng

Xem giới hạn mỗi phân vùng .

Tốt nhất các thực hành

Để giữ cho mẫu sử dụng bộ nhớ của bạn tối ưu và tránh việc đạt tới giới hạn , hãy làm theo các tốt nhất sau đây:

  • Loại bỏ các mục đã xử lý.: Luôn luôn xóa các mục đã đọc bằng cách sử dụng phương pháp MemoryStoreQueue:RemoveAsync() cho hàng đợi và MemoryStoreSortedMap:RemoveAsync() cho bản đồ được sắp xếp có thể giải phóng bộ nhớ và giữ cho cấu trúc dữ liệu được cập nhật.

  • Đặt thời gian hết hạn về thời gian ngắn nhất có thể khi thêm dữ liệu.: Mặc dù thời gian hết hạn mặc định là 45 ngày cho cả MemoryStoreQueue:AddAsync()MemoryStoreSortedMap:SetAsync(), nhưng việc đặt thời gian ngắn nhất có thể sẽ tự động xóa dữ liệu cũ để ngăn chặn chúng không làm đầy quota sử dụng bộ nhớ của bạn.

    • Không lưu trữ một lượng lớn dữ liệu với thời hạn hết hạn dài, vì nó có nguy cơ vượt quá quota bộ nhớ của bạn và có thể gây ra các vấn đề có thể làm hỏng toàn bộ trải nghiệm của bạn.
    • Luôn luôn xóa các vật phẩm không cần thiết hoặc đặt thời hạn ngắn cho vật phẩm.
    • Nói chung, bạn nên sử dụng xóa rõ ràng để giải phóng bộ nhớ và hết hạn của vật phẩm như một cơ chế an toàn để ngăn chặn các vật phẩm chưa sử dụng chiếm bộ nhớ trong một thời gian dài.
  • Chỉ giữ các giá trị cần thiết trong bộ nhớ.

    Ví dụ, đối với trải nghiệm nhà đấu giá, bạn chỉ cần duy trì lời đề nghị cao nhất.Bạn có thể sử dụng MemoryStoreSortedMap:UpdateAsync() trên một phím để giữ mức giá cao nhất thay vì giữ tất cả các lời đề nghị trong cấu trúc dữ liệu của bạn.

  • Sử dụng quay lại exponential để giúp giữ dưới giới hạn yêu cầu API.

    Ví dụ, nếu bạn nhận được một DataUpdateConflict, bạn có thể thử lại sau hai giây, sau đó là bốn, tám, v.v.thay vì liên tục gửi yêu cầu đến MemoryStoreService để có được phản hồi chính xác.

  • Chia cấu trúc dữ liệu khổng lồ thành nhiều cấu trúc nhỏ hơn bằng cách phân mảnh.

    Thường dễ dàng quản lý dữ liệu trong cấu trúc nhỏ hơn là lưu trữ tất cả mọi thứ trong một cấu trúc dữ liệu lớn.Cách tiếp cận này cũng có thể giúp tránh sử dụng và giới hạn tỷ lệ.Ví dụ, nếu bạn có bản đồ được sắp xếp sử dụng chữ đầu cho các chìa khóa của nó, hãy xem xét tách mỗi chữ đầu thành bản đồ được sắp xếp riêng của nó.Đối với một trải nghiệm đặc biệt phổ biến, bạn thậm chí có thể chia người dùng thành nhiều bản đồ dựa trên những chữ số cuối cùng của ID người dùng của họ.

  • Nén các giá trị lưu trữ.

    Ví dụ, hãy xem xét sử dụng算法 LZW để giảm kích thước giá trị lưu trữ.

Khả năng quan sát

Bảng điều khiển Quan sát năng lực cung cấp cái nhìn sâu sắc và phân tích cho việc theo dõi và giải quyết các vấn đề sử dụng kho lưu trữ bộ nhớ của bạn.Với biểu đồ cập nhật thời gian thực về các khía cạnh khác nhau của sử dụng bộ nhớ và yêu cầu API, bạn có thể theo dõi mô hình sử dụng bộ nhớ của trải nghiệm của bạn, xem quota hiện tại được gán, theo dõi tình trạng tháiAPI và xác định các vấn đề tiềm ẩn để tối ưu hóa hiệu suất.

Bảng sau đây liệt kê và mô tả tất cả các mã trạng thái của API phản hồi có sẵn trên bảng Yêu cầu theo trạng tháiYêu cầu bởi API x Tình trạng của Bảng Quan sát.Để biết thêm thông tin về cách giải quyết các lỗi này, xem Giải quyết sự cố .Đối với quota hoặc giới hạn cụ thể mà lỗi liên quan, xem Giới hạn và quota .

Mã trạng mãMô tả
Thành côngThành công.
DataStructureMemoryOverLimit của Thời gian giới hạnVượt giới hạn kích thước bộ nhớ cấu trúc dữ liệu (100MB).
Xung đột cập nhật dữ liệuXung đột do cập nhật cùng lúc.
Truy cập bị từ chốiKhông được phép truy cập dữ liệu kinh nghiệm. Yêu cầu này không tiêu thụ đơn vị yêu cầu hoặc sử dụng quota.
Lỗi nội bộLỗi nội bộ.
Yêu cầu không hợp lệYêu cầu không có thông tin cần thiết hoặc có thông tin bị sai hình thức.
Vật phẩm cấu trúc dữ liệu vượt giới hạnVượt giới hạn số lượng mục cấu trúc dữ liệu (1M).
Không tìm thấy mụcKhông có mục nào được tìm thấy trong MemoryStoreQueue:ReadAsync() hoặc MemoryStoreSortedMap:UpdateAsync() . ReadAsync() khảo sát mỗi 2 giây và trả lại mã trạng thái này cho đến khi tìm thấy các mục trong hàng đợi.
Yêu cầu cấu trúc dữ liệu quá giới hạnVượt giới hạn yêu cầu cấp cấu trúc dữ liệu (100,000 yêu cầu mỗi phút).
Yêu cầu phân chia vượt giới hạnVượt giới hạn yêu cầu phân vùng.
Tổng yêu cầu vượt giới hạnVượt giới hạn đơn vị yêu cầu cấp vũ trụ.
Tổng lượng bộ nhớ vượt giới hạnVượt quá giới hạn bộ nhớ cấp vũ trụ.
Giá trị của vật phẩm quá lớnKích thước giá trị vượt quá giới hạn (32KB).

Bảng sau đây liệt kê mã trạng thái từ phía khách hàng, hiện không có sẵn trên Bảng điều khiển Quan sát khả năng.

Mã trạng mãMô tả
Lỗi nội bộLỗi nội bộ.
Vị trí chưa xuất bảnBạn phải xuất bản nơi này để sử dụng MemoryStoreService.
Truy cập khách hàng không hợp lệDịch vụ MemoryStore phải được gọi từ máy chủ.
Thời gian hết hạn không hợp lệThời gian 'expiration' phải nằm giữa 0 và 3,888,000.
Yêu cầu không hợp lệKhông thể chuyển đổi giá trị thành json.
Yêu cầu không hợp lệKhông thể chuyển đổi sortKey thành số hoặc chuỗi hợp lệ.
Biến thể cuộc gọi thất bạiTransformCallbackFailedKhông thể kích hoạt chức năng gọi lại biến đổi.
Yêu cầu bị giới hạnCác yêu cầu gần đây của MemoryStores bị giới hạn một hoặc nhiều giới hạn.
Xung đột cập nhậtVượt quá số lần thử lại tối đa.

Gỡ rào chắn

Bảng sau đây liệt kê và mô tả giải pháp được đề xuất cho mỗi mã trạng thái phản hồi:

LỗiCách giải quyết vấn đề
Yêu cầu cấu trúc dữ liệu vượt giới hạn / Yêu cầu phân chia vượt giới hạn

  • Thêm một bộ nhớ đệm địa phương bằng cách lưu thông tin vào biến khác và kiểm tra lại sau một khoảng thời gian nhất định, chẳng hạn như 30 giây.:
  • Sử dụng biểu đồ Số lượng yêu cầu theo tình trạng để xác minh rằng bạn đang nhận được nhiều Phản hồi thành công hơn NoItemFounds .Giới hạn số lần bạn đánh MemoryStoreService với một yêu cầu thất bại.:
  • Thực hiện một khoảng chờ ngắn giữa các yêu cầu.:
  • Theo dõi các tốt nhất thực hành
  • , bao gồm:

    • Phân mảnh cấu trúc dữ liệu của bạn nếu bạn nhận được một lượng lớn Yêu cầu cấu trúc dữ liệu quá giới hạn / Yêu cầu phân mảnh quá giới hạn phản hồi.:
    • Thực hiện một sự lùi trở lại exponential để tìm một tỷ lệ hợp lý các yêu cầu để gửi.
Tổng yêu cầu vượt giới hạn
Vật phẩm cấu trúc dữ liệu vượt giới hạn
  • Áp dụng tốt nhất thực hành trên giảm kích thước bộ nhớ.
DataStructureMemoryOverLimit của Thời gian giới hạn
Tổng lượng bộ nhớ vượt giới hạn
Xung đột cập nhật dữ liệu
  • Thực hiện một khoảng trễ ngắn giữa các yêu cầu để tránh nhiều yêu cầu cập nhật cùng một chìa khóa cùng một lúc.:
  • Đối với bản đồ được sắp xếp, sử dụng chức năng trả lại trên phương pháp MemoryStoreSortedMap:UpdateAsync() để huỷ yêu cầu sau một số lần thử nhất định, như mẫu mã sau đây cho thấy:
  • Example of Aborting Request

    local MemoryStoreService = game:GetService("MemoryStoreService")
    local map = MemoryStoreService:GetSortedMap("AuctionItems")
    function placeBid(itemKey, bidAmount)
    map:UpdateAsync(itemKey, function(item)
    item = item or { highestBid = 0 }
    if item.highestBid < bidAmount then
    item.highestBid = bidAmount
    return item
    end
    print("item is "..item.highestBid)
    return nil
    end, 1000)
    end
    placeBid("MyItem", 50)
    placeBid("MyItem", 40)
    print("done")
  • Thử xem bạn có gọi MemoryStoreService hiệu quả không để tránh xung đột.Tốt nhất, bạn không nên gửi quá nhiều yêu cầu.:
  • Loại bỏ các mục một cách nhất quán một khi chúng được đọc bằng cách sử dụng phương pháp MemoryStoreQueue:RemoveAsync() cho hàng đợi và MemoryStoreSortedMap:RemoveAsync() cho bản đồ được sắp xếp.
Lỗi nội bộ
  • Kiểm tra trang trạng thái Roblox.
  • Gửi báo cáo lỗi mô tả vấn đề với ID Vũ trụ của trải nghiệm của bạn.
Yêu cầu không hợp lệ
  • Hãy chắc chắn rằng bạn bao gồm các tham số chính xác và hợp lệ trong yêu cầu của bạn. Ví dụ về các tham số không hợp lệ bao gồm:
    • Một chuỗi trống
    • Một chuỗi vượt giới hạn chiều dài
    • >

Giá trị của vật phẩm quá lớn
  • Phân mảnh hoặc chia giá trị của vật phẩm thành nhiều chìa khóa.
    • Để tổ chức các nhóm chìa khóa, sắp xếp chúng theo thứ tự bảng chữ cái bằng cách thêm một prefix vào chìa khóa.
    • >

  • Mã hóa hoặc nén các giá trị lưu trữ.

Thử nghiệm và gỡ lỗi trong Studio

Dữ liệu trong MemoryStoreService được cách ly giữa Studio và sản xuất, vì vậy việc thay đổi dữ liệu trong Studio không ảnh hưởng đến hành vi sản xuất.Điều này có nghĩa là các cuộc gọi API từ Studio không truy cập dữ liệu sản xuất, cho phép bạn thử nghiệm an toàn kho lưu trữ bộ nhớ và các tính năng mới trước khi chuyển sang sản xuất.

Thử nghiệm studio có cùng giới hạn và quota như sản xuất.Đối với quota được tính dựa trên số lượng người dùng, quota kết quả có thể rất nhỏ bởi vì bạn là người dùng duy nhất để thử nghiệm Studio.Khi kiểm tra từ Studio, bạn cũng có thể nhận thấy độ trễ và tỷ lệ lỗi nhẹ hơn so với việc sử dụng trong sản xuất do một số kiểm tra bổ sung được thực hiện để xác minh quyền truy cập và quyền hạn.

Đối với thông tin về cách gỡ lỗi kho lưu trữ bộ nhớ trên các trải nghiệm trực tiếp hoặc khi thử nghiệm trong studio, hãy sử dụng Bảng điều khiển nhà phát triển.