Files
rootandClaude Opus 5 8679200f41 Initial commit
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 13:57:10 +08:00

81 lines
2.2 KiB
Go

package synclock
import (
"errors"
"fmt"
"time"
"91porn-server/common/redis"
)
const (
UserExtSyncLockFmt = "userExtSyncLock:%d" // 用户账户扩展信息
UserExtSyncLockExpire = 5 * time.Minute // 用户账户扩展信息 过期时间
UserAccountLockFmt = "UserAccountLockFmt:%d" // 用户账户
SpinLockExpire = 3 * time.Second
)
type Lock struct {
Lock *redis.Client
}
// UserExtSyncLock 通过redis按照用户ID加锁
func (l *Lock) UserExtcLock(userId uint32) bool {
v, e := l.Lock.Setnx_NewOK(fmt.Sprintf(UserExtSyncLockFmt, userId), true, UserExtSyncLockExpire)
if !v || e != nil {
return false
}
return true
}
// UserExtSpinLock 通过redis按照用户ID加锁
func (l *Lock) UserExtSpinLock(userId uint32, lockTimeOut time.Duration) (bool, error) {
endTime := time.Now().Add(lockTimeOut)
for time.Now().Before(endTime) {
value, err := l.Lock.Setnx_NewOK(fmt.Sprintf(UserExtSyncLockFmt, userId), true, UserExtSyncLockExpire)
if err != nil {
return false, errors.New("redis未启动")
}
if value {
return true, nil
}
time.Sleep(time.Millisecond)
}
return false, errors.New("用户操作繁忙")
}
// UserExtUnlock 按照用户ID释放锁
func (l *Lock) UserExtUnlock(userId uint32) {
_, _ = l.Lock.Del(fmt.Sprintf(UserExtSyncLockFmt, userId))
}
// UserAccountLock 通过redis按照用户ID加锁
func (l *Lock) UserAccountLock(userId uint32) bool {
v, e := l.Lock.Setnx_NewOK(fmt.Sprintf(UserAccountLockFmt, userId), true, UserExtSyncLockExpire)
if !v || e != nil {
return false
}
return true
}
// UserAccountSpinLock 通过redis按照用户ID加锁
func (l *Lock) UserAccountSpinLock(userId uint32, lockTimeOut time.Duration) (bool, error) {
endTime := time.Now().Add(lockTimeOut)
for time.Now().Before(endTime) {
value, err := l.Lock.Setnx_NewOK(fmt.Sprintf(UserAccountLockFmt, userId), true, UserExtSyncLockExpire)
if err != nil {
return false, errors.New("redis未启动")
}
if value {
return true, nil
}
time.Sleep(time.Millisecond)
}
return false, errors.New("用户操作繁忙")
}
// UserAccountUnlock 按照用户ID释放锁
func (l *Lock) UserAccountUnlock(userId uint32) {
_, _ = l.Lock.Del(fmt.Sprintf(UserAccountLockFmt, userId))
}