From 53736c02f923c58c87b5f258ca343d3d7e8d3a54 Mon Sep 17 00:00:00 2001 From: Yun Date: Sun, 3 May 2026 23:49:58 +0800 Subject: [PATCH] commit --- go.mod | 5 +++++ go.sum | 2 ++ ip_rate.go | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ readme.md | 13 ++++++++++++ 4 files changed, 78 insertions(+) create mode 100644 go.mod create mode 100644 go.sum create mode 100644 ip_rate.go create mode 100644 readme.md diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..a54fe98 --- /dev/null +++ b/go.mod @@ -0,0 +1,5 @@ +module code.yun.ink/pkg/limitx + +go 1.20 + +require golang.org/x/time v0.5.0 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..a2652c5 --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= diff --git a/ip_rate.go b/ip_rate.go new file mode 100644 index 0000000..44f878c --- /dev/null +++ b/ip_rate.go @@ -0,0 +1,58 @@ +package limiter + +import ( + "sync" + + "golang.org/x/time/rate" +) + +func init() { + SetupIpRateLimiter() +} + +type IpRateLimiter struct { + ips map[string]*rate.Limiter + mu *sync.RWMutex + r rate.Limit // float64 速率 1秒 + b int // 并发 1次请求 +} + +var RateLimiter *IpRateLimiter + +// 创建一个RateLimiter +func SetupIpRateLimiter() error { + var r rate.Limit = 10 + b := 1 + RateLimiter = &IpRateLimiter{ + ips: make(map[string]*rate.Limiter), + mu: &sync.RWMutex{}, + r: r, // 速率 + b: b, // 并发 + } + return nil +} + +// 添加一个ip到map +func (i *IpRateLimiter) AddIp(ip string) *rate.Limiter { + i.mu.Lock() + defer i.mu.Unlock() + + limiter := rate.NewLimiter(i.r, i.b) + i.ips[ip] = limiter + return limiter +} + +// 通过ip得到limiter +func (i *IpRateLimiter) GetLimiter(ip string) *rate.Limiter { + i.mu.Lock() + + limiter, exists := i.ips[ip] + if !exists { + i.mu.Unlock() + // 注意:这里面也上了锁,所以当前的锁要先释放,不然死锁 + return i.AddIp(ip) + } + // 这里不能忘 + i.mu.Unlock() + return limiter +} diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..d16ab02 --- /dev/null +++ b/readme.md @@ -0,0 +1,13 @@ + +# 目标 + +1. 滑动窗口 +2. 漏桶算法 +3. 令牌桶算法 + + + + + + +