初始化项目
This commit is contained in:
60
trunk/goutil/counter-util/counter.go
Normal file
60
trunk/goutil/counter-util/counter.go
Normal file
@@ -0,0 +1,60 @@
|
||||
package counter_util
|
||||
|
||||
import (
|
||||
"time"
|
||||
)
|
||||
|
||||
// CounterUtil
|
||||
// @description: 固定窗口计数器辅助类
|
||||
type CounterUtil struct {
|
||||
tag string // tag counter标识
|
||||
num int // num 当前计数
|
||||
warnNum int // warnNum 警告数量
|
||||
windowsTime time.Time // windowsTime 窗口时间
|
||||
checkSameWindowsFun func(t1, t2 time.Time) bool // checkSameWindowsFun 比较是否同一个时间窗口
|
||||
warnAction func(tag string, num int, t time.Time) // warnAction 监控回调方法
|
||||
}
|
||||
|
||||
// NewCounterUtil
|
||||
// @description: 构造计数器
|
||||
// parameter:
|
||||
// @_tag:tag标识,会在WarnAction中传递回来
|
||||
// @_warnNum:告警数量
|
||||
// @_checkWindowFun:比较是否同一个时间窗口
|
||||
// @_warnAction:指定数量触发回调
|
||||
// return:
|
||||
// @*CounterUtil:固定窗口计数器辅助类
|
||||
func NewCounterUtil(_tag string, _warnNum int, _checkWindowFun func(t1, t2 time.Time) bool, _warnAction func(tag string, num int, t time.Time)) *CounterUtil {
|
||||
r := &CounterUtil{
|
||||
tag: _tag,
|
||||
warnNum: _warnNum,
|
||||
windowsTime: time.Now(),
|
||||
checkSameWindowsFun: _checkWindowFun,
|
||||
warnAction: _warnAction,
|
||||
}
|
||||
|
||||
return r
|
||||
}
|
||||
|
||||
// AddNum
|
||||
// @description: 添加数量
|
||||
// parameter:
|
||||
// @receiver c:计数器
|
||||
// @n:增加的数量
|
||||
// return:
|
||||
// @int:计数器当前的数量
|
||||
func (c *CounterUtil) AddNum(n int) int {
|
||||
if !c.checkSameWindowsFun(c.windowsTime, time.Now()) {
|
||||
c.num = 0
|
||||
c.windowsTime = time.Now()
|
||||
}
|
||||
|
||||
// 增加次数
|
||||
c.num += n
|
||||
if c.num >= c.warnNum {
|
||||
c.warnAction(c.tag, c.num, time.Now())
|
||||
c.num = 0
|
||||
}
|
||||
|
||||
return c.num
|
||||
}
|
||||
33
trunk/goutil/counter-util/counter_test.go
Normal file
33
trunk/goutil/counter-util/counter_test.go
Normal file
@@ -0,0 +1,33 @@
|
||||
package counter_util
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestInfoLog(t *testing.T) {
|
||||
var iserr bool = true
|
||||
c := NewCounterUtil("test", 2, checkId, func(tag string, num int, ti time.Time) {
|
||||
msg := fmt.Sprintf("tag:%s 当前数量为num:%v ti:%v", tag, num, ti)
|
||||
if iserr {
|
||||
t.Error(msg)
|
||||
} else {
|
||||
t.Log(msg)
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
c.AddNum(1)
|
||||
iserr = false
|
||||
c.AddNum(1)
|
||||
time.Sleep(time.Second * 1)
|
||||
iserr = true
|
||||
c.AddNum(1)
|
||||
time.Sleep(time.Second * 1)
|
||||
c.AddNum(1)
|
||||
}
|
||||
|
||||
func checkId(t1, t2 time.Time) bool {
|
||||
return t1.Second() == t2.Second()
|
||||
}
|
||||
35
trunk/goutil/counter-util/readme.md
Normal file
35
trunk/goutil/counter-util/readme.md
Normal file
@@ -0,0 +1,35 @@
|
||||
### 窗口周期计数器
|
||||
窗口周期计数类,用于记录一个窗口周期数量,并且触发某个操作的场景。
|
||||
在下一个窗口周期会自动重置次数
|
||||
|
||||
#### =======================>使用方法说明<=========================
|
||||
|
||||
1.引入包
|
||||
2.构造对象并次有
|
||||
3.调用对象的增加次数方法
|
||||
|
||||
```go
|
||||
package demo
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"goutil/counter_util"
|
||||
)
|
||||
|
||||
func main() {
|
||||
// 构造名字叫test的,窗口间隔为1s,计数达到2就会触发警告的窗口计数器
|
||||
c := counter_util.NewCounterUtil("test", 2, checkId, func(tag string, num int, ti time.Time) {
|
||||
//自定义触发动作
|
||||
})
|
||||
|
||||
c.AddNum(1)
|
||||
c.AddNum(10)
|
||||
}
|
||||
|
||||
// 窗口周期设定为1s
|
||||
func checkId(t1, t2 time.Time) bool {
|
||||
return t1.Second() == t2.Second()
|
||||
}
|
||||
|
||||
```
|
||||
Reference in New Issue
Block a user