简单版记数器限流算法

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")
        }
    }
}
添加新评论