Files
netease-modsdk-wiki/docs/mconline/60-我的世界创造营教程/网络游戏开服教程/4-性能优化建议/1-分布式服务器之间的数据同步.md
boybook 760c2dd9ad 2.6
2025-12-01 20:59:16 +08:00

58 lines
2.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 分布式服务器之间的数据同步
在了解了分布式技术假设服务器之后,如何在不同服务器之间共享数据,就成为了一个问题。
从插件数据的持久化部分来说,应该优先使用数据库,而不是本地文件进行数据保存。同时在需要时,对数据预先进行缓存。
开服工具2.0的服务器默认提供了3种数据库MySQL、Redis、MongoDB。开发者可以根据自己的开发习惯和数据的格式来选择更加合适的数据库来存储数据。如果自己更习惯的数据库不在这三者之中也可以自行或联系机房技术人员在服务器上安装其他数据库。
## 持久化
数据在持久化上应该优先考虑使用MySQL或MongoDB来进行数据存储。
推荐使用连接池来预先准备足够数量的连接,方便在需要时立刻取用。
可以使用的库例如
### MySQL
- [druid](https://github.com/alibaba/druid)
- [HikariCP](https://github.com/brettwooldridge/HikariCP)
### MongoDB
- [Mongo Java Driver](https://github.com/mongodb/mongo-java-driver/)
## 缓存
对于高频访问的数据,可以考虑使用内存或[Redis](https://redis.io/)进行存储,防止流量直击数据库,对数据库造成较大的压力。
对于Java可以使用[Jedis](https://github.com/redis/jedis)或[redisson](https://github.com/redisson/redisson)来创建并管理Redis连接池。
> 例如[RedisBungee](https://github.com/minecrafter/RedisBungee)插件就是利用Redis高速的特性通过Redis存储BungeeCord之间的玩家在线数据实现了数据同步。
## 分布式锁
在分布式服务器之间,经常会遇到需要争抢同一个资源的情况。
> 例如:交易市场功能
>
> 遇到此类情景时经常会遇到多个用户同时争抢购买同一个商品的功能为了防止同时对一个资源进行操作推荐使用Redis提供的分布式锁的功能。在尝试交易之前首先设置Redis的分布式锁抢锁成功后开始交易操作交易完成释放锁。
具体操作方法可以参考[官方文档](https://redis.io/docs/manual/patterns/distributed-locks/)。
## 订阅/发布
Redis还提供了订阅发布功能即Pub/Sub
如果要实现服务器之间的消息广播通信可以依赖Pub/Sub来实现。
> 例如全服喊话功能就可以在不同BC服之间订阅同一个频道来实现。
具体操作方法可以参考[官方文档](https://redis.io/docs/manual/pubsub/)。
## 消息队列
如果需要使用消息队列功能新版本Redis也同样提供了Streams接口来实现消息队列具体可以参考[官方文档](https://redis.io/docs/data-types/streams-tutorial/)。
如果Redis无法满足你的需求也可以自行或联系机房工作人员安装其他消息队列中间件。