roblox-datastores

Use when implementing player data persistence in Roblox, saving/loading player stats or inventory, building leaderboards with ordered datastores, handling data migration between versions, diagnosing data loss issues, or adding auto-save and shutdown-safe data handling with DataStoreService.

By sentinelcore · 480 installs

npx skills add sentinelcore/roblox-skills --skill roblox-datastores

Source repository · Upstream listing

roblox datastores Reference for Roblox DataStoreService — saving, loading, and managing player data on the server. Quick Reference Method Signature Notes GetDataStore DSS:GetDataStore(name, scope?) Returns a GlobalDataStore GetOrderedDataStore DSS:GetOrderedDataStore(name, scope?) For leaderboards GetAsync store:GetAsync(key) Returns value or nil SetAsync store:SetAsync(key, value) No return value needed UpdateAsync store:UpdateAsync(key, fn) Atomic read modify write RemoveAsync store:RemoveAsync(key) Deletes key, returns old value GetSortedAsync orderedStore:GetSortedAsync(asc, pageSize) Returns DataStorePages Basic Setup Loading Data (GetAsync + pcall) Always wrap datastore calls in pcall . They can fail due to network issues or rate limits. Saving Data (SetAsync vs UpdateAsync) Use SetAsync for simple overwrites. Use UpdateAsync when the value must be based on the current stored value (e.g., incrementing a counter safely across servers). Retry Logic Auto Save: PlayerRemoving + BindToClose Server shutdown without BindToClose silently discards unsaved data. Ordered DataStores (Leaderboards) Values must be positive integers. Data Versioning / Migration Include a version field and migrate in the load path. Use a versioned datastore name ( PlayerData v2 ) for breaking schema changes. Common Mistakes Mistake Consequence Fix No pcall around datastore calls Unhandled error crashes the script Always wrap in pcall Saving on every Changed event Hits rate limits (60 + numPlayers×10 writes/min) Throttle; save on remove + periodic interval No BindToClose handler Data lost on server shutdown Always flush all sessions in BindToClose Giving default data on load failure Player silently loses progress Return nil on failure; kick or retry SetAsync for atomic counters Race condition across servers Use UpdateAsync for read modify write Storing Instances or functions Data silently drops Store only strings, numbers, booleans, plain tables Reusing datastore name after schema change Old shape clashes with new code Append v2 , v3 to name on breaking changes