// IP限流:防刷、高并发保护 package middleware import ( "simple-memo/global" "simple-memo/utils" "strconv" "time" "github.com/gin-gonic/gin" ) func Limiter() gin.HandlerFunc { return func(c *gin.Context) { key := "limiter:" + c.ClientIP() ctx := c.Request.Context() // 10秒内请求次数+1 global.Redis.Incr(ctx, key) global.Redis.Expire(ctx, key, 10*time.Second) // 转成数字再比较 countStr := global.Redis.Get(ctx, key).Val() count, _ := strconv.Atoi(countStr) // 10秒最多 100 次(正常开发完全够用) if count > 100 { utils.Fail(c, "请求过于频繁") c.Abort() return } c.Next() } }