diff --git a/common/utils.go b/common/utils.go index eb6678a..d540c2e 100644 --- a/common/utils.go +++ b/common/utils.go @@ -236,3 +236,8 @@ func StringToByteSlice(s string) []byte { tmp2 := [3]uintptr{tmp1[0], tmp1[1], tmp1[1]} return *(*[]byte)(unsafe.Pointer(&tmp2)) } + +func RandomSleep() { + // Sleep for 0-3000 ms + time.Sleep(time.Duration(rand.Intn(3000)) * time.Millisecond) +} diff --git a/controller/user.go b/controller/user.go index f38aeb7..309ce49 100644 --- a/controller/user.go +++ b/controller/user.go @@ -7,6 +7,7 @@ import ( "one-api/common" "one-api/model" "strconv" + "sync" "github.com/gin-contrib/sessions" "github.com/gin-gonic/gin" @@ -789,7 +790,11 @@ type topUpRequest struct { Key string `json:"key"` } +var lock = sync.Mutex{} + func TopUp(c *gin.Context) { + lock.Lock() + defer lock.Unlock() req := topUpRequest{} err := c.ShouldBindJSON(&req) if err != nil { diff --git a/model/redemption.go b/model/redemption.go index 122661f..00ec76b 100644 --- a/model/redemption.go +++ b/model/redemption.go @@ -56,7 +56,7 @@ func Redeem(key string, userId int) (quota int, err error) { if common.UsingPostgreSQL { keyCol = `"key"` } - + common.RandomSleep() err = DB.Transaction(func(tx *gorm.DB) error { err := tx.Set("gorm:query_option", "FOR UPDATE").Where(keyCol+" = ?", key).First(redemption).Error if err != nil {