SetAsync is never more appropriate than UpdateAsync, has nothing to do with single or multi player.
You should never save based on an action (table updates, player dies) as that can happen many times quickly and overflow the queue.
You should for multiple reasons always have a cache and save periodically.
- you’ll never run into request overflow and potential data loss
- if you use getasync when you want a value you can run into serious race condition bugs, that can be exploited (e.g. duplicating items)
I’m not sure what the copy is about you don’t need a copy, just use the table GetAsync returns
You use game:BindToClose, to run code before the server shuts down
personal recommendation
I use and recommend other people use ProfileService by loleris, it’s an extremely robust, nice abstraction for storing data, has full support from loleris (constantly being updated), easy solves things like race conditions because it’s session locked. I think most pros use it.