From f28de9e2266683d573fb5d77134a7892a3af9d28 Mon Sep 17 00:00:00 2001 From: lvxinran Date: Mon, 9 Aug 2021 14:14:07 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B3=A8=E5=86=8C=E5=88=86=E5=B8=83=E5=BC=8F?= =?UTF-8?q?=E9=94=81=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ljsd/controller/GetUserController.java | 43 +++++++++++-------- src/main/java/com/ljsd/redis/RedisKey.java | 2 + 2 files changed, 28 insertions(+), 17 deletions(-) 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"; }