From 019264c811a521d3309c811345caadfeb536c916 Mon Sep 17 00:00:00 2001 From: 王家文 Date: Mon, 22 Apr 2024 18:59:03 +0800 Subject: [PATCH] feat✨:房间排行活动:数据操作添加分布式锁 --- service/roomrank/consts.go | 4 ++++ service/roomrank/handle.go | 16 ++++++++++++++++ service/roomrank/logic.go | 5 +++++ 3 files changed, 25 insertions(+), 0 deletions(-) diff --git a/service/roomrank/consts.go b/service/roomrank/consts.go index 8724ebd..6c13f36 100644 --- a/service/roomrank/consts.go +++ b/service/roomrank/consts.go @@ -1,9 +1,13 @@ package roomrank +import "time" + const ( UserClassMin = 1 // 最小评级 UserClassMax = 5 // 最大评级 RoomCloseSecond = 180 // 房间关闭时间 RoomResetRobotSecond = 300 // 改变机器人分数并重新排序的间隔时间 + + RoomLockMillisecond = 3000 * time.Millisecond // 分布式锁时长 3秒 ) diff --git a/service/roomrank/handle.go b/service/roomrank/handle.go index a23751d..275c6ee 100644 --- a/service/roomrank/handle.go +++ b/service/roomrank/handle.go @@ -5,6 +5,7 @@ import ( "apigame/models" "apigame/service-common/svmysql" "apigame/service/code-msg" + "apigame/util/zredislock" "fmt" ) @@ -53,6 +54,11 @@ func HandleInfo(req *models.ReqRoomRankInfo) (code string, rsp models.RspRoomRan player.Name = req.PlayerName player.Icon = req.PlayerIcon + // 采用分布式锁 + lockKey := getLockKey(gameId, config.Id) + lock := zredislock.Obtain(lockKey, RoomLockMillisecond, nil) + defer lock.Release() + // 尝试判断结算 hasSettleChange := TrySettle(gameId, player, config) @@ -107,6 +113,11 @@ func HandleGetSettleAward(req *models.ReqRoomRankGetSettleAward) (code string, r player.Name = req.PlayerName player.Icon = req.PlayerIcon + // 采用分布式锁 + lockKey := getLockKey(gameId, config.Id) + lock := zredislock.Obtain(lockKey, RoomLockMillisecond, nil) + defer lock.Release() + // 尝试判断结算 _ = TrySettle(gameId, player, config) if !player.SettleHas { @@ -151,6 +162,11 @@ func HandleAddScore(req *models.ReqRoomRankAddScore) (code string, rsp models.Rs player.Name = req.PlayerName player.Icon = req.PlayerIcon + // 采用分布式锁 + lockKey := getLockKey(gameId, config.Id) + lock := zredislock.Obtain(lockKey, RoomLockMillisecond, nil) + defer lock.Release() + // 尝试判断结算 hasSettleChange := TrySettle(gameId, player, config) if hasSettleChange { diff --git a/service/roomrank/logic.go b/service/roomrank/logic.go index ecb9878..de50335 100644 --- a/service/roomrank/logic.go +++ b/service/roomrank/logic.go @@ -2,11 +2,16 @@ package roomrank import ( "apigame/configs/confroomrank" + "apigame/service-common/svconst" "apigame/util/utstring" "apigame/util/zjson" "fmt" ) +func getLockKey(gameId string, activityId int64) string { + return fmt.Sprintf("%s:lock:roomrank:%s:%d", svconst.REDIS_CACHEP_REFIX, gameId, activityId) +} + // TrySettle 尝试判断结算 func TrySettle(gameId string, player *Player, config *confroomrank.ActivityConfig) (hasChange bool) { hasChange = false -- libgit2 0.21.0