随着 MemoryStoreHashMap 数据结构的发布,Roblox 删除了单个数据结构的所有现有限制,并用一个全局的“每个分区”限流限制替代。确切的限制根据内部值和自动分区过程如何分配数据而波动,但一般来说,允许在限流之前有更高的使用量,特别是对于哈希映射。这个新限制使得跨所有数据结构灵活使用内存存储成为可能。
分区
MemoryStores API 将数据存储在 分区 上,这只是存储的一个细分。每当你将一个项目写入内存存储时,该项目只存储在一个分区上。分区完全由 MemoryStores API 管理;你不需要自己管理它们。
分区分配
分区存储因项目存储的数据结构而异。对于已排序的映射和队列,每个数据结构被分配一个单一的分区。
例如,考虑一个有序图 PlayerScores 和一个等待玩游戏的玩家队列 PlayerLine 的嘉年华游戏:

与已排序的映射和队列不同,哈希映射被分配多个分区,并且数据会自动分配到这些分区中。如果你添加一个名为 Prizes 的哈希映射,分区可能看起来是这样的:

注意哈希映射存在于所有分区中,每个分区都有一些项目的子集。
限制
具有每个分区限制可以提高所有数据结构的吞吐量。它也有利于哈希映射,因为它们分布在所有分区中。
例如,考虑一个每个分区限制为每分钟 50,000 次请求 (RPM) 的示例:
- 在最理想的情况下,已排序的映射和队列被限制在 50,000 RPM,因为它们各自只存在于一个分区上。
- 对哈希映射的请求在项目键之间分散,而这些键又分散在分区中,因此哈希映射在限流之前可以有更高的有效限制,通常是其他数据结构的多倍,前提是请求在多个项目键之间分散。
- 尽管哈希映射可以通过在分区之间分散请求来实现更高的整体吞吐量,但单个项目键仍限速以维持系统稳定性。如果大多数流量集中在单个项目键上,该键可能仍然会受到限流。
- 为了有效扩展并避免这些每个键的限制,实施键分片。均匀地在多个项目键之间分散读写,以减少瓶颈并保持平稳性能。

因此,如果你不需要排序或“先进先出”的功能,哈希映射通常是内存存储数据结构的最佳选择。有关更多信息,请参阅 最佳实践。