package main
import (
"log"
"sync"
"time"
)
type RequestLimitSerivice struct {
Interval time.Duration
MaxCount int
RequestCount int
Lock sync.RWMutex
}
func (r *RequestLimitSerivice) Inscease(num int) {
r.Lock.Lock()
defer r.Lock.Unlock()
r.RequestCount += num
}
func (r *RequestLimitSerivice) IsMaximum() bool {
r.Lock.RLock()
defer r.Lock.RUnlock()
return r.MaxCount > r.RequestCount
}
func NewRequestLimitSerivice(maxCount int, interval time.Duration) *RequestLimitSerivice {
r := &RequestLimitSerivice{
Interval: interval,
MaxCount: maxCount,
}
go func() {
ticker := time.NewTicker(r.Interval)
for {
<-ticker.C
r.Lock.Lock()
r.RequestCount = 0
r.Lock.Unlock()
}
}()
return r
}
func main() {
r := NewRequestLimitSerivice(10, 1*time.Second)
for i := 0; i < 100000; i++ {
if r.IsMaximum() {
log.Println("达到最大值")
} else {
r.Inscease(1)
log.Println("doing")
}
}
}