游戏开发 数据库ID设计 ID生成器
对于滚服游戏开发,数据库的ID设计非常重要,关乎到合服操作的复杂性。数据库ID设计得好,合服就相当简单。合服主要是数据的合并。把两个或多个单独的服务器数据合并到一个服里面。
数据库表设计是游戏开发中必不可少的,通常每一张表,我们都会设计一个ID主键字段,关于表ID的生成方式。这里我们选择根据区服ID及玩家数量自增,其他同学喜欢用UUID那就另说。
ID结构: 自增序列+四位区服号。
这里我们以区服ID作为基数,个位到千位是区服号,万位以上是玩家ID自增ID开始。如1区服即0001, 2区服是0002.
以玩家基础数据表的ID设计为例,如果以区服1为示例,那么ID结构是这样的:玩家自增序列+0001。即1区服的第1号玩家ID是:10001;1区服的第19876号玩家ID是:198760001。2区服的第1号玩家ID是:10002;2区服的第19876号玩家ID是:198760002。
这里说明一下,ID区服段为什么是个位到千位,而不是到万位呢?通常滚服开服区服数量不会太多,除非非常爆款的游戏。一般开到上千服已经很不错了。所以这里设计区服区间为1-9999个服。即ID基数是:0001-9999。
下面是实现这种结构ID设计的实例
以JAVA代码示例。
1. ID生成管理类 IdManager.java
初始化ID和生成新ID的实现。
@Service
public class IdManager {
private static final Logger logger = LogManager.getLogger(IdManager.class);
@Resource
private GameDBConfiguration gameServerConfiguration;
private final Map<String, Long> ids = new ConcurrentHashMap<>();
public void init() {
logger.info("id生成器开始。");
try {
Field[] declaredFields =