48 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			48 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package ratecheck
 | 
						||
 | 
						||
import (
 | 
						||
	"github.com/juju/ratelimit"
 | 
						||
	gocache "github.com/patrickmn/go-cache"
 | 
						||
	"go-admin/pkg/utility"
 | 
						||
	"time"
 | 
						||
)
 | 
						||
 | 
						||
var (
 | 
						||
	// Map of limiters with TTL
 | 
						||
	tokenBuckets       = gocache.New(120*time.Minute, 1*time.Minute)
 | 
						||
	userDur            = 1 * time.Second
 | 
						||
	userSize     int64 = 1
 | 
						||
 | 
						||
	orderDur = 20 * time.Second
 | 
						||
)
 | 
						||
 | 
						||
// CheckRateLimit 根据key检测,在规定时间内,是否超过访问次数,限流
 | 
						||
func CheckRateLimit(key string, duration time.Duration, size int64) bool {
 | 
						||
	if _, found := tokenBuckets.Get(key); !found {
 | 
						||
		tokenBuckets.Set(
 | 
						||
			key,
 | 
						||
			ratelimit.NewBucket(duration, size),
 | 
						||
			duration)
 | 
						||
	}
 | 
						||
	expiringMap, found := tokenBuckets.Get(key)
 | 
						||
	if !found {
 | 
						||
		return false
 | 
						||
	}
 | 
						||
	return expiringMap.(*ratelimit.Bucket).TakeAvailable(1) > 0
 | 
						||
}
 | 
						||
 | 
						||
// CheckUserRateLimit 根据key检测,在规定时间内,单个用户是否超过访问次数,限流,默认5秒1次请求
 | 
						||
func CheckUserRateLimit(userid int, methodName string) bool {
 | 
						||
	key := methodName + "-" + utility.IntTostring(userid)
 | 
						||
	return CheckRateLimit(key, userDur, userSize)
 | 
						||
}
 | 
						||
 | 
						||
// 检测订单成交是否重复推送
 | 
						||
func CheckOrderIdIsExist(tradeId string) bool {
 | 
						||
	_, found := tokenBuckets.Get(tradeId)
 | 
						||
	if !found {
 | 
						||
		tokenBuckets.Set(tradeId, true, orderDur)
 | 
						||
	}
 | 
						||
	return found
 | 
						||
}
 |