ratecounter.go (712B)
1 package ratecounter 2 3 import ( 4 "sync/atomic" 5 "time" 6 ) 7 8 type RateCounter struct { 9 currTime int64 10 prevTime int64 11 curr int64 12 prev int64 13 } 14 15 func NewRateCounter() *RateCounter { 16 return &RateCounter{} 17 } 18 19 func (r *RateCounter) Incr() { 20 now := time.Now().Unix() 21 currTime := atomic.LoadInt64(&r.currTime) 22 if currTime == now { 23 atomic.AddInt64(&r.curr, 1) 24 return 25 } 26 curr := atomic.LoadInt64(&r.curr) 27 atomic.StoreInt64(&r.prevTime, currTime) 28 atomic.StoreInt64(&r.prev, curr) 29 atomic.StoreInt64(&r.curr, 1) 30 atomic.StoreInt64(&r.currTime, now) 31 } 32 33 func (r *RateCounter) Rate() int64 { 34 n := time.Now().Unix() 35 if atomic.LoadInt64(&r.prevTime) == n-1 { 36 return atomic.LoadInt64(&r.prev) 37 } 38 return 0 39 }