diff --git a/src/main/java/com/ljsd/controller/GetUserController.java b/src/main/java/com/ljsd/controller/GetUserController.java index c9bb2c1..ccb2569 100644 --- a/src/main/java/com/ljsd/controller/GetUserController.java +++ b/src/main/java/com/ljsd/controller/GetUserController.java @@ -149,25 +149,34 @@ public class GetUserController extends HttpServlet { } int uid = 0; + //加分布式锁 List userInfos = BaseGlobal.getInstance().mongoDBPool.find(_COLLECTION_NAME, dbObject); - if (userInfos.size() == 0) { - DBObject next = server_info.iterator().next(); - Object register_state = next.get("register_state"); - if(register_state!=null&& register_state.equals("0")){ - returnErrorToFront(res,response,"该服务器已停止注册,请选择其他服务器游戏"); - return; + try{ + boolean getLock=false; + while(!getLock){ + getLock = BaseGlobal.getInstance().redisApp.tryGetDistributedLock(RedisKey.REGISTER_LOCK, "", "get", 800); + if (getLock&&userInfos.size() == 0) { + DBObject next = server_info.iterator().next(); + Object register_state = next.get("register_state"); + if(register_state!=null&& register_state.equals("0")){ + returnErrorToFront(res,response,"该服务器已停止注册,请选择其他服务器游戏"); + return; + } + uid = BaseGlobal.getInstance().mongoDBPool.inc("uid") + 10000000; + dbObject.put("uid", uid); + dbObject.put("_id", uid); + userInfos.add(dbObject); + if (gid != null && !gid.isEmpty()) { + dbObject.put("gid", gid); + } + if (pid != null && !pid.isEmpty()) { + dbObject.put("pid", pid); + } + BaseGlobal.getInstance().mongoDBPool.save(_COLLECTION_NAME, dbObject); + } } - uid = BaseGlobal.getInstance().mongoDBPool.inc("uid") + 10000000; - dbObject.put("uid", uid); - dbObject.put("_id", uid); - userInfos.add(dbObject); - if (gid != null && !gid.isEmpty()) { - dbObject.put("gid", gid); - } - if (pid != null && !pid.isEmpty()) { - dbObject.put("pid", pid); - } - BaseGlobal.getInstance().mongoDBPool.save(_COLLECTION_NAME, dbObject); + }finally { + BaseGlobal.getInstance().redisApp.releaseDistributedLock(RedisKey.REGISTER_LOCK,"","get"); } Random random = new Random(); int utoken = Math.abs(random.nextInt()); diff --git a/src/main/java/com/ljsd/redis/RedisKey.java b/src/main/java/com/ljsd/redis/RedisKey.java index dccc57d..2fc00d8 100644 --- a/src/main/java/com/ljsd/redis/RedisKey.java +++ b/src/main/java/com/ljsd/redis/RedisKey.java @@ -19,4 +19,6 @@ public interface RedisKey { * 根据openId 封号 */ String Ban_Open_Id = "Ban_Open_Id"; + + String REGISTER_LOCK = "REGISTER_LOCK"; }