Skip to content

Commit

Permalink
fix: 修改用户模块锁条件
Browse files Browse the repository at this point in the history
  • Loading branch information
danmuking committed Apr 22, 2024
1 parent 703bc27 commit a19ba7f
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 14 deletions.
5 changes: 3 additions & 2 deletions domain/enum/redsync.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package enum

const (
Lock = "lock:"
UserLock = Lock + "diting-user:"
Lock = "lock:"
UserLock = Lock + "diting-user:"
UserAndFriendLock = UserLock + "%d_%d"
)
7 changes: 4 additions & 3 deletions event/listener/friend_delete_event.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ import (
"github.com/pkg/errors"
"github.com/spf13/viper"
"sort"
"strconv"
)

func init() {
Expand Down Expand Up @@ -62,7 +61,9 @@ func deleteFriend(deleteFriendDto dto.DeleteFriendDto) error {
deleteFriendUid := deleteFriendDto.FriendUid

// 加锁
key := enum.UserLock + strconv.FormatInt(uid, 10)
uids := utils.Int64Slice{uid, deleteFriendUid}
sort.Sort(uids)
key := fmt.Sprintf(enum.UserAndFriendLock, uids[0], uids[1])
mutex, err := utils.GetLock(key)
if err != nil {
return err
Expand Down Expand Up @@ -98,7 +99,7 @@ func deleteFriend(deleteFriendDto dto.DeleteFriendDto) error {
// 软删除好友房间
roomFriend := global.Query.RoomFriend
roomFriendTx := tx.RoomFriend.WithContext(ctx)
uids := utils.Int64Slice{uid, deleteFriendUid}
uids = utils.Int64Slice{uid, deleteFriendUid}
sort.Sort(uids)
fun := func() (interface{}, error) {
return roomFriendTx.Where(roomFriend.Uid1.Eq(uids[0]), roomFriend.Uid2.Eq(uids[1])).First()
Expand Down
8 changes: 6 additions & 2 deletions event/listener/friend_new_event.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,11 @@ func friendNewEvent(ctx context.Context, ext ...*primitive.MessageExt) (consumer
func friendNew(userFriend model.UserFriend) error {
ctx := context.Background()

key := enum.UserLock + strconv.FormatInt(userFriend.UID, 10)
uid := userFriend.UID
friendUid := userFriend.FriendUID
uids := utils.Int64Slice{uid, friendUid}
sort.Sort(uids)
key := fmt.Sprintf(enum.UserAndFriendLock, uids[0], uids[1])
mutex, err := utils.GetLock(key)
if err != nil {
return err
Expand Down Expand Up @@ -93,7 +97,7 @@ func friendNew(userFriend model.UserFriend) error {
}

// 排序,uid小的在前
uids := utils.Int64Slice{userFriend.UID, userFriend.FriendUID}
uids = utils.Int64Slice{userFriend.UID, userFriend.FriendUID}
sort.Sort(uids)

//检查是否有软删除状态的记录
Expand Down
20 changes: 13 additions & 7 deletions service/friend_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,18 @@ import (
"github.com/pkg/errors"
"gorm.io/gorm"
"sort"
"strconv"
)

// ApplyFriendService 添加好友
// TODO:考虑软删除条件
func ApplyFriendService(uid int64, applyReq req.UserApplyReq) (resp.ResponseData, error) {
ctx := context.Background()
friendUid := applyReq.Uid
user := global.Query.User
userQ := user.WithContext(ctx)

key := domainEnum.UserLock + strconv.FormatInt(uid, 10)
uids := utils.Int64Slice{uid, friendUid}
sort.Sort(uids)
key := fmt.Sprintf(domainEnum.UserAndFriendLock, uids[0], uids[1])
mutex, err := utils.GetLock(key)
if err != nil {
return resp.ErrorResponseData("系统正忙,请稍后再试"), err
Expand Down Expand Up @@ -150,7 +150,10 @@ func IsFriend(uid, friendUid int64) (bool, error) {
}

func AgreeFriendService(uid, friendUid int64) (resp.ResponseData, error) {
key := domainEnum.UserLock + strconv.FormatInt(uid, 10)

uids := utils.Int64Slice{uid, friendUid}
sort.Sort(uids)
key := fmt.Sprintf(domainEnum.UserAndFriendLock, uids[0], uids[1])
mutex, err := utils.GetLock(key)
if err != nil {
return resp.ErrorResponseData("系统正忙,请稍后再试"), err
Expand Down Expand Up @@ -270,14 +273,17 @@ func AgreeFriend(uid, friendUid int64) error {
func DeleteFriendService(uid int64, deleteFriendReq req.DeleteFriendReq) (resp.ResponseData, error) {
ctx := context.Background()

key := domainEnum.UserLock + strconv.FormatInt(uid, 10)
deleteFriendUid := deleteFriendReq.Uid

uids := utils.Int64Slice{uid, deleteFriendUid}
sort.Sort(uids)
key := fmt.Sprintf(domainEnum.UserAndFriendLock, uids[0], uids[1])
mutex, err := utils.GetLock(key)
if err != nil {
return resp.ErrorResponseData("系统正忙,请稍后再试"), err
}
defer utils.ReleaseLock(mutex)

deleteFriendUid := deleteFriendReq.Uid
// 判断是否为好友
isFriend, err := IsFriend(uid, deleteFriendUid)
if err != nil {
Expand Down Expand Up @@ -316,7 +322,7 @@ func DeleteFriendService(uid int64, deleteFriendReq req.DeleteFriendReq) (resp.R
// 删除会话
roomFriend := global.Query.RoomFriend
roomFriendTx := tx.RoomFriend.WithContext(ctx)
uids := utils.Int64Slice{uid, deleteFriendUid}
uids = utils.Int64Slice{uid, deleteFriendUid}
sort.Sort(uids)
fun := func() (interface{}, error) {
return roomFriendTx.Where(roomFriend.Uid1.Eq(uids[0]), roomFriend.Uid2.Eq(uids[1])).First()
Expand Down

0 comments on commit a19ba7f

Please sign in to comment.