103 lines
3.0 KiB
Go
103 lines
3.0 KiB
Go
package synclock
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
"videoweb/pub/common/errors"
|
|
"videoweb/pub/redis"
|
|
)
|
|
|
|
const (
|
|
UserExtSyncLockFmt = "userExtSyncLock:%d" // 用户账户扩展信息
|
|
UserExtSyncLockExpire = 5 * time.Minute // 用户账户扩展信息 过期时间
|
|
|
|
UserAccountLockFmt = "UserAccountLockFmt:%d" // 用户账户
|
|
UserAccountLockExpire = 5 * time.Minute // 用户账户 过期时间
|
|
TraderAccountLockFmt = "TraderAccountLockFmt:%s" //商人账户
|
|
SpinLockExpire = 3 * time.Second
|
|
)
|
|
|
|
// UserExtSyncLock 通过redis按照用户ID加锁
|
|
func UserExtcLock(userId int64) bool {
|
|
v, e := redis.Setnx_NewOK(fmt.Sprintf(UserExtSyncLockFmt, userId), true, UserExtSyncLockExpire)
|
|
if !v || e != nil {
|
|
return false
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
// UserExtSpinLock 通过redis按照用户ID加锁
|
|
func UserExtSpinLock(userId int64, lockTimeOut time.Duration) (bool, error) {
|
|
endTime := time.Now().Add(lockTimeOut)
|
|
for time.Now().Before(endTime) {
|
|
value, err := redis.Setnx_NewOK(fmt.Sprintf(UserExtSyncLockFmt, userId), true, UserExtSyncLockExpire)
|
|
if err != nil {
|
|
return false, errors.MakeWithMsg(errors.RedisError, "redis未启动")
|
|
}
|
|
if value {
|
|
return true, nil
|
|
}
|
|
time.Sleep(time.Millisecond)
|
|
}
|
|
|
|
return false, errors.MakeWithMsg(errors.RedisError, "用户操作繁忙")
|
|
}
|
|
|
|
// UserExtUnlock 按照用户ID释放锁
|
|
func UserExtUnlock(userId int64) {
|
|
redis.Del(fmt.Sprintf(UserExtSyncLockFmt, userId))
|
|
}
|
|
|
|
// UserAccountLock 通过redis按照用户ID加锁
|
|
func UserAccountLock(userId int64) bool {
|
|
v, e := redis.Setnx_NewOK(fmt.Sprintf(UserAccountLockFmt, userId), true, UserExtSyncLockExpire)
|
|
if !v || e != nil {
|
|
return false
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
// UserAccountSpinLock 通过redis按照用户ID加锁
|
|
func UserAccountSpinLock(userId int64, lockTimeOut time.Duration) (bool, error) {
|
|
endTime := time.Now().Add(lockTimeOut)
|
|
for time.Now().Before(endTime) {
|
|
value, err := redis.Setnx_NewOK(fmt.Sprintf(UserAccountLockFmt, userId), true, UserExtSyncLockExpire)
|
|
if err != nil {
|
|
return false, errors.MakeWithMsg(errors.RedisError, "redis未启动")
|
|
}
|
|
if value {
|
|
return true, nil
|
|
}
|
|
time.Sleep(time.Millisecond)
|
|
}
|
|
return false, errors.MakeWithMsg(errors.RedisError, "用户操作繁忙")
|
|
}
|
|
|
|
// 通过redis按照商人ID加锁
|
|
func TraderAccountSpinLock(userId string, lockTimeOut time.Duration) (bool, error) {
|
|
endTime := time.Now().Add(lockTimeOut)
|
|
for time.Now().Before(endTime) {
|
|
value, err := redis.Setnx_NewOK(fmt.Sprintf(TraderAccountLockFmt, userId), true, SpinLockExpire)
|
|
if err != nil {
|
|
return false, errors.MakeWithMsg(errors.RedisError, "redis未启动")
|
|
}
|
|
if value {
|
|
return true, nil
|
|
}
|
|
time.Sleep(time.Millisecond)
|
|
}
|
|
return false, errors.MakeWithMsg(errors.RedisError, "用户操作繁忙")
|
|
}
|
|
|
|
// 按照商人ID释放锁
|
|
func TraderAccountUnlock(userId string) {
|
|
redis.Del(fmt.Sprintf(TraderAccountLockFmt, userId))
|
|
}
|
|
|
|
// UserAccountUnlock 按照用户ID释放锁
|
|
func UserAccountUnlock(userId int64) {
|
|
redis.Del(fmt.Sprintf(UserAccountLockFmt, userId))
|
|
}
|